读取的字段都是一样的,只是一个直接从PE文件中读取,一个映射到内存后再读取

1.文件直接访问法

[cpp] view plain copy

  1. BOOL ReadOEPByFile(LPCTSTR szFileName)
  2. {
  3. HANDLE hFile;
  4. hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  5. if (INVALID_HANDLE_VALUE==hFile)
  6. {
  7. AfxMessageBox(_T("打开文件失败!"));
  8. return FALSE;
  9. }
  10. DWORD dwOEP,cbRead;
  11. IMAGE_DOS_HEADER dos_header[sizeof(IMAGE_DOS_HEADER)];//IMAGE_DOS_HEADER dos_header[1];
  12. if (!ReadFile(hFile,dos_header,sizeof(IMAGE_DOS_HEADER),&cbRead,NULL))
  13. {
  14. AfxMessageBox(_T("读取DOS头部失败!"));
  15. CloseHandle(hFile);
  16. return FALSE;
  17. }
  18. int nEntryPos=dos_header->e_lfanew+40;
  19. SetFilePointer(hFile,nEntryPos,NULL,FILE_BEGIN);
  20. if (!ReadFile(hFile,&dwOEP,sizeof(dwOEP),&cbRead,NULL))
  21. {
  22. CloseHandle(hFile);
  23. return FALSE;
  24. }
  25. CloseHandle(hFile);
  26. CString strOEP;
  27. strOEP.Format(_T("OEP:0x%X"),dwOEP);
  28. AfxMessageBox(strOEP);
  29. return TRUE;
  30. }

2.通过内存映射读取

[cpp] view plain copy

  1. BOOL ReadOEPByMemory(LPCTSTR szFileName)
  2. {
  3. HANDLE hFile;
  4. HANDLE hMapping;
  5. PVOID pBaseAddr;
  6. if ((hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,
  7. 0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0))==INVALID_HANDLE_VALUE)
  8. {
  9. AfxMessageBox(_T("打开文件失败!"));
  10. return FALSE;
  11. }
  12. //创建内存映射文件
  13. if (!(hMapping=CreateFileMapping(hFile,0,PAGE_READONLY|SEC_COMMIT,0,0,0)))
  14. {
  15. AfxMessageBox(_T("Mapping failed."));
  16. CloseHandle(hFile);
  17. return FALSE;
  18. }
  19. //把文件映像存入pBaseAddr
  20. if (!(pBaseAddr=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0)))
  21. {
  22. AfxMessageBox(_T("View Failed."));
  23. CloseHandle(hMapping);
  24. CloseHandle(hFile);
  25. return FALSE;
  26. }
  27. IMAGE_DOS_HEADER *dos_header=(IMAGE_DOS_HEADER *)pBaseAddr;
  28. IMAGE_NT_HEADERS *nt_header=(IMAGE_NT_HEADERS *)((DWORD)pBaseAddr+dos_header->e_lfanew);
  29. DWORD dwOEP=nt_header->OptionalHeader.AddressOfEntryPoint;
  30. //清除内存映射和关闭文件
  31. UnmapViewOfFile(pBaseAddr);
  32. CloseHandle(hMapping);
  33. CloseHandle(hFile);
  34. CString strOEP;
  35. strOEP.Format(_T("OEP:0x%X"),dwOEP);
  36. AfxMessageBox(strOEP);
  37. return TRUE;
  38. }

第二种方法要注意DOS STUP与PE头不一定是紧挨着的,一定要通过(DWORD)pBaseAddr+dos_header->e_lfanew定位到IMAGE_NT_HEADERS

如果还要读入口点的代码或其它东西,把PAGE_READONLY|SEC_COMMIT换成PAGE_READONLY|SEC_COMMIT|SEC_IMAGE会给你带来很大的便利

谢谢列宁。

