BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
DebugDirWrapper.cpp
Go to the documentation of this file.
2#include <QtGlobal>
3
4using namespace pe;
5/*
6typedef struct _IMAGE_DEBUG_DIRECTORY {
7 DWORD Characteristics;
8 DWORD TimeDateStamp;
9 WORD MajorVersion;
10 WORD MinorVersion;
11 DWORD Type;
12 DWORD SizeOfData;
13 DWORD AddressOfRawData;
14 DWORD PointerToRawData;
15} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
16
17*/
18
20{
21 const size_t dirSize = this->getSize();
22 const size_t entriesCount = dirSize / sizeof(IMAGE_DEBUG_DIRECTORY);
23 if (cntr >= entriesCount) {
24 return false;
25 }
26
27 DebugDirEntryWrapper* dbgEntry = new DebugDirEntryWrapper(m_PE, this, cntr);
28 if (!dbgEntry || !dbgEntry->getPtr()) {
29 delete dbgEntry;
30 return false;
31 }
32 entries.push_back(dbgEntry);
33 return true;
34}
35
36//---
37
39{
40 if (this->getDebugStruct()) {
42 this->entries.push_back(cvWrapper);
43 }
44 return true;
45}
46
48{
49 return debugDir();
50}
51
53{
54 if (!getPtr()) return 0;
55 return sizeof(IMAGE_DEBUG_DIRECTORY);
56}
57
58void* DebugDirEntryWrapper::getFieldPtr(size_t fId, size_t subField)
59{
60 IMAGE_DEBUG_DIRECTORY* d = debugDir();
61 if (d == NULL) return NULL;
62
63 switch (fId) {
64 case CHARACTERISTIC: return &d->Characteristics;
65 case TIMESTAMP: return &d->TimeDateStamp;
66 case MAJOR_VER: return &d->MajorVersion;
67 case MINOR_VER: return &d->MinorVersion;
68 case TYPE: return &d->Type;
69 case DATA_SIZE: return &d->SizeOfData;
70 case RAW_DATA_ADDR: return &d->AddressOfRawData;
71 case RAW_DATA_PTR: return &d->PointerToRawData;
72 }
73 return this->getPtr();
74}
75
77{
78 switch (fieldId) {
79 case CHARACTERISTIC: return "Characteristics";
80 case TIMESTAMP: return "TimeDateStamp";
81 case MAJOR_VER: return "MajorVersion";
82 case MINOR_VER: return "MinorVersion";
83 case TYPE: return "Type";
84 case DATA_SIZE: return "SizeOfData";
85 case RAW_DATA_ADDR: return "AddressOfRawData";
86 case RAW_DATA_PTR: return "PointerToRawData";
87 }
88 return getName();
89}
90
92{
93 switch (fieldId) {
94 case RAW_DATA_ADDR: return Executable::RVA;
95 case RAW_DATA_PTR: return Executable::RAW;
96 }
98}
99
101{
102 switch (type) {
103 case pe::DT_UNKNOWN : return "unknown";
104 case pe::DT_COFF : return "COFF";
105 case pe::DT_CODEVIEW : return "Visual C++ (CodeView)";
106 case pe::DT_FPO : return "Frame pointer omission";
107 case pe::DT_MISC : return "DBG file";
108 case pe::DT_EXCEPTION : return "A copy of .pdata section";
109 case pe::DT_FIXUP : return "Reserved";
110 case pe::DT_OMAP_TO_SRC : return "mapping from an RVA in image to an RVA in source image";
111 case pe::DT_OMAP_FROM_SRC : return "mapping from an RVA in source image to an RVA in image";
112 case pe::DT_BORLAND : return "Borland";
113 case pe::DT_RESERVED10 : return "Reserved";
114 case pe::DT_CLSID : return "CLSID";
115 case pe::DT_VC_FEATURE : return "VC Feature";
116 case pe::DT_POGO : return "POGO";
117 case pe::DT_ILTCG : return "ILTCG";
118 case pe::DT_MPX : return "MPX";
119 case pe::DT_REPRO : return "REPRO";
120 }
121 return "<Unknown>";
122}
123
125{
126 if (fieldId != TYPE) return "";
127
128 IMAGE_DEBUG_DIRECTORY* d = debugDir();
129 if (d == NULL) return NULL;
130
131 return translateType(d->Type);
132}
133
135{
136 IMAGE_DEBUG_DIRECTORY* d = this->debugDir();
137 if (d == NULL) return NULL;
138 if (d->Type != DT_CODEVIEW) {
139 return NULL;
140 }
141 offset_t rva = d->PointerToRawData;
142 size_t dirSize = d->SizeOfData;
143 return m_Exe->getContentAt(rva, Executable::RAW, dirSize);
144}
145
147{
148 BYTE* debugStr = getDebugStruct();
149 IMAGE_DEBUG_DIRECTORY* d = debugDir();
150 if (!debugStr || !d) return NULL;
151 if (d->SizeOfData < sizeof(DEBUG_RSDSI)) {
152 return NULL;
153 }
154 DEBUG_RSDSI* rdsi = (DEBUG_RSDSI*)debugStr;
155 if (rdsi->dwSig == CV_SIGNATURE_RSDS) {
156 return rdsi;
157 }
158 return NULL;
159}
160
162{
163 BYTE* debugStr = getDebugStruct();
164 IMAGE_DEBUG_DIRECTORY* d = debugDir();
165 if (!debugStr || !d) return NULL;
166 if (d->SizeOfData < sizeof(DEBUG_NB10)) {
167 return NULL;
168 }
169 DEBUG_NB10* nb = (DEBUG_NB10*)debugStr;
170 if (nb->cvHdr.CvSignature == CV_SIGNATURE_NB10) {
171 return nb;
172 }
173 return NULL;
174}
175//-------------------------
176
178{
179 DEBUG_RSDSI* rdsi = parentDir->getRDSI();
180 if (rdsi) {
181 return rdsi;
182 }
183 return parentDir->getNB10();
184}
185
187{
188 IMAGE_DEBUG_DIRECTORY* d = parentDir->debugDir();
189 if (d == NULL) return 0;
190 return d->SizeOfData;
191}
192
193void* DebugDirCVEntryWrapper::getFieldPtr(size_t fId, size_t subField)
194{
195 DEBUG_RSDSI* rdsi = parentDir->getRDSI();
196 if (rdsi) {
197 switch (fId) {
198 case F_CVDBG_SIGN: return &rdsi->dwSig;
199 case F_CVDBG_GUID: return &rdsi->guidSig;
200 case F_CVDBG_AGE: return &rdsi->age;
201 case F_CVDBG_PDB: return &rdsi->szPdb;
202 }
203 return rdsi;
204 }
205 DEBUG_NB10* dbg = parentDir->getNB10();
206 if (dbg) {
207 switch (fId) {
208 case F_CVDBG_SIGN: return &dbg->cvHdr.CvSignature;
209 case F_CVDBG_GUID: return &dbg->Signature;
210 case F_CVDBG_AGE: return &dbg->Age;
211 case F_CVDBG_PDB: return &dbg->PdbFileName;
212 }
213 return dbg;
214 }
215 return NULL;
216}
217
219{
220 DEBUG_RSDSI* rdsi = parentDir->getRDSI();
221 if (rdsi) {
222 QString chunk4 = "";
223 for (size_t i = 0; i < sizeof(rdsi->guidSig.Data4); i++) {
224 QString out;
225#if QT_VERSION >= 0x050000
226 out = QString().asprintf("%02X", rdsi->guidSig.Data4[i]);
227#else
228 out = QString().sprintf("%02X", rdsi->guidSig.Data4[i]);
229#endif
230 chunk4 += out;
231 }
232 QString chunk5 = "";
233 for (size_t i = 0; i < sizeof(rdsi->guidSig.Data5); i++) {
234 QString out;
235#if QT_VERSION >= 0x050000
236 out = QString().asprintf("%02X", rdsi->guidSig.Data5[i]);
237#else
238 out = QString().sprintf("%02X", rdsi->guidSig.Data5[i]);
239#endif
240 chunk5 += out;
241 }
242 QString out;
243#if QT_VERSION >= 0x050000
244 out = QString().asprintf("%08X-%04X-%04X-",
245 rdsi->guidSig.Data1,
246 rdsi->guidSig.Data2,
247 rdsi->guidSig.Data3);
248#else
249 out = QString().sprintf("%08X-%04X-%04X-",
250 rdsi->guidSig.Data1,
251 rdsi->guidSig.Data2,
252 rdsi->guidSig.Data3);
253#endif
254 return "{" + out + chunk4 + "-" + chunk5 + "}";
255 }
256
257 DEBUG_NB10* dbg = parentDir->getNB10();
258 if (dbg) {
259 QString out;
260#if QT_VERSION >= 0x050000
261 out = QString().asprintf("%04X", dbg->Signature);
262#else
263 out = QString().sprintf("%04X", dbg->Signature);
264#endif
265 return out;
266 }
267 return "";
268}
269
271{
272 DEBUG_RSDSI* rdsi = (DEBUG_RSDSI*)this->getPtr();
273 if (!rdsi) return "";
274
275 QString out;
276#if QT_VERSION >= 0x050000
277 out = QString().asprintf("%.4s", (char*)&rdsi->dwSig);
278#else
279 out = QString().sprintf("%.4s", (char*)&rdsi->dwSig);
280#endif
281 return out;
282}
283
285{
286 switch (fId) {
287 case F_CVDBG_SIGN: return "CvSig";
288 case F_CVDBG_GUID: return "Signature";
289 case F_CVDBG_AGE: return "Age";
290 case F_CVDBG_PDB: return "PDB";
291 }
292 return "";
293}
294
296{
297 DEBUG_RSDSI* rdsi = parentDir->getRDSI();
298 DEBUG_NB10* dbg = parentDir->getNB10();
299 if (!rdsi && !dbg) return "";
300
301 char *pdb = NULL;
302 if (rdsi) pdb = (char*)rdsi->szPdb;
303 if (dbg) pdb = (char*)dbg->PdbFileName;
304
305 switch (fId) {
306 case F_CVDBG_SIGN: return getSignature();
307 case F_CVDBG_GUID: return getGuidString();
308 case F_CVDBG_PDB: return pdb ? pdb : "";
309 }
310 return "";
311}
uint32_t bufsize_t
uint64_t offset_t
QString translateFieldContent(size_t fieldId)
virtual QString getFieldName(size_t fieldId)
QString getSignature()
@ F_CVDBG_SIGN
@ F_CVDBG_GUID
@ F_CVDBG_AGE
@ F_CVDBG_PDB
virtual void * getPtr()
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
QString getGuidString()
virtual bufsize_t getSize()
pe::DEBUG_RSDSI * getRDSI()
bool wrap()
virtual QString getName()
QString translateFieldContent(size_t fieldId)
virtual QString getFieldName(size_t fieldId)
virtual void * getPtr()
@ RAW_DATA_PTR
@ MINOR_VER
@ CHARACTERISTIC
@ TYPE
@ MAJOR_VER
@ DATA_SIZE
@ TIMESTAMP
@ RAW_DATA_ADDR
virtual bufsize_t getSize()
IMAGE_DEBUG_DIRECTORY * debugDir()
friend class DebugDirCVEntryWrapper
pe::DEBUG_NB10 * getNB10()
virtual void * getFieldPtr(size_t fieldId, size_t subField)
BYTE * getDebugStruct()
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
QString translateType(int type)
friend class DebugDirEntryWrapper
virtual bool loadNextEntry(size_t cntr)
virtual bufsize_t getSize()
std::vector< ExeNodeWrapper * > entries
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57
PEFile * m_PE
Definition: PENodeWrapper.h:36