Show information about different sections of PE and the dump of sections.
3730{
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;
3742 SIZE_T MappedSize = 0;
3744 LPVOID BaseAddr =
NULL;
3746 PIMAGE_NT_HEADERS32 NtHeader32 =
NULL;
3747 PIMAGE_NT_HEADERS64 NtHeader64 =
NULL;
3749 IMAGE_OPTIONAL_HEADER32 OpHeader32;
3750 IMAGE_OPTIONAL_HEADER64 OpHeader64;
3753 IMAGE_DATA_DIRECTORY EmptyDirectory = {0};
3754 LARGE_INTEGER FileSize;
3756 INT RichHeaderOffset = -1;
3757 const CHAR * RichHeaderStatus =
"not found";
3759 ULONGLONG RemainingSectionScanBytes = MaxTotalSectionScanBytes;
3760 ULONGLONG RemainingSectionDumpBytes = MaxTotalSectionDumpBytes;
3761 time_t TimeDateStamp;
3762
3763
3764
3765
3766
3768
3769 if (BaseAddr == NULL)
3770 {
3771 ShowMessages("err, could not open the file specified\n");
3773 }
3774
3775 FileSize.QuadPart = (LONGLONG)MappedSize;
3776
3778 {
3781 }
3782
3783
3784
3785
3787
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");
3795 goto Finished;
3796 }
3797
3799 {
3800 ShowMessages("\nGiven File is not a valid PE file\n");
3802 goto Finished;
3803 }
3804
3805 if (DosHeader->
e_lfanew > 0 && (ULONGLONG)DosHeader->
e_lfanew <= (ULONGLONG)MAXDWORD)
3806 {
3808 DWORD BytesRead = 0;
3810 DWORD SearchOffset = 0;
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
3831 {
3832 RichHeaderStatus = "read failed";
3833 delete[] DataPtr;
3834 goto SkipRichHeader;
3835 }
3836
3837 for (;;)
3838 {
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
3880 {
3882 PeFileRichHeaderInfo = {0};
3883 SearchOffset = (
DWORD)RichHeaderOffset + 1;
3884 continue;
3885 }
3886
3888 if (PeFileRichHeader.
Entries == NULL)
3889 {
3890 RichHeaderStatus = "allocation failed";
3892 PeFileRichHeaderInfo = {0};
3893 break;
3894 }
3895
3896 if (!SetRichEntries(RichHeaderSize, PeFileRichHeaderInfo.
PtrToBuffer, &PeFileRichHeader))
3897 {
3899 PeFileRichHeaderInfo = {0};
3900 delete[] PeFileRichHeader.
Entries;
3902 SearchOffset = (
DWORD)RichHeaderOffset + 1;
3903 continue;
3904 }
3905
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
3923
3925 {
3926
3927
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 : ",
3940 ShowMessages("\n%-36s%#x",
3941 "Minimum extra paragraphs needed : ",
3943 ShowMessages("\n%-36s%#x",
3944 "Maximum extra paragraphs needed : ",
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 : ",
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) :",
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");
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",
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
3996
3997
3998
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
4011
4013 {
4014 ShowMessages("\nValid PE32 file \n-------------\n");
4015 }
4017 {
4018 ShowMessages("\nValid PE64 file \n-------------\n");
4019 }
4020 else
4021 {
4022 ShowMessages("err, the specified file is not a valid PE file");
4024 goto Finished;
4025 }
4026
4027
4028
4029
4030 ShowMessages("\nDumping COFF/PE Header "
4031 "Info....\n--------------------------------");
4032 ShowMessages("\n%-36s%s", "Signature :", "PE");
4033
4034
4035
4036
4037 if (Is32Bit)
4038 {
4039 Header = NtHeader32->FileHeader;
4040 }
4041 else
4042 {
4043 Header = NtHeader64->FileHeader;
4044 }
4045
4046
4047
4048
4049 ShowMessages("\n%-36s", "Machine Architecture :");
4050
4051
4052
4053
4054
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
4088
4089 ShowMessages("\n%-36s", "Characteristics : ");
4091 ShowMessages("Executable Image, ");
4093 ShowMessages("Application can address > 2GB, ");
4095 ShowMessages("System file (Kernel Mode Driver(I think)), ");
4097 ShowMessages("Dll file, ");
4099 ShowMessages("Application runs only in Uniprocessor, ");
4100
4101
4102
4103
4105 ShowMessages("\n%-36s%s",
4106 "Time Stamp :",
4107 ctime(&TimeDateStamp));
4108
4109
4110
4111
4113 ShowMessages(
"\n%-36s%d",
"No.entries in symbol table :", Header.
NumberOfSymbols);
4114 ShowMessages("\n%-36s%d",
4115 "Size of optional header :",
4117 ShowMessages(
"\n%-36s%#x",
"Raw machine value :", Header.
Machine);
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
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,
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,
4176 PeShowDelayImports(&Reader,
4177 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT] : &EmptyDirectory,
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,
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,
4191 PeShowImports(&Reader,
4192 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_IMPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] : &EmptyDirectory,
4194 PeShowExports(&Reader,
4195 OpHeader32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_EXPORT ? &OpHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] : &EmptyDirectory);
4196 }
4197 else
4198 {
4199
4200
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,
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,
4245 PeShowDelayImports(&Reader,
4246 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT] : &EmptyDirectory,
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,
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,
4260 PeShowImports(&Reader,
4261 OpHeader64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_IMPORT ? &OpHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] : &EmptyDirectory,
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
4272
4275
4276 for (
UINT32 i = 0; i < NumberOfSections; i++, SecHeader++)
4277 {
4280 const CHAR * RawDataBounds =
"empty";
4281
4283
4285 {
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 : ",
4301 ShowMessages(
"\n%-36s%#x",
"Virtual Address(RVA) :", SecHeader->
VirtualAddress);
4302 ShowMessages("\n%-36s%#x",
4303 "Size of raw data (rounded to FA) : ",
4305 ShowMessages("\n%-36s%#x",
4306 "Pointer to Raw Data : ",
4308 ShowMessages("\n%-36s%s", "Raw data bounds :", RawDataBounds);
4310 {
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));
4327 }
4328 }
4330 {
4331 ShowMessages("\n%-36s%s", "Warning :", "virtual size is larger than raw data");
4332 }
4333 ShowMessages("\n%-36s%#x",
4334 "Pointer to Relocations : ",
4336 ShowMessages("\n%-36s%#x",
4337 "Pointer to Line numbers : ",
4339 ShowMessages("\n%-36s%#x",
4340 "Number of relocations : ",
4342 ShowMessages("\n%-36s%#x",
4343 "Number of line numbers : ",
4345 ShowMessages("\n%-36s%s", "Characteristics : ", "Contains ");
4347 ShowMessages("executable code, ");
4349 ShowMessages("initialized data, ");
4351 ShowMessages("uninitialized data, ");
4353 ShowMessages("comments and linker commands, ");
4355 ShowMessages("shareable data(via DLLs), ");
4357 ShowMessages("Readable, ");
4359 ShowMessages("Writable, ");
4360
4361
4362
4363
4364 if (SectionToShow != NULL)
4365 {
4366 if (!_strcmpi(SectionToShow, SectionName))
4367 {
4368 SectionFound =
TRUE;
4369
4371 {
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,
4406 }
4407 if (TruncatedByGlobalCap)
4408 {
4409 ShowMessages("\n%-36s%#llx of %#x bytes",
4410 "Warning, section dump truncated by global cap :",
4411 (UINT64)DumpSize,
4413 }
4414
4415 if (Is32Bit)
4416 {
4417 PeHexDump((
CHAR *)Pointer,
4418 DumpSize,
4420 }
4421 else
4422 {
4423 PeHexDump((
CHAR *)Pointer,
4424 DumpSize,
4426 }
4427
4428 RemainingSectionDumpBytes -= DumpSize;
4429 }
4430 }
4431 }
4432 }
4433
4434 PeShowOverlayAndWarnings(&Reader,
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
4453
4455
4456Finished:
4457
4458
4459
4461 {
4463 }
4464
4465 if (PeFileRichHeader.
Entries != NULL)
4466 {
4467 delete[] PeFileRichHeader.
Entries;
4468 }
4469
4471
4472 return Result;
4473}
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
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