BearParser
Portable Executable parsing library (from PE-bear)
ImportBaseDirWrapper.cpp
Go to the documentation of this file.
2
3//---------------------------------
4
6
7bool imports_util::isNameValid(Executable *pe, char* myName)
8{
9 if (!myName) return false; // do not parse, invalid entry
10 bufsize_t upperLimit = pe->getMaxSizeFromPtr((BYTE*) myName);
11 if (upperLimit == 0) return false;
12
13 bool isInvalid = pe_util::hasNonPrintable(myName, upperLimit);
14 if (isInvalid) return false;
15 if (pe_util::noWhiteCount(myName) == 0) return false;
16
17 return true;
18}
19//---------------------------------
20
21using namespace imports_util;
22
24 if (bits == Executable::BITS_32) return sizeof (uint32_t);
25 else if (bits == Executable::BITS_64) return sizeof (uint64_t);
26 return 0;
27}
28
29
30
32{
33 ImportBaseFuncWrapper* func = dynamic_cast<ImportBaseFuncWrapper*> (funcNode);
34 if (func == NULL) return;
35
36 offset_t via = func->callVia();
37 if (via == INVALID_ADDR) return;
38 /*
39 if (m_Exe->isValidVA(via)) {
40 via = m_Exe->VaToRva(via);
41 }*/
42 ImportBaseEntryWrapper* lib = dynamic_cast<ImportBaseEntryWrapper*>(func->getParentNode());
43 if (!lib) return;
44
45 this->thunksList.push_back(via);
46 size_t num = lib->getEntryId();
47 thunkToLibMap[via] = num;
48
49 num = func->getEntryId();
50 lib->thunkToFuncMap[via] = num;
51}
52
54{
55 thunksList.clear();
56 thunkToLibMap.clear();
57}
58
59
61{
63 size_t entriesCount = this->entries.size();
64
65 for (size_t i = 0; i < entriesCount; i++) {
66 ImportBaseEntryWrapper* lib = dynamic_cast<ImportBaseEntryWrapper*> (this->getEntryAt(i));
67 if (lib == NULL) continue;
68 size_t libId = lib->entryNum;
69
70 size_t funcCount = lib->getEntriesCount();
71 for (size_t fI = 0; fI < funcCount; fI++) {
72 addMapping(lib->getEntryAt(fI));
73 }
74 }
75}
76
78{
79 std::map<offset_t, size_t>::iterator libItr = thunkToLibMap.find(thunk);
80 if (libItr == thunkToLibMap.end()) return NULL;
81
82 size_t libId = libItr->second;
83 ImportBaseEntryWrapper* lib = dynamic_cast<ImportBaseEntryWrapper*>(this->getEntryAt(libId));
84 return lib;
85}
86
88{
90 if (!lib) return NULL;
91
92 std::map<offset_t, size_t>::iterator funcItr = lib->thunkToFuncMap.find(thunk);
93 if (funcItr == lib->thunkToFuncMap.end()) return NULL;
94
95 ImportBaseFuncWrapper* func = dynamic_cast<ImportBaseFuncWrapper*>(lib->getEntryAt(funcItr->second));
96 return func;
97}
98
100{
102 if (func == NULL) return "";
103
104 return func->getShortName();
105}
106
108{
110 if (!lib) return "";
111 return lib->getName();
112}
113
115{
116 clearMapping();
117 clear();
118
119 size_t oldCount = this->importsCount;
120 this->importsCount = 0;
121
122 if (!getDataDirectory()) {
123 return (oldCount != this->importsCount); //has count changed
124 }
125
126 const size_t LIMIT = (-1);
127
128 size_t cntr = 0;
129 for (cntr = 0; cntr < LIMIT; cntr++) {
130 if (loadNextEntry(cntr) == false) break;
131 }
132
133 this->importsCount = cntr;
134 return (oldCount != this->importsCount); //has count changed
135}
136
137//--------------------------------------------------------------------------------------------------------------
138
140{
141 char *libName = this->getLibraryName();
142 bool isValid = imports_util::isNameValid(m_Exe, libName);
143 return isValid;
144}
145
147{
148 clear();
149 thunkToFuncMap.clear();
150
151 const size_t LIMIT = (-1);
152 if (!isValid()) {
153 return false;
154 }
155 size_t cntr = 0;
156 if (this->getPtr() == NULL) {
157 return false;
158 }
159 for (cntr = 0; cntr < LIMIT; cntr++) {
160 if (loadNextEntry(cntr) == false) break;
161 }
162 //printf("Entries: %d\n", entries.size());
163 return true;
164}
165
166//--------------------------------------------------------------------------------------------------------------
168{
169 QString functionName;
170 if (isByOrdinal()) {
171 uint64_t val = getOrdinal();
172 static char buf[0xFF];
173 snprintf(buf, 0xFF, "<ord: %llX>", static_cast<unsigned long long>(val));
174 functionName = buf;
175 } else {
176 char *fName = this->getFunctionName();
177 if (!fName) return "";
178 functionName = fName;
179 }
180 return functionName;
181}
182
184{
185 QString functionName = getShortName();
187 if (!p) return functionName;
188
189 char *libName = p->getLibraryName();
190 if (!libName) return functionName;
191
192 functionName = "[" + QString(libName) + "]." + functionName;
193 return functionName;
194}
195
uint32_t bufsize_t
const offset_t INVALID_ADDR
uint64_t offset_t
bufsize_t getMaxSizeFromPtr(BYTE *ptr)
IMAGE_DATA_DIRECTORY * getDataDirectory()
virtual void * getPtr()=0
virtual QString getName()=0
virtual ExeNodeWrapper * getEntryAt(size_t fieldId)
std::vector< ExeNodeWrapper * > entries
size_t getEntryId()
virtual bool loadNextEntry(size_t entryNum)
virtual size_t getEntriesCount()
virtual void clear()
static bufsize_t thunkSize(Executable::exe_bits bits)
ImportBaseEntryWrapper * thunkToLib(offset_t thunk)
QList< offset_t > thunksList
QString thunkToFuncName(offset_t thunk)
std::map< offset_t, size_t > thunkToLibMap
QString thunkToLibName(offset_t thunk)
ImportBaseFuncWrapper * thunkToFunction(offset_t thunk)
void addMapping(ExeNodeWrapper *func)
static bufsize_t NameLenLimit
bool wrap()
bool isValid()
virtual char * getLibraryName()=0
std::map< offset_t, size_t > thunkToFuncMap
virtual uint64_t getOrdinal()=0
virtual char * getFunctionName()=0
virtual offset_t callVia()=0
virtual bool isByOrdinal()=0
virtual PENodeWrapper * getParentNode()
Definition: PENodeWrapper.h:33
bool isNameValid(Executable *pe, char *myName)
bool hasNonPrintable(const char *ptr, size_t maxInp)
Definition: Util.cpp:70
size_t noWhiteCount(char *buf, size_t bufSize)
Definition: Util.cpp:112