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/*
7typedef 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
14typedef 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
22IMAGE_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
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
136void* 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
152QString 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
IMAGE_BOUND_IMPORT_DESCRIPTOR * boundImp()
virtual void * getPtr()
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)
std::vector< ExeNodeWrapper * > entries
virtual void clear()
virtual ExeNodeWrapper * getParentNode()
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57