两种方法获取文件OEP相关推荐

  1. python字符串成熟编码_python字符串转公式两种方法获取网页编码python版

    在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题 ...

  2. java文件指针,Java 测试文件指针,java测试指针,两种方法打开文件并进行内

    Java 测试文件指针,java测试指针,两种方法打开文件并进行内 两种方法打开文件并进行内容定位package com.ronsoft.books.nio.channels;import java. ...

  3. python 修改文件创建时间_python 两种方法修改文件的创建时间、修改时间、访问时间...

    突如其来想知道一下 python 如何修改文件的属性(创建.修改.访问时间),于是就去网上搜集了可行方案,也就有了这篇博客 方案一 from win32file import CreateFile, ...

  4. wps word打开是html,用Word打开WPS文件的两种方法,WPS文件如何打开?

    方法一 问:请问,怎样才能在word中正常使用wps文件? 答:一般来说,wps打开word文件是比较顺利的,但word打开wps文件时,若设置不对就无法打开.设置的方法是:启动word后,在&quo ...

  5. 使用五种方法获取文件扩展名

    方法一: function get_ext1($path) {return strrchr($path,'.'); } echo get_ext1(__FILE__); 方法二: function g ...

  6. python比较两个二进制文件_python三种方法判断文件是否为二进制文件

    两种方法判断文件是否为二进制文件,最准确的就是把这两种方法结合起来. (1)方法一: 它首先检查文件是否以BOM开始,如果不在初始8192字节内查找零字节: import codecs file_pa ...

  7. root android oppo,OPPO R9S怎么ROOT oppor9s获取root权限的两种方法

    OPPO R9S如何ROOT呢?作为一款最新的OPPO系列智能手机,对于刚入手的用户而言,可能不知该如何获取OPPO R9S手机ROOT权限.下面就与大家分享一下获取OPPO R9S手机ROOT权限的 ...

  8. android 获取当前时间精确到毫秒的两种方法

    1.概述 在android app开发中,在项目中有些功能需求要求要获取当前时间精确到毫秒,已便于完成功能开发的需要,而在android 的系统api中提供了SimpleDateFormat和Cale ...

  9. 在金蝶云星空中获取单据体信息的两种方法

    近日在学习星空产品的时候发现了两种获取单据体数据包方法,然后调试了一下,发现两种方法获取的信息都是一样的,特此记录一下. 第一种: Entity entity = this.View.BillBusi ...

最新文章

  1. 男性护肤热潮难以孕育下一个“完美日记”?
  2. vue生命周期大白话篇
  3. Spring中Bean的生命周期是怎样的?
  4. eclipse 代码提示后面的百分比是什么意思?
  5. ashly理器4.8软件汉化版_AMD 处理器核心比英特尔多还更便宜?英特尔回应
  6. C语言bmp文件隐藏,怪事!!关于读bmp文件!
  7. 学生成绩管理系统——JAVA
  8. c语言运算程序示例,C语言算术运算示例程序
  9. vs2010格式化html,VS中的快捷键快速格式化代码,使好看,整齐
  10. Python基础-Python中列表的使用
  11. iOS高仿微信完整源码,网易爱玩APP源码等
  12. 【总结】python sklearn模型中random_state参数的意义
  13. 字符串的方法练习------Python篇
  14. 三星程序员晒源码泄露机密
  15. 超融合里的服务器怎么复制文件,整整齐齐的超融合机柜,美好!
  16. 网络运维经理新选择:不再做时间的奴隶
  17. HTML小米英雄区的分类,《王者荣耀》英雄分类介绍 六种类型各有奇效
  18. github前端插件大全
  19. arcgis网络分析最短距离_ArcGIS网络分析(最短路径问题分析)
  20. 一分钟学会canvas镂空文本小动画

热门文章

  1. 游戏脚本在移动游戏设计中的作用_关卡设计师谈游戏中的敌对角色设计Monster Design...
  2. struts2.5.2的套路
  3. [Revit二次开发] 创建一个柱的族
  4. Z-Wave 抓包工具使用说明
  5. Dreamweaver cs6中文版完整安装步骤:
  6. [量化-005]券商股是一切行情的风向标
  7. mjpg-streamer-r63 交叉编译成功 RT5350
  8. redis的安装使用
  9. [升级版]支付宝扫码付款直接到银行卡最新教程, 自动填写卡号
  10. Self-Attention for CodeSearch