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