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

来源:互联网 发布:赚钱最快软件 编辑:程序博客网 时间:2024/05/29 10:30
#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;}

0 0
原创粉丝点击