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