#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;
}
转载请注明原文地址: https://ju.6miu.com/read-663921.html