#include "PETools.h"
//获取文件大小
DWORD GetFileSize(FILE* rFile)
{
DWORD lenth;
fseek(rFile, 0, SEEK_END);
lenth = ftell(rFile);
fseek(rFile, 0, SEEK_SET);
return lenth;
}
//读取文件,返回读取文件存放的指针
LPVOID ReadFile(LPCSTR lpszFile)
{
FILE* rFile;
//文件长度
DWORD lenth;
//读取到的文件大小
DWORD rSize;
//文件读取到的buffer
LPVOID pFileBuffer = NULL;
//rFile = fopen(lpszFile, "rb");
//rFile = fopen(lpszFile, "r+");
//fopen_s(&rFile,lpszFile, "r+");
fopen_s(&rFile,lpszFile, "rb");
if (!rFile)
{
printf("打开文件失败");
return NULL;
}
lenth = GetFileSize(rFile);
//分配内存空间
pFileBuffer = malloc(lenth);
if (!pFileBuffer)
{
printf("分配内存空间失败");
fclose(rFile);
free(pFileBuffer);
return NULL;
}
//读取rFile的值
rSize = fread_s(pFileBuffer, lenth, 1, lenth, rFile);
if (!rSize)
{
printf("读取文件失败");
fclose(rFile);
free(pFileBuffer);
return NULL;
}
fclose(rFile);
return pFileBuffer;
}
//打印所有的文件信息
VOID PrintFileInfo(LPCSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
//Dos 头结构体
PIMAGE_DOS_HEADER pDosHeader;
//NT 头结构体
PIMAGE_NT_HEADERS32 pNtHeader;
//PE头
PIMAGE_FILE_HEADER pPeHeader;
//可选PE头结构体
PIMAGE_OPTIONAL_HEADER32 pOptionHeader;
pFileBuffer = ReadFile(lpszFile);
if (!pFileBuffer)
{
printf("读取文件失败\n");
return;
}
//判断是否是有效的MZ标志
if (IMAGE_DOS_SIGNATURE != *(PWORD)pFileBuffer)
{
printf("不是有效的MZ标志\n");
free(pFileBuffer);
return;
}
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
//打印Dos头
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;
}
//打印NT 头信息
pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
printf("********************NT头********************\n");
printf("NT:%x\n", pNtHeader->Signature);
pPeHeader = (PIMAGE_FILE_HEADER)((DWORD)pNtHeader + 4);
printf("********************PE头********************\n");
printf("Machine:%x\n", pPeHeader->Machine);
printf("NumberOfSections:%x\n", pPeHeader->NumberOfSections);
printf("SizeOfOptionalHeader:%x\n", pPeHeader->SizeOfOptionalHeader);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPeHeader + IMAGE_SIZEOF_FILE_HEADER);
printf("********************OPTIOIN_PE头********************\n");
printf("Magic:%x\n", pOptionHeader->Magic);
printf("AddressOfEntryPoint:%x\n", pOptionHeader->AddressOfEntryPoint);
printf("ImageBase:%x\n", pOptionHeader->ImageBase);
printf("SectionAlignment:%x\n", pOptionHeader->SectionAlignment);
printf("FileAlignment:%x\n", pOptionHeader->FileAlignment);
printf("SizeOfImage:%x\n", pOptionHeader->SizeOfImage);
printf("SizeOfHeaders:%x\n", pOptionHeader->SizeOfHeaders);
//释放内存
free(pFileBuffer);
}
使用fopen和fopen_s函数打开文件,mode参数使用r+会丢失字节,使用rb解决不再丢失的问题
使用c++ 语法打开文件
1:头文件
#include <fstream>
using namespace std;
LPVOID ReadFileByCPlus(LPCSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
//ifstream ifs(lpszFile); //使用这个构造函数,读取数据会丢失
ifstream ifs(lpszFile, ios::binary | ios::in);
if (!ifs.is_open())
{
printf("打开文件失败 \n");
return NULL;
}
//计算长度
ifs.seekg(0, ios::end);
DWORD lenth = ifs.tellg();
ifs.seekg(0, ios::beg);
pFileBuffer = malloc(lenth);
ifs.read((char*)pFileBuffer, lenth);
ifs.close();
return pFileBuffer;
}