读PE文件的3大结构体_PE文件加载器

2/10/2017来源:ASP.NET技巧人气:876

#include"stdio.h"
#include"stdlib.h"
#include"windows.h"
int main()
{
	IMAGE_DOS_HEADER imafe_dos_header;//dos头
	IMAGE_NT_HEADERS image_nt_headers;//pe头
	IMAGE_SECTION_HEADER *image_section_header;//区块
	HANDLE jubing1;
	DWord shijichicuen=0;//实际读取大小
	BOOL zhenjia;
	LARGE_INTEGER pianyi;
	LARGE_INTEGER pianyi_xin;//文件指针的新值 
	int j = 0;//区块的大小
	jubing1 =CreateFile(L"C:\\Users\\lisaisai\\Desktop\\第15课第01节加工资加账号系统完善.exe", FILE_ALL_access, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //FILE_ATTRIBUTE_NORMAL 普通文件
	zhenjia=ReadFile(jubing1, &imafe_dos_header, sizeof(IMAGE_DOS_HEADER), &shijichicuen, NULL);
	PRintf("是否读取成功真假%d\n", zhenjia);
	printf("开头%s\n", (char*)&imafe_dos_header.e_magic);
	printf("PE头开始位置(指出PE头文件的偏移位置)%x\n", imafe_dos_header.e_lfanew);
	pianyi.QuadPart = imafe_dos_header.e_lfanew;
	SetFilePointerEx(jubing1,pianyi,&pianyi_xin, FILE_BEGIN);//移动指针位置 128个
	//printf("文件指针的新值%x\n",pianyi_xin);
	zhenjia = ReadFile(jubing1, &image_nt_headers, sizeof(IMAGE_NT_HEADERS), &shijichicuen, NULL);
	printf("开头%s",(char*) &image_nt_headers.Signature);
	j = image_nt_headers.FileHeader.NumberOfSections;
	printf("区块的数量%d\n", image_nt_headers.FileHeader.NumberOfSections);
	printf("PE头里的 第3个结构体的大小%x\n", image_nt_headers.FileHeader.SizeOfOptionalHeader);
	pianyi.QuadPart += sizeof(IMAGE_NT_HEADERS);
	SetFilePointerEx(jubing1, pianyi, &pianyi_xin, FILE_BEGIN);//IMAGE_NT_HEADERS的大小是固定的 一般情况这样写 精准要0x18+e0    
	image_section_header = malloc(sizeof(IMAGE_SECTION_HEADER)*j); //IMAGE_SECTION_HEADER 大小不固定
	zhenjia = ReadFile(jubing1, image_section_header, sizeof(IMAGE_SECTION_HEADER)*j, &shijichicuen, NULL);
	for (int i=0;i<j;i++)
	{
		printf("区块的名字%s\n", &image_section_header[i].Name);
	}
	CloseHandle(jubing1);
	free(image_section_header);
	system("pause");
	return 1;
}