用的是VS2019,打印PE头的内容,参照的滴水逆向海哥视频里面的文件操作代码,想问问这个是运行库报错吗?有什么解决方法没?求求大佬们帮帮忙,谢谢
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#define FILE_PATH "C:\\Users\\Allure_Love\\Desktop\\notpad.exe"
LPVOID ReadPEFile(LPCSTR lpszFile) //const char[]相当于const char*,LPSTR相当于char*,两者不兼容,所以可以把LPSTR改成LPCSTR
{
FILE *pFile;
DWORD fileSize = 0;
LPVOID pFileBuffer = NULL;
//打开文件
errno_t err;
err = fopen_s(&pFile,lpszFile,"rb"); //"rb"只读
if (!pFile)
{
printf("无法打开.exe文件!");
}
//读取文件大小
fseek(pFile,0,SEEK_END);
//fseek(FILE * stream, long offset, int fromwhere); //函数设置文件指针stream的位置,以fromwhere为基址,偏移offset个字节的位置
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); //size_t无符号整数,sieof()返回的结果类型
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流stream读取nmemb个size大小的数据到ptr所指向的数组中
if (!n)
{
printf("读取数据失败!");
free(pFileBuffer);
fclose(pFile);
return NULL;
}
//关闭文件
fclose(pFile);
return pFileBuffer;
}
void PrintNTHeaders()
{
//初始化
LPVOID pFileBuffer = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL; //DOS头指针
PIMAGE_NT_HEADERS pNTHeader = NULL; //NT头指针
PIMAGE_FILE_HEADER pPEHeader = NULL; //标准PE头指针
PIMAGE_OPTIONAL_HEADER32 pOptionalHeader = NULL; //可选PE头指针ReadPEFile(FILE_PATH)
pFileBuffer = ReadPEFile(FILE_PATH);
if (!pFileBuffer)
{
printf("文件读取失败!");
return;
}
if (*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)
{
printf("不是有效的MZ标志!");
free(pFileBuffer); //释放指针内存
return;
}
//打印DOS头
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
printf("***************DOS头****************");
printf("MZ标志:%x\n",pDosHeader->e_magic);
printf("PE偏移:%x\n", pDosHeader->e_lfanew);
//判断是否是有效的PE标志
if (*((PDWORD)((PWORD)pFileBuffer + pDosHeader->e_lfanew)) != IMAGE_DOS_SIGNATURE)
{
printf("不是有效的PE标志!");
free(pFileBuffer);
return;
}
//打印NT头
pNTHeader = (PIMAGE_NT_HEADERS)((PWORD)pFileBuffer + pDosHeader->e_lfanew);
printf("***************NT头****************");
printf("NT:%x\n", pNTHeader->Signature);
//打印标准PE头
pPEHeader = (PIMAGE_FILE_HEADER)(((PWORD)pNTHeader) + 4);
printf("*************标准PE头****************");
printf("PE:%x\n", pPEHeader->Machine);
printf("节的数量:%x\n", pPEHeader->NumberOfSections);
printf("可选PE头的大小:%x\n", pPEHeader->SizeOfOptionalHeader);
//打印可选PE头
pOptionalHeader = (PIMAGE_OPTIONAL_HEADER32)(((PWORD)pPEHeader)+ IMAGE_SIZEOF_FILE_HEADER); //const IMAGE_SIZEOF_FILE_HEADER = 20 标准PE头大小
printf("*************可选PE头****************");
printf("Optional_PE:%x\n", pOptionalHeader->Magic);
//释放内存
free(pFileBuffer);
}
int main()
{
PrintNTHeaders();
return 0;
}
|