Runs all PE parser unit tests and reports pass/fail results.
214{
217 BYTE Buffer[PeFixtureSize] = {0};
218
219 BuildMinimalPe64(Buffer);
220 TestNum++;
221 {
223
225 {
226 printf(
"[+] Test number %d Passed\n", TestNum);
227 }
228 else
229 {
230 printf(
"[-] Test number %d Failed\n", TestNum);
231 printf(
"[x] valid PE64 did not initialize as PE32+\n");
233 }
234 }
235
236 BuildMinimalPe32(Buffer);
237 TestNum++;
238 {
240
242 {
243 printf(
"[+] Test number %d Passed\n", TestNum);
244 }
245 else
246 {
247 printf(
"[-] Test number %d Failed\n", TestNum);
248 printf(
"[x] valid PE32 did not initialize as PE32\n");
250 }
251 }
252
253 BuildMinimalPe64(Buffer);
254 WriteWord(Buffer, 0, 0);
255 TestNum++;
256 {
258
260 {
261 printf(
"[+] Test number %d Passed\n", TestNum);
262 }
263 else
264 {
265 printf(
"[-] Test number %d Failed\n", TestNum);
266 printf(
"[x] invalid DOS magic initialized successfully\n");
268 }
269 }
270
271 BuildMinimalPe64(Buffer);
272 WriteWord(Buffer,
274 sizeof(IMAGE_OPTIONAL_HEADER64) - 1);
275 TestNum++;
276 {
278
280 {
281 printf(
"[+] Test number %d Passed\n", TestNum);
282 }
283 else
284 {
285 printf(
"[-] Test number %d Failed\n", TestNum);
286 printf(
"[x] truncated optional header initialized successfully\n");
288 }
289 }
290
291 BuildMinimalPe64(Buffer);
293 TestNum++;
294 {
296
298 {
299 printf(
"[+] Test number %d Passed\n", TestNum);
300 }
301 else
302 {
303 printf(
"[-] Test number %d Failed\n", TestNum);
304 printf(
"[x] invalid e_lfanew initialized successfully\n");
306 }
307 }
308
309 BuildMinimalPe64(Buffer);
310 SetPe64OptionalHeaderSizeOfHeaders(Buffer, 0x1c0);
311 ConfigureTextSection(Buffer, sizeof(IMAGE_OPTIONAL_HEADER64), 0x1000, 0x50, 0x1c0, 0x40);
312 TestNum++;
313 {
315 SIZE_T FileOffset = 0;
316
319 {
320 printf(
"[+] Test number %d Passed\n", TestNum);
321 }
322 else
323 {
324 printf(
"[-] Test number %d Failed\n", TestNum);
325 printf(
"[x] valid section RVA did not map to raw file offset\n");
327 }
328 }
329
330 BuildMinimalPe64(Buffer);
331 SetPe64OptionalHeaderSizeOfHeaders(Buffer, 0x1c0);
332 TestNum++;
333 {
335 SIZE_T FileOffset = 0;
336
340 {
341 printf(
"[+] Test number %d Passed\n", TestNum);
342 }
343 else
344 {
345 printf(
"[-] Test number %d Failed\n", TestNum);
346 printf(
"[x] header RVA bounds were not enforced\n");
348 }
349 }
350
351 TestNum++;
352 {
355
356 FillMemory(Name, sizeof(Name), 'X');
360 {
361 printf(
"[+] Test number %d Passed\n", TestNum);
362 }
363 else
364 {
365 printf(
"[-] Test number %d Failed\n", TestNum);
366 printf(
"[x] 8-byte section name was not null-terminated\n");
368 }
369 }
370
371 BuildMinimalPe64(Buffer);
372 SetPe64OptionalHeaderSizeOfHeaders(Buffer, 0x1c0);
373 ConfigureTextSection(Buffer, sizeof(IMAGE_OPTIONAL_HEADER64), 0x1000, 0x40, 0x300, 0x20);
374 TestNum++;
375 {
377 SIZE_T FileOffset = 0;
378
381 {
382 printf(
"[+] Test number %d Passed\n", TestNum);
383 }
384 else
385 {
386 printf(
"[-] Test number %d Failed\n", TestNum);
387 printf(
"[x] RVA mapping accepted raw pointer outside file\n");
388 OverallResult =
FALSE;
389 }
390 }
391
392 return OverallResult;
393}
BOOLEAN PeImageReaderIs32Bit(PPE_IMAGE_READER Reader)
Returns whether the PE image is a 32-bit (PE32) image.
Definition pe-image-reader.cpp:194
BOOLEAN PeImageReaderRvaToFileOffset(PPE_IMAGE_READER Reader, DWORD Rva, DWORD Length, PSIZE_T FileOffset)
Translates a relative virtual address (RVA) to a raw file offset.
Definition pe-image-reader.cpp:287
BOOLEAN PeImageReaderGetSectionName(const IMAGE_SECTION_HEADER *SectionHeader, CHAR *NameBuffer, SIZE_T NameBufferSize)
Copies the section name from a section header into a null-terminated buffer.
Definition pe-image-reader.cpp:244
BOOLEAN PeImageReaderInitialize(const BYTE *ImageBase, SIZE_T ImageSize, PPE_IMAGE_READER Reader)
Parses and validates all PE headers in an in-memory image buffer.
Definition pe-image-reader.cpp:94
struct _PE_IMAGE_READER PE_IMAGE_READER
struct _IMAGE_FILE_HEADER IMAGE_FILE_HEADER
struct _IMAGE_DOS_HEADER IMAGE_DOS_HEADER
#define IMAGE_SIZEOF_SHORT_NAME
Definition pe-image-reader.h:51
struct _IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]
Definition pe-image-reader.h:55