用C写的打开一个文件查看这个文件的头文件信息
#include <stdio.h>#include<stdlib.h>
#include<string.h>
#include<Windows.h>
LPVOID ReadPEFile(LPSTR lpszFile)
{
FILE* pFile = NULL;
DWORD filesize = 0;
LPVOID pFileBuffer = NULL;
//打开文件
fopen_s(&pFile,lpszFile, "r+b");
if (!pFile)
{
printf("无法打开EXE文件!");
return NULL;
}
//读取文件大小
fseek(pFile, 0, SEEK_END);
int fileSize = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
//分配缓冲区
pFileBuffer = malloc(fileSize);
if (!pFileBuffer)
{
printf("分配空间失败!"); fclose(pFile);
return NULL;
}
//将文件数据读取到缓冲区
size_t n = fread(pFileBuffer, fileSize, 1, pFile);
if (!n)
{
printf("读取数据失败!"); free(pFileBuffer);
fclose(pFile);
return NULL;
}
//关闭文件
fclose(pFile);
return pFileBuffer;
}
VOIDPrintNTHeaders(char* FILEPATH)
{
LPVOID pFileBuffer = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
pFileBuffer = ReadPEFile(FILEPATH);
if (!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
//判断是否是有效的MZ标志
if (*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)
{
printf("不是有效的MZ标志\n");
free(pFileBuffer);
return;
}
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
//打印DOC头
printf("******************DOC头********************\n");
printf("MZ标志:%x\n", pDosHeader->e_magic);
printf("PE偏移:%x\n", pDosHeader->e_lfanew);
//判断是否是有效的PE标志
if (*((PDWORD)((DWORD)pFileBuffer + pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
{
printf("不是有效的PE标志\n"); free(pFileBuffer);
return;
}
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
//打印NT头
printf("**********************NT头***********************\n");
printf("NT: %x\n", pNTHeader->Signature);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
printf("**************************PE头*****************************\n");
printf("PE: %x\n", pPEHeader->Machine);
printf("节的数量:%x\n", pPEHeader->NumberOfSections);
printf("PE: %x\n", pPEHeader->Machine);
printf("节的数量:%x\n", pPEHeader->NumberOfSections);
printf("Size0f0ptionalHeader: %x\n", pPEHeader->SizeOfOptionalHeader);
//可选PE头
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
printf("****************************OPTIOIN_PE头****************************\n"),
printf("OPTION_PE:%x\n", pOptionHeader->Magic);
//释放内存
free(pFileBuffer);
}
int main()
{
char* FILEPATH = (char*)"E:/file/IPMSG2007.exe";
PrintNTHeaders(FILEPATH);
return 0;
}
牛人,学习学习 没有可视化,不是傻瓜操作,一般没几个人用的!!!!!!!!!!!!!! 1666909156 发表于 2021-12-22 23:27
没有可视化,不是傻瓜操作,一般没几个人用的!!!!!!!!!!!!!!
这些事给刚刚学C的看到,其实就是看看怎么写语法{:7_246:} 备注太少了啊,, 雷lilei 发表于 2021-12-25 02:26
备注太少了啊,,
#include<Windows.h>
第二个函数都是用的这个头文件! 纯支持,谢谢分享 正在学习C中 来向大佬学习 感谢楼主