HyperDbg Debugger
Loading...
Searching...
No Matches
pe-parser.cpp File Reference

Portable Executable parser. More...

#include "pch.h"

Typedefs

typedef enum _PE_ASCII_STRING_STATUS PE_ASCII_STRING_STATUS

Enumerations

enum  _PE_ASCII_STRING_STATUS { PeAsciiStringInvalid , PeAsciiStringOk , PeAsciiStringTruncated }

Functions

BOOLEAN PeShowSectionInformationAndDump (const WCHAR *AddressOfFile, const CHAR *SectionToShow, BOOLEAN Is32Bit)
 Show information about different sections of PE and the dump of sections.
BOOLEAN PeIsPE32BitOr64Bit (const WCHAR *AddressOfFile, PBOOLEAN Is32Bit)
 Detect whether PE is a 32-bit PE or 64-bit PE.
UINT32 PeGetSyscallNumber (LPCSTR NtFunctionName)
 Get the syscall number of a given Nt function.

Detailed Description

Portable Executable parser.

Author
Sina Karvandi (sina@.nosp@m.hype.nosp@m.rdbg..nosp@m.org)
Version
0.1
Date
2021-12-26

Typedef Documentation

◆ PE_ASCII_STRING_STATUS

Enumeration Type Documentation

◆ _PE_ASCII_STRING_STATUS

