www.pudn.com > ch02_codes.rar > OEP.cpp
// oep.cpp:读取OEP的实例. // #include#include BOOL ReadOEPbyMemory(LPCSTR szFileName); BOOL ReadOEPbyFile(LPCSTR szFileName); void main() { ReadOEPbyFile("..\\calc.exe"); ReadOEPbyMemory("..\\calc.exe"); getchar(); } // 通过文件读取OEP值. BOOL ReadOEPbyFile(LPCSTR szFileName) { HANDLE hFile; // 打开文件. if ((hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) { printf("can't not open file.\n"); return FALSE; } DWORD dwOEP,cbRead; IMAGE_DOS_HEADER dos_head[sizeof(IMAGE_DOS_HEADER)]; if (!ReadFile(hFile, dos_head, sizeof(IMAGE_DOS_HEADER), &cbRead, NULL)){ printf("read image_dos_header failed.\n"); CloseHandle(hFile); return FALSE; } int nEntryPos=dos_head->e_lfanew+40; SetFilePointer(hFile, nEntryPos, NULL, FILE_BEGIN); if (!ReadFile(hFile, &dwOEP, sizeof(dwOEP), &cbRead, NULL)){ printf("read OEP failed.\n"); CloseHandle(hFile); return FALSE; } // 关闭文件. CloseHandle(hFile); // 显示OEP地址. printf("OEP by file:%d\n",dwOEP); return TRUE; } // 通过文件内存映射读取OEP值. BOOL ReadOEPbyMemory(LPCSTR szFileName) { struct PE_HEADER_MAP { DWORD signature; IMAGE_FILE_HEADER _head; IMAGE_OPTIONAL_HEADER opt_head; IMAGE_SECTION_HEADER section_header[6]; } *header; HANDLE hFile; HANDLE hMapping; void *basepointer; // 打开文件. if ((hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,0)) == INVALID_HANDLE_VALUE) { printf("can't open file.\n"); return FALSE; } // 创建内存映射文件. if (!(hMapping = CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0))) { printf("mapping failed\n"); CloseHandle(hFile); return FALSE; } // 把文件头映象存入baseointer. if (!(basepointer = MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) { printf("view failed.\n"); CloseHandle(hMapping); CloseHandle(hFile); return FALSE; } IMAGE_DOS_HEADER * dos_head =(IMAGE_DOS_HEADER *)basepointer; // 得到PE文件头. header = (PE_HEADER_MAP *)((char *)dos_head + dos_head->e_lfanew); // 得到OEP地址. DWORD dwOEP=header->opt_head.AddressOfEntryPoint; // 清除内存映射和关闭文件. UnmapViewOfFile(basepointer); CloseHandle(hMapping); CloseHandle(hFile); // 显示OEP地址. printf("OEP by memory:%d\n",dwOEP); return TRUE; }