/*本程序对https://blog.csdn.net/yan_star/article/details/79605860.做了以下修改:
1.文件路径可键盘输入;2.原博主程序在释放内存前没有将指针返回到起始位置(for循环中pmySectionHeader 不断++),因此添加了 pmySectionHeader=pmySectionHeader-SectionCount语句
(我运行原作者程序时会中断)。另外,补充一点,IMAGE_OPTIONAL_HEADER64 structure没有 DWORD BaseOfData;,只有IMAGE_OPTIONAL_HEADER32有
*/
#include<stdio.h>
#include<windows.h>
//IMAGE_OPTIONAL_HEADER64 structure没有 DWORD BaseOfData;
IMAGE_DOS_HEADER myDosHeader;
IMAGE_NT_HEADERS myNtHeader;
IMAGE_FILE_HEADER myFileHeader;
IMAGE_OPTIONAL_HEADER myOptionHeader;
IMAGE_SECTION_HEADER* pmySectionHeader;
LONG e_lfanew;
int SectionCount;
int Signature;
int main()
{
FILE* pfile;
errno_t err;
int i;
char filepath[MAX_PATH]={0};
printf("欢迎使用PEViewTool\r\n");
printf("请输入一个文件路径:\n");
scanf("%s",&filepath);
fflush(stdin);
if ((err = fopen_s(&pfile, filepath, "r")) != 0)
{
printf("打开文件错误");
return -1;
}
//DOS头部分
printf("================IMAGE_DOS_HEADER================\n");
fread(&myDosHeader, sizeof(IMAGE_DOS_HEADER), 1, pfile);
printf("WORD e_magic: %04X\n", myDosHeader.e_magic);
printf("DWORD e_lfanew: %08X\n\n", myDosHeader.e_lfanew);
e_lfanew = myDosHeader.e_lfanew;
//NT头部分
printf("================IMAGE_NT_HEADER================\n");
fseek(pfile, e_lfanew, SEEK_SET);
fread(&myNtHeader, sizeof(IMAGE_NT_HEADERS), 1, pfile);
printf("DWORD Signature: %08x\n\n", myNtHeader.Signature);
Signature = myNtHeader.Signature;
if (Signature != 0x4550)
{
exit(0);
}
//FILE头部分
printf("================IMAGE_FILE_HEADER================\n");
fseek(pfile, (e_lfanew+sizeof(DWORD)), SEEK_SET);
fread(&myFileHeader, sizeof(IMAGE_FILE_HEADER), 1, pfile);
printf("WORD Machine: %04X\n", myFileHeader.Machine);
printf("WORD NumberOfSections: %04X\n", myFileHeader.NumberOfSections);
printf("DWORD TimeDateStamp: %08X\n", myFileHeader.TimeDateStamp);
printf("DWORD PointerToSymbolTable: %08X\n", myFileHeader.PointerToSymbolTable);
printf("DWORD NumberOfSymbols: %08X\n", myFileHeader.NumberOfSymbols);
printf("WORD SizeOfOptionalHeader: %04X\n", myFileHeader.SizeOfOptionalHeader);
printf("WORD Characteristics: %04X\n\n", myFileHeader.Characteristics);
SectionCount = myFileHeader.NumberOfSections;
//OPTIONAL头部分
printf("================IMAGE_OPTIONAL_HEADER================\n");
fseek(pfile, (e_lfanew + sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)), SEEK_SET);
fread(&myOptionHeader, sizeof(IMAGE_OPTIONAL_HEADER), 1, pfile);
printf("WORD Magic: %04X\n", myOptionHeader.Magic);
printf("BYTE MajorLinkerVersion: %02X\n", myOptionHeader.MajorLinkerVersion);
printf("BYTE MinorLinkerVersion: %02X\n", myOptionHeader.MinorLinkerVersion);
printf("DWORD SizeOfCode: %08X\n", myOptionHeader.SizeOfCode);
printf("DWORD SizeOfInitializedData: %08X\n", myOptionHeader.SizeOfInitializedData);
printf("DWORD SizeOfUninitializedData: %08X\n", myOptionHeader.SizeOfUninitializedData);
printf("DWORD AddressOfEntryPoint: %08X\n", myOptionHeader.AddressOfEntryPoint);
printf("DWORD BaseOfCode: %08X\n", myOptionHeader.BaseOfCode);
// printf("DWORD BaseOfData: %08X\n", myOptionHeader.BaseOfData);
printf("DWORD ImageBase: %08X\n", myOptionHeader.ImageBase);
printf("DWORD SectionAlignment: %08X\n", myOptionHeader.SectionAlignment);
printf("DWORD FileAlignment: %08X\n", myOptionHeader.FileAlignment);
printf("WORD MajorOperatingSystemVersion: %04X\n", myOptionHeader.MajorOperatingSystemVersion);
printf("WORD MinorOperatingSystemVersion: %04X\n", myOptionHeader.MinorOperatingSystemVersion);
printf("WORD MajorImageVersion: %04X\n", myOptionHeader.MajorImageVersion);
printf("WORD MinorImageVersion: %04X\n", myOptionHeader.MinorImageVersion);
printf("WORD MajorSubsystemVersion: %04X\n", myOptionHeader.MajorSubsystemVersion);
printf("WORD MinorSubsystemVersion: %04X\n", myOptionHeader.MinorSubsystemVersion);
printf("DWORD Win32VersionValue: %08X\n", myOptionHeader.Win32VersionValue);
printf("DWORD SizeOfImage: %08X\n", myOptionHeader.SizeOfImage);
printf("DWORD SizeOfHeaders: %08X\n", myOptionHeader.SizeOfHeaders);
printf("DWORD CheckSum: %08X\n", myOptionHeader.CheckSum);
printf("WORD Subsystem: %04X\n", myOptionHeader.Subsystem);
printf("WORD DllCharacteristics: %04X\n", myOptionHeader.DllCharacteristics);
printf("DWORD SizeOfStackReserve: %08X\n", myOptionHeader.SizeOfStackReserve);
printf("DWORD SizeOfStackCommit: %08X\n", myOptionHeader.SizeOfStackCommit);
printf("DWORD SizeOfHeapReserve: %08X\n", myOptionHeader.SizeOfHeapReserve);
printf("DWORD SizeOfHeapCommit: %08X\n", myOptionHeader.SizeOfHeapCommit);
printf("DWORD LoaderFlags: %08X\n", myOptionHeader.LoaderFlags);
printf("DWORD NumberOfRvaAndSizes: %08X\n\n", myOptionHeader.NumberOfRvaAndSizes);
//节表目录
printf("================IMAGE_OPTIONAL_HEADER================\n");
pmySectionHeader = (IMAGE_SECTION_HEADER*)calloc(SectionCount, sizeof(IMAGE_SECTION_HEADER));
printf("%p\n",pmySectionHeader);
fseek(pfile, (e_lfanew + sizeof(IMAGE_NT_HEADERS)),SEEK_SET);
fread(pmySectionHeader, sizeof(IMAGE_SECTION_HEADER), SectionCount, pfile);
for (i = 0; i < SectionCount; i++, pmySectionHeader++)
{
printf("BYTE Name: %s\n", pmySectionHeader->Name);
printf(":DWORD PhysicalAddress %08X\n", pmySectionHeader->Misc.PhysicalAddress);
printf(":DWORD VirtualSize %08X\n", pmySectionHeader->Misc.VirtualSize);
printf(":DWORD VirtualAddress %08X\n", pmySectionHeader->VirtualAddress);
printf(":DWORD SizeOfRawData %08X\n", pmySectionHeader->SizeOfRawData);
printf(":DWORD PointerToRawData %08X\n", pmySectionHeader->PointerToRawData);
printf(":DWORD PointerToRelocations %08X\n", pmySectionHeader->PointerToRelocations);
printf(":DWORD PointerToLinenumbers %08X\n", pmySectionHeader->PointerToLinenumbers);
printf(":WORD NumberOfRelocations %04X\n", pmySectionHeader->NumberOfRelocations);
printf(":WORD NumberOfLinenumbers %04X\n", pmySectionHeader->NumberOfLinenumbers);
printf(":DWORD Characteristics %08X\n\n", pmySectionHeader->Characteristics);
}
pmySectionHeader=pmySectionHeader-SectionCount;//指针回到头部
printf("%p\n",pmySectionHeader);
if (pmySectionHeader!=NULL){
free(pmySectionHeader);
pmySectionHeader=NULL;
}
//清空内存
fclose(pfile);
return 0;
}