Enumerator
PeAsciiStringInvalid 
PeAsciiStringOk 
PeAsciiStringTruncated 
298{
enum _PE_ASCII_STRING_STATUS PE_ASCII_STRING_STATUS
@ PeAsciiStringOk
Definition pe-parser.cpp:300
@ PeAsciiStringTruncated
Definition pe-parser.cpp:301
@ PeAsciiStringInvalid
Definition pe-parser.cpp:299

Function Documentation

◆ PeGetSyscallNumber()

UINT32 PeGetSyscallNumber ( LPCSTR NtFunctionName)

Get the syscall number of a given Nt function.

Parameters
NtFunctionName
Returns
UINT32
4607{
4608 HMODULE DllHandle = NULL;
4609
4610 //
4611 // Load ntdll.dll to get the address of the Nt function
4612 //
4613 DllHandle = LoadLibraryA("ntdll.dll");
4614
4615 if (!DllHandle)
4616 {
4617 ShowMessages("err, failed to load ntdll.dll\n");
4618 return NULL;
4619 }
4620
4621 //
4622 // Choose any Nt function
4623 //
4624 VOID * TargetFunc = GetProcAddress(DllHandle, NtFunctionName);
4625
4626 if (!TargetFunc)
4627 {
4628 //
4629 // If we failed to get the address of the Nt function,
4630 // maybe it's from win32u.dll
4631 //
4632 DllHandle = LoadLibraryA("win32u.dll");
4633
4634 if (!DllHandle)
4635 {
4636 ShowMessages("err, failed to load win32u.dll\n");
4637 return NULL;
4638 }
4639
4640 TargetFunc = GetProcAddress(DllHandle, NtFunctionName);
4641
4642 if (!TargetFunc)
4643 {
4644 ShowMessages("err, failed to get address of %s\n", NtFunctionName);
4645 return NULL;
4646 }
4647 }
4648
4649 //
4650 // By default, we send 30 bytes to the disassembler,
4651 // since usually the syscall handler is less than 30 bytes,
4652 // and we want to avoid disassembling another function
4653 //
4655}
unsigned char UCHAR
Definition BasicTypes.h:34
#define TRUE
Definition BasicTypes.h:114
UINT32 HyperDbgGetImmediateValueOnEaxForSyscallNumber(UCHAR *BufferToDisassemble, UINT64 BuffLength, BOOLEAN Isx86_64)
Get immediate value on EAX register.
Definition disassembler.cpp:1184
NULL()
Definition test-case-generator.py:530

◆ PeIsPE32BitOr64Bit()

BOOLEAN PeIsPE32BitOr64Bit ( const WCHAR * AddressOfFile,
PBOOLEAN Is32Bit )

Detect whether PE is a 32-bit PE or 64-bit PE.

Parameters
AddressOfFile
Is32Bit
Returns
BOOLEAN
4484{
4485 BOOLEAN Result = FALSE;
4486 HANDLE FileHandle = INVALID_HANDLE_VALUE; // Open file handle
4487 SIZE_T MappedSize = 0; // Size of the mapped file in bytes
4488 LPVOID BaseAddr; // Pointer to the base memory of mapped file
4489 PIMAGE_DOS_HEADER DosHeader; // Pointer to DOS Header
4490 PIMAGE_NT_HEADERS32 NtHeader32 = NULL; // Pointer to NT Header 32 bit
4491 PE_IMAGE_READER Reader;
4492 LARGE_INTEGER FileSize;
4493
4494 //
4495 // Open and map the EXE file read-only
4496 //
4497 BaseAddr = PlatformMapFileReadOnly(AddressOfFile, &MappedSize, &FileHandle);
4498
4499 if (BaseAddr == NULL)
4500 {
4501 ShowMessages("err, unable to read or map the file (%x)\n", PlatformGetLastError());
4502 return FALSE;
4503 }
4504
4505 FileSize.QuadPart = (LONGLONG)MappedSize;
4506
4507 if (FileSize.QuadPart < (LONGLONG)sizeof(IMAGE_DOS_HEADER))
4508 {
4509 PlatformUnmapFile(BaseAddr, MappedSize, FileHandle);
4510 return FALSE;
4511 }
4512
4513 //
4514 // Get the DOS Header Base
4515 //
4516 DosHeader = (PIMAGE_DOS_HEADER)BaseAddr; // 0x04000000
4517
4518 //
4519 // Check for Valid DOS file
4520 //
4521 if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
4522 {
4523 Result = FALSE;
4524
4525 ShowMessages("err, the selected file is not in a valid PE format\n");
4526 goto Finished;
4527 }
4528
4529 if (DosHeader->e_lfanew < sizeof(IMAGE_DOS_HEADER) ||
4530 (LONGLONG)DosHeader->e_lfanew + (LONGLONG)sizeof(IMAGE_NT_HEADERS32) > FileSize.QuadPart)
4531 {
4532 Result = FALSE;
4533
4534 ShowMessages("err, invalid image NT header offset\n");
4535 goto Finished;
4536 }
4537
4538 //
4539 // Offset of NT Header is found at 0x3c location in DOS header specified by
4540 // e_lfanew
4541 // Get the Base of NT Header(PE Header) = DosHeader + RVA address of PE
4542 // header
4543 //
4544
4545 NtHeader32 = (PIMAGE_NT_HEADERS32)((UINT64)(DosHeader) + (DosHeader->e_lfanew));
4546
4547 //
4548 // Identify for valid PE file
4549 //
4550 if (NtHeader32->Signature != IMAGE_NT_SIGNATURE)
4551 {
4552 Result = FALSE;
4553
4554 ShowMessages("err, invalid image NT signature\n");
4555 goto Finished;
4556 }
4557
4558 if (!PeImageReaderInitialize((const BYTE *)BaseAddr, (SIZE_T)FileSize.QuadPart, &Reader))
4559 {
4560 Result = FALSE;
4561
4562 ShowMessages("err, the selected file is not in a valid PE format\n");
4563 goto Finished;
4564 }
4565
4566 //
4567 // Only few are determined (for remaining refer
4568 // to the above specification)
4569 //
4570 switch (Reader.FileHeader->Machine)
4571 {
4572 case IMAGE_FILE_MACHINE_I386:
4573 *Is32Bit = TRUE;
4574 Result = TRUE;
4575 goto Finished;
4576 break;
4577 case IMAGE_FILE_MACHINE_AMD64:
4578 *Is32Bit = FALSE;
4579 Result = TRUE;
4580 goto Finished;
4581 break;
4582 default:
4583 ShowMessages("err, PE file is not i386 or AMD64; thus, it's not supported "
4584 "in HyperDbg\n");
4585 Result = FALSE;
4586 goto Finished;
4587 break;
4588 }
4589
4590Finished:
4591 //
4592 // Unmap and close the handles
4593 //
4594 PlatformUnmapFile(BaseAddr, MappedSize, FileHandle);
4595
4596 return Result;
4597}
#define IMAGE_NT_SIGNATURE
Definition Hooks.h:63
#define IMAGE_DOS_SIGNATURE
Special signatures.
Definition Hooks.h:59
PHANDLE FileHandle
Definition SyscallFootprints.h:133
UCHAR BOOLEAN
Definition BasicTypes.h:35
unsigned char BYTE
Definition BasicTypes.h:40
#define FALSE
Definition BasicTypes.h:113
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_DOS_HEADER IMAGE_DOS_HEADER
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
VOID * PlatformMapFileReadOnly(const WCHAR *Path, PSIZE_T OutFileSize, PHANDLE OutFileHandle)
Platform independent wrapper to map an entire file read-only into memory.
Definition platform-lib-calls.c:463
DWORD PlatformGetLastError(VOID)
Platform independent wrapper for GetLastError.
Definition platform-lib-calls.c:350
VOID PlatformUnmapFile(VOID *BaseAddress, SIZE_T FileSize, HANDLE FileHandle)
Platform independent wrapper to release a mapping from PlatformMapFileReadOnly.
Definition platform-lib-calls.c:589
WORD e_magic
Definition pe-image-reader.h:19
LONG e_lfanew
Definition pe-image-reader.h:37
WORD Machine
Definition pe-image-reader.h:42
const IMAGE_FILE_HEADER * FileHeader
Definition pe-image-reader.h:79

◆ PeShowSectionInformationAndDump()

BOOLEAN PeShowSectionInformationAndDump ( const WCHAR * AddressOfFile,
const CHAR * SectionToShow,
BOOLEAN Is32Bit )

Show information about different sections of PE and the dump of sections.

Parameters
AddressOfFile
SectionToShow
Is32Bit
Returns
BOOLEAN
3730{
3731 RICH_HEADER_INFO PeFileRichHeaderInfo {0};
3732 RICH_HEADER PeFileRichHeader {0};
3733 BOOLEAN Result = FALSE, RichFound = FALSE, SectionFound = FALSE;
3734 const DWORD MaxRichReadSize = 1024 * 1024;
3735 const INT MaxRichHeaderSize = 256 * 1024;
3736 const INT MaxRichHeaderEntries = 0x4000;
3737 const DWORD MaxSectionScanBytes = 16 * 1024 * 1024;
3738 const ULONGLONG MaxTotalSectionScanBytes = 64 * 1024 * 1024;
3739 const SIZE_T MaxSectionDumpBytes = 1024 * 1024;
3740 const ULONGLONG MaxTotalSectionDumpBytes = 4 * 1024 * 1024;
3741 HANDLE FileHandle = INVALID_HANDLE_VALUE; // Open file handle (kept for the raw Rich-header read)
3742 SIZE_T MappedSize = 0; // Size of the mapped file in bytes
3743 UINT32 NumberOfSections; // Number of sections
3744 LPVOID BaseAddr = NULL; // Pointer to the base memory of mapped file
3745 PIMAGE_DOS_HEADER DosHeader; // Pointer to DOS Header
3746 PIMAGE_NT_HEADERS32 NtHeader32 = NULL; // Pointer to NT Header 32 bit
3747 PIMAGE_NT_HEADERS64 NtHeader64 = NULL; // Pointer to NT Header 64 bit
3748 IMAGE_FILE_HEADER Header; // Pointer to image file header of NT Header
3749 IMAGE_OPTIONAL_HEADER32 OpHeader32; // Optional Header of PE files present in NT Header structure
3750 IMAGE_OPTIONAL_HEADER64 OpHeader64; // Optional Header of PE files present in NT Header structure
3751 const IMAGE_SECTION_HEADER * SecHeader; // Section Header or Section Table Header
3752 PE_IMAGE_READER Reader;
3753 IMAGE_DATA_DIRECTORY EmptyDirectory = {0};
3754 LARGE_INTEGER FileSize;
3755 CHAR Key[4];
3756 INT RichHeaderOffset = -1;
3757 const CHAR * RichHeaderStatus = "not found";
3758 BOOLEAN RichSearchCapped = FALSE;
3759 ULONGLONG RemainingSectionScanBytes = MaxTotalSectionScanBytes;
3760 ULONGLONG RemainingSectionDumpBytes = MaxTotalSectionDumpBytes;
3761 time_t TimeDateStamp;
3762
3763 //
3764 // Open and map the EXE file read-only. The wrapper also hands back the open
3765 // file handle so the raw Rich-header read below can still seek/read it.
3766 //
3767 BaseAddr = PlatformMapFileReadOnly(AddressOfFile, &MappedSize, &FileHandle);
3768
3769 if (BaseAddr == NULL)
3770 {
3771 ShowMessages("err, could not open the file specified\n");
3772 return FALSE;
3773 }
3774
3775 FileSize.QuadPart = (LONGLONG)MappedSize;
3776
3777 if (FileSize.QuadPart < (LONGLONG)sizeof(IMAGE_DOS_HEADER))
3778 {
3779 PlatformUnmapFile(BaseAddr, MappedSize, FileHandle);
3780 return FALSE;
3781 }
3782
3783 //
3784 // Get the DOS Header Base
3785 //
3786 DosHeader = (PIMAGE_DOS_HEADER)BaseAddr; // 0x04000000
3787
3788 if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE ||
3789 DosHeader->e_lfanew < sizeof(IMAGE_DOS_HEADER) ||
3790 (LONGLONG)DosHeader->e_lfanew > FileSize.QuadPart ||
3791 (LONGLONG)DosHeader->e_lfanew + (LONGLONG)(Is32Bit ? sizeof(IMAGE_NT_HEADERS32) : sizeof(IMAGE_NT_HEADERS64)) > FileSize.QuadPart)
3792 {
3793 ShowMessages("\nGiven File is not a valid PE file\n");
3794 Result = FALSE;
3795 goto Finished;
3796 }
3797
3798 if (!PeImageReaderInitialize((const BYTE *)BaseAddr, (SIZE_T)FileSize.QuadPart, &Reader))
3799 {
3800 ShowMessages("\nGiven File is not a valid PE file\n");
3801 Result = FALSE;
3802 goto Finished;
3803 }
3804
3805 if (DosHeader->e_lfanew > 0 && (ULONGLONG)DosHeader->e_lfanew <= (ULONGLONG)MAXDWORD)
3806 {
3807 CHAR * DataPtr = NULL;
3808 DWORD BytesRead = 0;
3809 DWORD RichReadSize = (DWORD)DosHeader->e_lfanew;
3810 DWORD SearchOffset = 0;
3811 BOOLEAN HadCandidate = FALSE;
3812 LARGE_INTEGER FileStart = {0};
3813
3814 if (RichReadSize > MaxRichReadSize)
3815 {
3816 RichReadSize = MaxRichReadSize;
3817 RichHeaderStatus = "not found in first 1 MiB";
3818 RichSearchCapped = TRUE;
3819 }
3820
3821 if (RichReadSize >= 8)
3822 {
3823 DataPtr = new (std::nothrow) CHAR[RichReadSize];
3824 if (DataPtr == NULL)
3825 {
3826 RichHeaderStatus = "allocation failed";
3827 goto SkipRichHeader;
3828 }
3829
3830 if (!PlatformReadFileAtOffset(FileHandle, 0, DataPtr, RichReadSize, &BytesRead) || BytesRead != RichReadSize)
3831 {
3832 RichHeaderStatus = "read failed";
3833 delete[] DataPtr;
3834 goto SkipRichHeader;
3835 }
3836
3837 for (;;)
3838 {
3839 CHAR * RichHeaderPtr = NULL;
3840
3841 RichHeaderOffset = FindRichHeader(DosHeader, RichReadSize, SearchOffset, Key);
3842 if (RichHeaderOffset < 0)
3843 {
3844 break;
3845 }
3846
3847 HadCandidate = TRUE;
3848 RichHeaderStatus = RichSearchCapped ? "malformed candidate in first 1 MiB" : "malformed";
3849
3850 INT RichHeaderSize = DecryptRichHeader(Key, RichHeaderOffset, DataPtr, (INT)RichReadSize);
3851 INT IndexPointer = RichHeaderOffset - RichHeaderSize;
3852
3853 if (RichHeaderSize < 16 || RichHeaderSize > MaxRichHeaderSize || ((RichHeaderSize - 16) % 8) != 0 ||
3854 (RichHeaderSize - 16) / 8 == 0 || (RichHeaderSize - 16) / 8 > MaxRichHeaderEntries ||
3855 IndexPointer < 0 || RichHeaderSize > (INT)RichReadSize || IndexPointer > (INT)RichReadSize - RichHeaderSize)
3856 {
3857 SearchOffset = (DWORD)RichHeaderOffset + 1;
3858 continue;
3859 }
3860
3861 RichHeaderPtr = new (std::nothrow) CHAR[RichHeaderSize];
3862 if (RichHeaderPtr == NULL)
3863 {
3864 RichHeaderStatus = "allocation failed";
3865 break;
3866 }
3867
3868 memcpy(RichHeaderPtr, DataPtr + IndexPointer, RichHeaderSize);
3869
3870 if (!FindRichEntries(RichHeaderPtr, RichHeaderSize, Key, &PeFileRichHeaderInfo))
3871 {
3872 delete[] RichHeaderPtr;
3873 SearchOffset = (DWORD)RichHeaderOffset + 1;
3874 continue;
3875 }
3876
3877 RichHeaderPtr = NULL;
3878
3879 if (PeFileRichHeaderInfo.Entries > MaxRichHeaderEntries || PeFileRichHeaderInfo.Entries >= INT_MAX / (INT)sizeof(RICH_HEADER_ENTRY) - 1)
3880 {
3881 delete[] PeFileRichHeaderInfo.PtrToBuffer;
3882 PeFileRichHeaderInfo = {0};
3883 SearchOffset = (DWORD)RichHeaderOffset + 1;
3884 continue;
3885 }
3886
3887 PeFileRichHeader.Entries = new (std::nothrow) RICH_HEADER_ENTRY[PeFileRichHeaderInfo.Entries + 1];
3888 if (PeFileRichHeader.Entries == NULL)
3889 {
3890 RichHeaderStatus = "allocation failed";
3891 delete[] PeFileRichHeaderInfo.PtrToBuffer;
3892 PeFileRichHeaderInfo = {0};
3893 break;
3894 }
3895
3896 if (!SetRichEntries(RichHeaderSize, PeFileRichHeaderInfo.PtrToBuffer, &PeFileRichHeader))
3897 {
3898 delete[] PeFileRichHeaderInfo.PtrToBuffer;
3899 PeFileRichHeaderInfo = {0};
3900 delete[] PeFileRichHeader.Entries;
3901 PeFileRichHeader.Entries = NULL;
3902 SearchOffset = (DWORD)RichHeaderOffset + 1;
3903 continue;
3904 }
3905
3906 RichFound = TRUE;
3907 break;
3908 }
3909
3910 if (!RichFound && !HadCandidate && (DWORD)DosHeader->e_lfanew <= MaxRichReadSize)
3911 {
3912 RichHeaderStatus = "not found";
3913 }
3914
3915 delete[] DataPtr;
3916 }
3917 }
3918
3919SkipRichHeader:
3920
3921 //
3922 // Check for Valid DOS file
3923 //
3924 if (DosHeader->e_magic == IMAGE_DOS_SIGNATURE)
3925 {
3926 //
3927 // Dump the Dos Header info
3928 //
3929 ShowMessages("\nValid Dos Exe File\n------------------\n");
3930 ShowMessages("\nDumping DOS Header Info....\n---------------------------");
3931 ShowMessages("\n%-36s%s ",
3932 "Magic number : ",
3933 DosHeader->e_magic == 0x5a4d ? "MZ" : "-");
3934 ShowMessages("\n%-36s%#x", "Bytes on last page of file :", DosHeader->e_cblp);
3935 ShowMessages("\n%-36s%#x", "Pages in file : ", DosHeader->e_cp);
3936 ShowMessages("\n%-36s%#x", "Relocation : ", DosHeader->e_crlc);
3937 ShowMessages("\n%-36s%#x",
3938 "Size of header in paragraphs : ",
3939 DosHeader->e_cparhdr);
3940 ShowMessages("\n%-36s%#x",
3941 "Minimum extra paragraphs needed : ",
3942 DosHeader->e_minalloc);
3943 ShowMessages("\n%-36s%#x",
3944 "Maximum extra paragraphs needed : ",
3945 DosHeader->e_maxalloc);
3946 ShowMessages("\n%-36s%#x", "Initial (relative) SS value : ", DosHeader->e_ss);
3947 ShowMessages("\n%-36s%#x", "Initial SP value : ", DosHeader->e_sp);
3948 ShowMessages("\n%-36s%#x", "Checksum : ", DosHeader->e_csum);
3949 ShowMessages("\n%-36s%#x", "Initial IP value : ", DosHeader->e_ip);
3950 ShowMessages("\n%-36s%#x", "Initial (relative) CS value : ", DosHeader->e_cs);
3951 ShowMessages("\n%-36s%#x",
3952 "File address of relocation table : ",
3953 DosHeader->e_lfarlc);
3954 ShowMessages("\n%-36s%#x", "Overlay number : ", DosHeader->e_ovno);
3955 ShowMessages("\n%-36s%#x", "OEM identifier : ", DosHeader->e_oemid);
3956 ShowMessages("\n%-36s%#x",
3957 "OEM information(e_oemid specific) :",
3958 DosHeader->e_oeminfo);
3959 ShowMessages("\n%-36s%#x", "RVA address of PE header : ", DosHeader->e_lfanew);
3960 ShowMessages("\n==============================================================="
3961 "================\n");
3962 }
3963 else
3964 {
3965 ShowMessages("\nGiven File is not a valid DOS file\n");
3966 Result = FALSE;
3967 goto Finished;
3968 }
3969
3970 if (RichFound)
3971 {
3972 ShowMessages("\n===============================================================================\n");
3973 ShowMessages(" RICH HEADER \n");
3974 ShowMessages("===============================================================================\n");
3975 ShowMessages("Entries: %d\n\n", PeFileRichHeaderInfo.Entries);
3976 ShowMessages("%-10s %-10s %-10s\n", "Build ID", "Prod ID", "Use Count");
3977 ShowMessages("---------------------------------------\n");
3978
3979 for (int i = 0; i < PeFileRichHeaderInfo.Entries; i++)
3980 {
3981 ShowMessages("0x%08X 0x%08X %10u\n",
3982 PeFileRichHeader.Entries[i].BuildID,
3983 PeFileRichHeader.Entries[i].ProdID,
3984 PeFileRichHeader.Entries[i].UseCount);
3985 }
3986
3987 ShowMessages("==============Rich Header End ==================\n");
3988 }
3989 else
3990 {
3991 ShowMessages("=========== Rich Header Not Shown (%s) ===========\n", RichHeaderStatus);
3992 }
3993
3994 //
3995 // Offset of NT Header is found at 0x3c location in DOS header specified by
3996 // e_lfanew
3997 // Get the Base of NT Header(PE Header) = DosHeader + RVA address of PE
3998 // header
3999 //
4000 if (Is32Bit)
4001 {
4002 NtHeader32 = (PIMAGE_NT_HEADERS32)((UINT64)(DosHeader) + (DosHeader->e_lfanew));
4003 }
4004 else
4005 {
4006 NtHeader64 = (PIMAGE_NT_HEADERS64)((UINT64)(DosHeader) + (DosHeader->e_lfanew));
4007 }
4008
4009 //
4010 // Identify for valid PE file
4011 //
4012 if (Is32Bit && NtHeader32->Signature == IMAGE_NT_SIGNATURE)
4013 {
4014 ShowMessages("\nValid PE32 file \n-------------\n");
4015 }
4016 else if (!Is32Bit && NtHeader64->Signature == IMAGE_NT_SIGNATURE)
4017 {
4018 ShowMessages("\nValid PE64 file \n-------------\n");
4019 }
4020 else
4021 {
4022 ShowMessages("err, the specified file is not a valid PE file");
4023 Result = FALSE;
4024 goto Finished;
4025 }
4026
4027 //
4028 // Dump NT Header Info....
4029 //
4030 ShowMessages("\nDumping COFF/PE Header "
4031 "Info....\n--------------------------------");
4032 ShowMessages("\n%-36s%s", "Signature :", "PE");
4033
4034 //
4035 // Get the IMAGE FILE HEADER Structure
4036 //
4037 if (Is32Bit)
4038 {
4039 Header = NtHeader32->FileHeader;
4040 }
4041 else
4042 {
4043 Header = NtHeader64->FileHeader;
4044 }
4045
4046 //
4047 // Determine Machine Architecture
4048 //
4049 ShowMessages("\n%-36s", "Machine Architecture :");
4050
4051 //
4052 // Only few are determined (for remaining refer
4053 // to the above specification)
4054 //
4055 switch (Header.Machine)
4056 {
4057 case 0x0:
4058 ShowMessages("All ");
4059 break;
4060 case 0x14d:
4061 ShowMessages("Intel i860");
4062 break;
4063 case 0x14c:
4064 ShowMessages("Intel i386, i486, i586");
4065 break;
4066 case 0x200:
4067 ShowMessages("Intel Itanium processor");
4068 break;
4069 case 0x8664:
4070 ShowMessages("AMD x64");
4071 break;
4072 case 0x162:
4073 ShowMessages("MIPS R3000");
4074 break;
4075 case 0x166:
4076 ShowMessages("MIPS R4000");
4077 break;
4078 case 0x183:
4079 ShowMessages("DEC Alpha AXP");
4080 break;
4081 default:
4082 ShowMessages("Not Found");
4083 break;
4084 }
4085
4086 //
4087 // Determine the characteristics of the given file
4088 //
4089 ShowMessages("\n%-36s", "Characteristics : ");
4090 if ((Header.Characteristics & 0x0002) == 0x0002)
4091 ShowMessages("Executable Image, ");
4092 if ((Header.Characteristics & 0x0020) == 0x0020)
4093 ShowMessages("Application can address > 2GB, ");
4094 if ((Header.Characteristics & 0x1000) == 0x1000)
4095 ShowMessages("System file (Kernel Mode Driver(I think)), ");
4096 if ((Header.Characteristics & 0x2000) == 0x2000)
4097 ShowMessages("Dll file, ");
4098 if ((Header.Characteristics & 0x4000) == 0x4000)
4099 ShowMessages("Application runs only in Uniprocessor, ");
4100
4101 //
4102 // Determine Time Stamp
4103 //
4104 TimeDateStamp = Header.TimeDateStamp;
4105 ShowMessages("\n%-36s%s",
4106 "Time Stamp :",
4107 ctime(&TimeDateStamp));
4108
4109 //
4110 // Determine number of sections
4111 //
4112 ShowMessages("%-36s%d", "No.sections(size) :", Header.NumberOfSections);
4113 ShowMessages("\n%-36s%d", "No.entries in symbol table :", Header.NumberOfSymbols);
4114 ShowMessages("\n%-36s%d",
4115 "Size of optional header :",
4116 Header.SizeOfOptionalHeader);
4117 ShowMessages("\n%-36s%#x", "Raw machine value :", Header.Machine);
4118 ShowMessages("\n%-36s%#x", "Pointer to symbol table :", Header.PointerToSymbolTable);
4119 ShowMessages("\n%-36s%#x", "Raw characteristics value :", Header.Characteristics);
4120
4121 ShowMessages("\n\nDumping PE Optional Header "
4122 "Info....\n-----------------------------------");
4123
4124 if (Is32Bit)
4125 {
4126 //
4127 // Info about Optional Header
4128 //
4129 OpHeader32 = NtHeader32->OptionalHeader;
4130 ShowMessages("\n\nInfo of optional Header\n-----------------------");
4131 ShowMessages("\n%-36s%#x",
4132 "Address of Entry Point : ",
4133 OpHeader32.AddressOfEntryPoint);
4134 ShowMessages("\n%-36s%#x", "Raw optional header magic :", OpHeader32.Magic);
4135 PeShowEntrypointFileOffset(&Reader, OpHeader32.AddressOfEntryPoint);
4136 ShowMessages("\n%-36s%#llx", "Base Address of the Image : ", OpHeader32.ImageBase);
4137 ShowMessages("\n%-36s%s", "SubSystem type : ", PeGetSubsystemName(OpHeader32.Subsystem));
4138 ShowMessages("\n%-36s%s", "Given file is a : ", OpHeader32.Magic == 0x20b ? "PE32+(64)" : "PE32");
4139 ShowMessages("\n%-36s%#x", "File Alignment :", OpHeader32.FileAlignment);
4140 ShowMessages("\n%-36s%#x", "Size of Image :", OpHeader32.SizeOfImage);
4141 ShowMessages("\n%-36s%#x", "Size of Headers :", OpHeader32.SizeOfHeaders);
4142 PeShowChecksum(&Reader,
4143 OpHeader32.CheckSum,
4144 (SIZE_T)(Reader.NtHeaders - Reader.ImageBase) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + FIELD_OFFSET(IMAGE_OPTIONAL_HEADER32, CheckSum));
4145 ShowMessages("\n%-36s%#x", "Raw DLL characteristics value :", OpHeader32.DllCharacteristics);
4146 ShowMessages("\n%-36s", "DLL characteristics flags :");
4147 PeShowDllCharacteristics(OpHeader32.DllCharacteristics);
4148 ShowMessages("\n%-36s%d", "Size of code segment(.text) : ", OpHeader32.SizeOfCode);
4149 ShowMessages("\n%-36s%#x",
4150 "Base address of code segment(RVA) :",
4151 OpHeader32.BaseOfCode);
4152 ShowMessages("\n%-36s%d",
4153 "Size of Initialized data : ",
4154 OpHeader32.SizeOfInitializedData);
4155
4156 ShowMessages("\n%-36s%#x",
4157 "Base address of data segment(RVA) :",
4158 OpHeader32.BaseOfData);
4159
4160 ShowMessages("\n%-36s%#x", "Section Alignment :", OpHeader32.SectionAlignment);
4161 ShowMessages("\n%-36s%d", "Major Linker Version : ", OpHeader32.MajorLinkerVersion);
4162 ShowMessages("\n%-36s%d", "Minor Linker Version : ", OpHeader32.MinorLinkerVersion);
4163 PeShowDataDirectories(&Reader, OpHeader32.DataDirectory, OpHeader32.NumberOfRvaAndSizes);
4164 PeShowCertificateTable(&Reader,
4165 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_SECURITY ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY] : &EmptyDirectory);
4166 PeShowBaseRelocations(&Reader,
4167 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_BASERELOC ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] : &EmptyDirectory);
4168 PeShowBoundImports(&Reader,
4169 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT] : &EmptyDirectory);
4170 PeShowResources(&Reader,
4171 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_RESOURCE ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] : &EmptyDirectory);
4172 PeShowExceptions(&Reader,
4173 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_EXCEPTION ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION] : &EmptyDirectory,
4174 Header.Machine,
4175 TRUE);
4176 PeShowDelayImports(&Reader,
4177 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT] : &EmptyDirectory,
4178 TRUE,
4179 OpHeader32.ImageBase);
4180 PeShowClrRuntime(&Reader,
4181 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] : &EmptyDirectory);
4182 PeShowTls(&Reader,
4183 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_TLS ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS] : &EmptyDirectory,
4184 TRUE,
4185 OpHeader32.ImageBase);
4186 PeShowDebug(&Reader,
4187 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DEBUG ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] : &EmptyDirectory);
4188 PeShowLoadConfig(&Reader,
4189 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG] : &EmptyDirectory,
4190 TRUE);
4191 PeShowImports(&Reader,
4192 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_IMPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] : &EmptyDirectory,
4193 TRUE);
4194 PeShowExports(&Reader,
4195 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_EXPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] : &EmptyDirectory);
4196 }
4197 else
4198 {
4199 //
4200 // Info about Optional Header
4201 //
4202 OpHeader64 = NtHeader64->OptionalHeader;
4203 ShowMessages("\n\nInfo of optional Header\n-----------------------");
4204 ShowMessages("\n%-36s%#x",
4205 "Address of Entry Point : ",
4206 OpHeader64.AddressOfEntryPoint);
4207 ShowMessages("\n%-36s%#x", "Raw optional header magic :", OpHeader64.Magic);
4208 PeShowEntrypointFileOffset(&Reader, OpHeader64.AddressOfEntryPoint);
4209 ShowMessages("\n%-36s%#llx", "Base Address of the Image : ", OpHeader64.ImageBase);
4210 ShowMessages("\n%-36s%s", "SubSystem type : ", PeGetSubsystemName(OpHeader64.Subsystem));
4211 ShowMessages("\n%-36s%s", "Given file is a : ", OpHeader64.Magic == 0x20b ? "PE32+(64)" : "PE32");
4212 ShowMessages("\n%-36s%#x", "File Alignment :", OpHeader64.FileAlignment);
4213 ShowMessages("\n%-36s%#x", "Size of Image :", OpHeader64.SizeOfImage);
4214 ShowMessages("\n%-36s%#x", "Size of Headers :", OpHeader64.SizeOfHeaders);
4215 PeShowChecksum(&Reader,
4216 OpHeader64.CheckSum,
4217 (SIZE_T)(Reader.NtHeaders - Reader.ImageBase) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + FIELD_OFFSET(IMAGE_OPTIONAL_HEADER64, CheckSum));
4218 ShowMessages("\n%-36s%#x", "Raw DLL characteristics value :", OpHeader64.DllCharacteristics);
4219 ShowMessages("\n%-36s", "DLL characteristics flags :");
4220 PeShowDllCharacteristics(OpHeader64.DllCharacteristics);
4221 ShowMessages("\n%-36s%d", "Size of code segment(.text) : ", OpHeader64.SizeOfCode);
4222 ShowMessages("\n%-36s%#x",
4223 "Base address of code segment(RVA) :",
4224 OpHeader64.BaseOfCode);
4225 ShowMessages("\n%-36s%d",
4226 "Size of Initialized data : ",
4227 OpHeader64.SizeOfInitializedData);
4228
4229 ShowMessages("\n%-36s%#x", "Section Alignment :", OpHeader64.SectionAlignment);
4230 ShowMessages("\n%-36s%d", "Major Linker Version : ", OpHeader64.MajorLinkerVersion);
4231 ShowMessages("\n%-36s%d", "Minor Linker Version : ", OpHeader64.MinorLinkerVersion);
4232 PeShowDataDirectories(&Reader, OpHeader64.DataDirectory, OpHeader64.NumberOfRvaAndSizes);
4233 PeShowCertificateTable(&Reader,
4234 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_SECURITY ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY] : &EmptyDirectory);
4235 PeShowBaseRelocations(&Reader,
4236 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_BASERELOC ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] : &EmptyDirectory);
4237 PeShowBoundImports(&Reader,
4238 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT] : &EmptyDirectory);
4239 PeShowResources(&Reader,
4240 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_RESOURCE ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] : &EmptyDirectory);
4241 PeShowExceptions(&Reader,
4242 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_EXCEPTION ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION] : &EmptyDirectory,
4243 Header.Machine,
4244 FALSE);
4245 PeShowDelayImports(&Reader,
4246 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT] : &EmptyDirectory,
4247 FALSE,
4248 OpHeader64.ImageBase);
4249 PeShowClrRuntime(&Reader,
4250 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] : &EmptyDirectory);
4251 PeShowTls(&Reader,
4252 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_TLS ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS] : &EmptyDirectory,
4253 FALSE,
4254 OpHeader64.ImageBase);
4255 PeShowDebug(&Reader,
4256 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DEBUG ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] : &EmptyDirectory);
4257 PeShowLoadConfig(&Reader,
4258 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG] : &EmptyDirectory,
4259 FALSE);
4260 PeShowImports(&Reader,
4261 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_IMPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] : &EmptyDirectory,
4262 FALSE);
4263 PeShowExports(&Reader,
4264 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_EXPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] : &EmptyDirectory);
4265 }
4266
4267 ShowMessages("\n\nDumping Sections Header "
4268 "Info....\n--------------------------------");
4269
4270 //
4271 // Retrieve a pointer to First Section Header(or Section Table Entry)
4272 //
4273 SecHeader = Reader.SectionHeaders;
4274 NumberOfSections = Reader.FileHeader->NumberOfSections;
4275
4276 for (UINT32 i = 0; i < NumberOfSections; i++, SecHeader++)
4277 {
4278 CHAR SectionName[IMAGE_SIZEOF_SHORT_NAME + 1];
4279 const BYTE * Pointer = NULL;
4280 const CHAR * RawDataBounds = "empty";
4281
4282 PeImageReaderGetSectionName(SecHeader, SectionName, sizeof(SectionName));
4283
4284 if (SecHeader->SizeOfRawData != 0)
4285 {
4286 RawDataBounds = PeImageReaderGetPointerAtOffset(&Reader,
4287 SecHeader->PointerToRawData,
4288 SecHeader->SizeOfRawData,
4289 &Pointer)
4290 ? "valid"
4291 : "invalid";
4292 }
4293
4294 ShowMessages("\n\nSection Info (%d of %d)", i + 1, NumberOfSections);
4295
4296 ShowMessages("\n---------------------");
4297 ShowMessages("\n%-36s%s", "Section Header name : ", SectionName);
4298 ShowMessages("\n%-36s%#x",
4299 "ActualSize of code or data : ",
4300 SecHeader->Misc.VirtualSize);
4301 ShowMessages("\n%-36s%#x", "Virtual Address(RVA) :", SecHeader->VirtualAddress);
4302 ShowMessages("\n%-36s%#x",
4303 "Size of raw data (rounded to FA) : ",
4304 SecHeader->SizeOfRawData);
4305 ShowMessages("\n%-36s%#x",
4306 "Pointer to Raw Data : ",
4307 SecHeader->PointerToRawData);
4308 ShowMessages("\n%-36s%s", "Raw data bounds :", RawDataBounds);
4309 if (Pointer != NULL && SecHeader->SizeOfRawData != 0)
4310 {
4311 if (SecHeader->SizeOfRawData > MaxSectionScanBytes)
4312 {
4313 ShowMessages("\n%-36s%s", "Raw data entropy :", "skipped, section is larger than local cap");
4314 ShowMessages("\n%-36s%s", "Raw data FNV-1a64 :", "skipped, section is larger than local cap");
4315 }
4316 else if ((ULONGLONG)SecHeader->SizeOfRawData > RemainingSectionScanBytes)
4317 {
4318 RemainingSectionScanBytes = 0;
4319 ShowMessages("\n%-36s%s", "Raw data entropy :", "skipped, global scan budget exhausted");
4320 ShowMessages("\n%-36s%s", "Raw data FNV-1a64 :", "skipped, global scan budget exhausted");
4321 }
4322 else
4323 {
4324 ShowMessages("\n%-36s%.4f", "Raw data entropy :", PeCalculateEntropy(Pointer, SecHeader->SizeOfRawData));
4325 ShowMessages("\n%-36s%#llx", "Raw data FNV-1a64 :", PeFnv1a64(Pointer, SecHeader->SizeOfRawData));
4326 RemainingSectionScanBytes -= SecHeader->SizeOfRawData;
4327 }
4328 }
4329 if (SecHeader->SizeOfRawData != 0 && SecHeader->Misc.VirtualSize > SecHeader->SizeOfRawData)
4330 {
4331 ShowMessages("\n%-36s%s", "Warning :", "virtual size is larger than raw data");
4332 }
4333 ShowMessages("\n%-36s%#x",
4334 "Pointer to Relocations : ",
4335 SecHeader->PointerToRelocations);
4336 ShowMessages("\n%-36s%#x",
4337 "Pointer to Line numbers : ",
4338 SecHeader->PointerToLinenumbers);
4339 ShowMessages("\n%-36s%#x",
4340 "Number of relocations : ",
4341 SecHeader->NumberOfRelocations);
4342 ShowMessages("\n%-36s%#x",
4343 "Number of line numbers : ",
4344 SecHeader->NumberOfLinenumbers);
4345 ShowMessages("\n%-36s%s", "Characteristics : ", "Contains ");
4346 if ((SecHeader->Characteristics & 0x20) == 0x20)
4347 ShowMessages("executable code, ");
4348 if ((SecHeader->Characteristics & 0x40) == 0x40)
4349 ShowMessages("initialized data, ");
4350 if ((SecHeader->Characteristics & 0x80) == 0x80)
4351 ShowMessages("uninitialized data, ");
4352 if ((SecHeader->Characteristics & 0x200) == 0x200)
4353 ShowMessages("comments and linker commands, ");
4354 if ((SecHeader->Characteristics & 0x10000000) == 0x10000000)
4355 ShowMessages("shareable data(via DLLs), ");
4356 if ((SecHeader->Characteristics & 0x40000000) == 0x40000000)
4357 ShowMessages("Readable, ");
4358 if ((SecHeader->Characteristics & 0x80000000) == 0x80000000)
4359 ShowMessages("Writable, ");
4360
4361 //
4362 // show the hex dump if the user needs it
4363 //
4364 if (SectionToShow != NULL)
4365 {
4366 if (!_strcmpi(SectionToShow, SectionName))
4367 {
4368 SectionFound = TRUE;
4369
4370 if (SecHeader->SizeOfRawData != 0)
4371 {
4372 SIZE_T DumpSize = SecHeader->SizeOfRawData;
4373 BOOLEAN TruncatedBySectionCap = FALSE;
4374 BOOLEAN TruncatedByGlobalCap = FALSE;
4375
4376 if (Pointer == NULL)
4377 {
4378 ShowMessages("\nerr, invalid section raw data\n");
4379 continue;
4380 }
4381
4382 if (RemainingSectionDumpBytes == 0)
4383 {
4384 ShowMessages("\n%-36s%s", "Warning, section dump skipped :", "global dump budget exhausted");
4385 continue;
4386 }
4387
4388 if (DumpSize > MaxSectionDumpBytes)
4389 {
4390 DumpSize = MaxSectionDumpBytes;
4391 TruncatedBySectionCap = TRUE;
4392 }
4393
4394 if ((ULONGLONG)DumpSize > RemainingSectionDumpBytes)
4395 {
4396 DumpSize = (SIZE_T)RemainingSectionDumpBytes;
4397 TruncatedByGlobalCap = TRUE;
4398 }
4399
4400 if (TruncatedBySectionCap)
4401 {
4402 ShowMessages("\n%-36s%#llx of %#x bytes",
4403 "Warning, section dump truncated by section cap :",
4404 (UINT64)DumpSize,
4405 SecHeader->SizeOfRawData);
4406 }
4407 if (TruncatedByGlobalCap)
4408 {
4409 ShowMessages("\n%-36s%#llx of %#x bytes",
4410 "Warning, section dump truncated by global cap :",
4411 (UINT64)DumpSize,
4412 SecHeader->SizeOfRawData);
4413 }
4414
4415 if (Is32Bit)
4416 {
4417 PeHexDump((CHAR *)Pointer,
4418 DumpSize,
4419 (ULONGLONG)OpHeader32.ImageBase + SecHeader->VirtualAddress);
4420 }
4421 else
4422 {
4423 PeHexDump((CHAR *)Pointer,
4424 DumpSize,
4425 OpHeader64.ImageBase + SecHeader->VirtualAddress);
4426 }
4427
4428 RemainingSectionDumpBytes -= DumpSize;
4429 }
4430 }
4431 }
4432 }
4433
4434 PeShowOverlayAndWarnings(&Reader,
4435 Header.Machine,
4436 Is32Bit ? OpHeader32.Magic : OpHeader64.Magic,
4437 Is32Bit ? OpHeader32.AddressOfEntryPoint : OpHeader64.AddressOfEntryPoint,
4438 Is32Bit ? OpHeader32.SizeOfImage : OpHeader64.SizeOfImage,
4439 Is32Bit ? OpHeader32.SizeOfHeaders : OpHeader64.SizeOfHeaders,
4440 Is32Bit ? OpHeader32.DataDirectory : OpHeader64.DataDirectory,
4441 Is32Bit ? OpHeader32.NumberOfRvaAndSizes : OpHeader64.NumberOfRvaAndSizes);
4442
4443 if (SectionToShow != NULL && !SectionFound)
4444 {
4445 ShowMessages("\nerr, section '%s' was not found\n", SectionToShow);
4446 }
4447
4448 ShowMessages("\n==============================================================="
4449 "================\n");
4450
4451 //
4452 // Set result to true
4453 //
4454 Result = TRUE;
4455
4456Finished:
4457 //
4458 // Unmap and close the handles
4459 //
4460 if (PeFileRichHeaderInfo.PtrToBuffer != NULL)
4461 {
4462 delete[] PeFileRichHeaderInfo.PtrToBuffer;
4463 }
4464
4465 if (PeFileRichHeader.Entries != NULL)
4466 {
4467 delete[] PeFileRichHeader.Entries;
4468 }
4469
4470 PlatformUnmapFile(BaseAddr, MappedSize, FileHandle);
4471
4472 return Result;
4473}
int INT
Definition BasicTypes.h:43
unsigned long DWORD
Definition BasicTypes.h:38
unsigned int UINT32
Definition BasicTypes.h:54
char CHAR
Definition BasicTypes.h:33
BOOLEAN PeImageReaderGetPointerAtOffset(PPE_IMAGE_READER Reader, SIZE_T Offset, SIZE_T Length, const BYTE **Pointer)
Returns a validated pointer into the image at a raw file offset.
Definition pe-image-reader.cpp:219
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
struct _IMAGE_FILE_HEADER IMAGE_FILE_HEADER
#define IMAGE_SIZEOF_SHORT_NAME
Definition pe-image-reader.h:51
struct _IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER
struct _RICH_HEADER_ENTRY RICH_HEADER_ENTRY
struct _RICH_HEADER RICH_HEADER
struct _RICH_HEADER_INFO RICH_HEADER_INFO
BOOLEAN PlatformReadFileAtOffset(HANDLE FileHandle, UINT64 Offset, VOID *Buffer, DWORD NumberOfBytes, LPDWORD BytesRead)
Platform independent wrapper for a positioned (seek + read) file read.
Definition platform-lib-calls.c:549
WORD e_oeminfo
Definition pe-image-reader.h:35
WORD e_cblp
Definition pe-image-reader.h:20
WORD e_csum
Definition pe-image-reader.h:28
WORD e_minalloc
Definition pe-image-reader.h:24
WORD e_lfarlc
Definition pe-image-reader.h:31
WORD e_maxalloc
Definition pe-image-reader.h:25
WORD e_cs
Definition pe-image-reader.h:30
WORD e_cparhdr
Definition pe-image-reader.h:23
WORD e_ovno
Definition pe-image-reader.h:32
WORD e_crlc
Definition pe-image-reader.h:22
WORD e_cp
Definition pe-image-reader.h:21
WORD e_oemid
Definition pe-image-reader.h:34
WORD e_sp
Definition pe-image-reader.h:27
WORD e_ip
Definition pe-image-reader.h:29
WORD e_ss
Definition pe-image-reader.h:26
WORD Characteristics
Definition pe-image-reader.h:48
DWORD NumberOfSymbols
Definition pe-image-reader.h:46
DWORD PointerToSymbolTable
Definition pe-image-reader.h:45
WORD SizeOfOptionalHeader
Definition pe-image-reader.h:47
WORD NumberOfSections
Definition pe-image-reader.h:43
DWORD TimeDateStamp
Definition pe-image-reader.h:44
DWORD SizeOfRawData
Definition pe-image-reader.h:62
DWORD PointerToLinenumbers
Definition pe-image-reader.h:65
union _IMAGE_SECTION_HEADER::@110214036316356314152306243141306316071137200254 Misc
DWORD Characteristics
Definition pe-image-reader.h:68
DWORD PointerToRelocations
Definition pe-image-reader.h:64
DWORD PointerToRawData
Definition pe-image-reader.h:63
WORD NumberOfLinenumbers
Definition pe-image-reader.h:67
DWORD VirtualAddress
Definition pe-image-reader.h:61
WORD NumberOfRelocations
Definition pe-image-reader.h:66
DWORD VirtualSize
Definition pe-image-reader.h:59
const BYTE * ImageBase
Definition pe-image-reader.h:75
const IMAGE_SECTION_HEADER * SectionHeaders
Definition pe-image-reader.h:80
const BYTE * NtHeaders
Definition pe-image-reader.h:78
WORD ProdID
Definition pe-parser.h:27
DWORD UseCount
Definition pe-parser.h:29
WORD BuildID
Definition pe-parser.h:28
CHAR * PtrToBuffer
Definition pe-parser.h:21
int Entries
Definition pe-parser.h:22
PRICH_HEADER_ENTRY Entries
Definition pe-parser.h:34