BearParser
Portable Executable parsing library (from PE-bear)
BoundImpDirWrapper.cpp
Go to the documentation of this file.
2 #include "pe/PEFile.h"
3 
5 
6 /*
7 typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
8  DWORD TimeDateStamp;
9  WORD OffsetModuleName;
10  WORD NumberOfModuleForwarderRefs;
11  // Array of zero or more IMAGE_BOUND_FORWARDER_REF follows
12 } IMAGE_BOUND_IMPORT_DESCRIPTOR, *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
13 
14 typedef struct _IMAGE_BOUND_FORWARDER_REF {
15  DWORD TimeDateStamp;
16  WORD OffsetModuleName;
17  WORD Reserved;
18 } IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
19 
20 */
21 
22 IMAGE_BOUND_IMPORT_DESCRIPTOR* BoundImpDirWrapper::boundImp()
23 {
25 
26  BYTE *ptr = m_Exe->getContentAt(rva, Executable::RVA, sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
27  if (ptr == NULL) return NULL;
28  return (IMAGE_BOUND_IMPORT_DESCRIPTOR*) ptr;
29 }
30 
31 bool BoundImpDirWrapper::loadNextEntry(size_t entryNum)
32 {
34  if (!imp || !imp->getPtr()) {
35  delete imp;
36  return false;
37  }
38  // TODO! do it in proper way!
39  bool isOk = false;
40  uint64_t offset = imp->getNumValue(BoundEntryWrapper::MODULE_NAME_OFFSET, &isOk);
41  if (!isOk || offset == 0) {
42  delete imp;
43  return false;
44  }
45  entries.push_back(imp);
46  return true;
47 }
48 
50 {
51  clear();
52  size_t oldCount = this->importsCount;
53  this->importsCount = 0;
54 
55  if (!getDataDirectory()) {
56  return (oldCount != this->importsCount); //has count changed
57  }
58 
59  const size_t LIMIT = BoundImpDirWrapper::EntriesLimit;
60 
61  size_t cntr = 0;
62  for (cntr = 0; cntr < LIMIT; cntr++) {
63  if (loadNextEntry(cntr) == false) break;
64  }
65 
66  this->importsCount = cntr;
67  return (oldCount != this->importsCount); //has count changed
68 }
69 
71 {
72  if (getPtr() == NULL) return 0;
73  bufsize_t entrySize = static_cast<bufsize_t>(sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
74  return entrySize * static_cast<bufsize_t>(this->entries.size());
75 }
76 
77 //-------------------------------------------------------------
78 
80 {
81  BoundImpDirWrapper* parent = dynamic_cast<BoundImpDirWrapper*> (this->getParentNode());
82  if (!parent) return NULL;
83 
84  IMAGE_BOUND_IMPORT_DESCRIPTOR* firstEntry = parent->boundImp();
85  if (firstEntry == NULL) return NULL;
86 
87  uint64_t descAddr = parent->getOffset(firstEntry);
88  if (descAddr == INVALID_ADDR) return NULL;
89 
90  uint64_t entryOffset = descAddr + (this->entryNum * sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
91  if (entryOffset == INVALID_ADDR) return NULL;
92 
93  BYTE *content = this->m_Exe->getContentAt(entryOffset, Executable::RAW, sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
94  if (!content) return NULL;
95 
96  return content;
97 }
98 
99 
101 {
102  if (getPtr() == NULL) return 0;
103  return sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR);
104 }
105 
107 {
108  char* name = getLibraryName();
109  if (!name) return "";
110  return QString(name);
111 }
112 
114 {
115  //----
116  BoundImpDirWrapper* parent = dynamic_cast<BoundImpDirWrapper*> (this->getParentNode());
117  if (!parent) return NULL;
118 
119  IMAGE_BOUND_IMPORT_DESCRIPTOR* firstEntry = parent->boundImp();
120  if (firstEntry == NULL) return NULL;
121 
122  uint64_t offset = this->getOffset(firstEntry);
123  if (offset == INVALID_ADDR) return NULL;
124  //----
125  IMAGE_BOUND_IMPORT_DESCRIPTOR* bImp = (IMAGE_BOUND_IMPORT_DESCRIPTOR*) this->getPtr();
126  if (bImp == NULL) return NULL;
127 
128  WORD mnOff = bImp->OffsetModuleName;
129 
130  offset += mnOff;
131 
132  char *ptr = (char*) m_Exe->getContentAt(offset, Executable::RAW, 1);
133  return ptr;
134 }
135 
136 void* BoundEntryWrapper::getFieldPtr(size_t fId, size_t subField)
137 {
138  BoundImpDirWrapper* parent = dynamic_cast<BoundImpDirWrapper*> (this->getParentNode());
139  if (!parent) return NULL;
140 
141  IMAGE_BOUND_IMPORT_DESCRIPTOR* bImp = (IMAGE_BOUND_IMPORT_DESCRIPTOR*) this->getPtr();
142  if (bImp == NULL) return NULL;
143 
144  switch (fId) {
145  case TIMESTAMP : return &bImp->TimeDateStamp;
146  case MODULE_NAME_OFFSET : return &bImp->OffsetModuleName;
147  case MODULE_FORWARDERS_NUM : return &bImp->NumberOfModuleForwarderRefs;
148  }
149  return this->getPtr();
150 }
151 
152 QString BoundEntryWrapper::getFieldName(size_t fieldId)
153 {
154  switch (fieldId) {
155  case TIMESTAMP : return "TimeDateStamp";
156  case MODULE_NAME_OFFSET : return "OffsetModuleName";
157  case MODULE_FORWARDERS_NUM : return "NumberOfModuleForwarderRefs";
158  }
159  return getName();
160 }
161 
uint32_t bufsize_t
const offset_t INVALID_ADDR
uint64_t offset_t
virtual void * getFieldPtr(size_t fieldId, size_t subField)
virtual char * getLibraryName()
@ TIMESTAMP
@ MODULE_FORWARDERS_NUM
@ MODULE_NAME_OFFSET
virtual bufsize_t getSize()
virtual QString getFieldName(size_t fieldId)
virtual QString getName()
virtual void * getPtr()
bool loadNextEntry(size_t entryNum)
static size_t EntriesLimit
virtual void * getPtr()
IMAGE_BOUND_IMPORT_DESCRIPTOR * boundImp()
friend class BoundEntryWrapper
virtual bufsize_t getSize()
offset_t getDirEntryAddress()
IMAGE_DATA_DIRECTORY * getDataDirectory()
virtual uint64_t getNumValue(size_t fieldId, size_t subField, bool *isOk)
virtual ExeNodeWrapper * getParentNode()
std::vector< ExeNodeWrapper * > entries
virtual void clear()
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57