PE头读写(C语言实现)

/*本程序对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;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值