读取的字段都是一样的,只是一个直接从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. Android TextView 在strings 里面 实现换行
  2. try-catch-finally中return的执行情况
  3. C#的委托事件在winform窗体中实现传值备忘
  4. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu/Menu的Command)
  5. Python脚本-批量修改文件名
  6. 数据结构之求二叉树的所有叶子和以及叶子总数
  7. Asterisk标准通道变量
  8. 洛谷P1313 计算系数
  9. 关于通过ServletContext获取数据出现的http500的错误的解决方案
  10. Netflix的Hystrix使用教程
  11. VMware Horizon Client剪贴板异常问题解决
  12. 发现 nios2-elf-gcc 一处 bug
  13. mysql 修改字段为主键自增_「MySQL整理」 MySQL语法,如何操作数据表
  14. JAVA中级(五)response(1)基本介绍,代表响应的类,如何设置响应头,行,体
  15. 安卓手机快速将IOS微信消息换行
  16. 在linux中使用getch()函数
  17. 关于评审--从思想到落地
  18. windows10系统-11-高效软件
  19. 光纤布线系统如何打造绿色数据中心?
  20. [学位]燕山大学中文学术期刊目录(2020修订版)

热门文章

  1. 基于Hi3559AV100 RFCN实现细节解析
  2. amp jsp空格 nps_HTML/CSS中的空格处理\_如何保留页面中的空格【转】
  3. 各种软件过程模型的优缺点、适用范围和各模型显著特点
  4. CMDB模型设计解析
  5. 流式细胞仪生物信息学CRO丨Cytapex功能简介
  6. c语言int保留几位小数,C/C++保留小数位数
  7. 10.2 自制操作系统: risc-v Supervisor寄存器sscratch/sepc/scause/stval/senvcfg
  8. visionpro学习课程-CogPMAlignTool大总结
  9. java商城项目面试题,Java基础视频教程
  10. 操作系统:I/O控制方式的分类和各自的优缺点及适用场景