
// win原理Day001.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>//1 把文件读到内存中char* ReadFileToMemory(char* pFilePath){ //1 获取文件句柄 HANDLE hFile = CreateFileA(pFilePath, GENERIC_READ | GENERIC_WRITE, FALSE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("文件打开失败\n"); return 0; } //2.获取文件大小 DWORD dwFileSize = GetFileSize(hFile, NULL); //3.申请内存空间 char* pBuf = new char[dwFileSize]{}; if (!pBuf) { CloseHandle(hFile); printf("内存申请失败\n"); return 0; } //4.读取文件内容到内存空间 DWORD dwRead; ReadFile(hFile, pBuf, dwFileSize, &dwRead, NULL); //5. 返回内存地址 return pBuf;}//2 是否是PE文件bool IsPeFile(char* pBuf){ PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuf; if (pDos->e_magic != IMAGE_DOS_SIGNATURE) { printf("不是PE文件\n"); return false; } PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS) (pDos->e_lfanew + pBuf); if (pNt->Signature != IMAGE_NT_SIGNATURE) { printf("不是PE文件\n"); return false; } return true;}//3 解析PE(头部重要字段)void ShowImportantHead(char* pBuf){ PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuf; PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + pBuf); //文件默认加载基址 printf("默认加载基址:0x%08X\n", pNt->OptionalHeader.ImageBase); //文件入口点 printf("文件入口点:0x%08X\n", pNt->OptionalHeader.AddressOfEntryPoint); //文件区段个数 printf("文件区段个数:%d\n", pNt->FileHeader.NumberOfSections); //。。。}int _tmain(int argc, _TCHAR* argv[]){ char* pBuf = ReadFileToMemory("123.exe"); if (IsPeFile(pBuf)) { ShowImportantHead(pBuf); } delete pBuf; return 0;}