为什么80%的码农都做不了架构师?>>>   

OEP是PE文件被加载时的起始地址,该值位于PE文件头的IMAGE_OPTIONAL_HEADER32结构体中。照着网上的教程写了一遍,收 获不小,现在对PE文件的前两部分已经有一定的了解了。

下面的代码很简单,首先用CreateFile读取PE文件,PE文件的起始位置是DOS部分,DOS部分又分为DOS MS文件头和DOS块,在DOS MS文件头中包含了PE文件头的起始地址,而DOS块中的数据没啥用,该块的大小为112字节,通常其内容为“This program cannot be run in DOS mode.”。

所以我们现在要做的就是读取DOS MS 文件头,其存放于IMAGE_DOS_HEADER结构体中,用ReadFile函数来读取。

读取到IMAGE_DOS_HEADER结构体的数据后,直接获取结构体中e_lfanew成员的值,这个值就是PE文件头的地址。

现在已经到了PE文件头的位置,而我们要读取的OEP则是存放于PE文件头的IMAGE_DATA_HEADER32结构体中。在PE文件 头到IMAGE_DATA_HEADER32结构体之间包含PE文件标志和一个IMAGE_FILE_HEADER结构体。也就是说,说PE文件头走到 IMAGE_DATA_HEADER32的位置,首先要经过PE文件标志,接着再走到IMAGE_FILE_HEADER结构体的位置。

PE文件标志是一个DWORD类型,占4个字节。

IMAGE_FILE_HEADER结构体有4个WORD成员和3个DWORD成员,占20个字节。

现在到了IMAGE_DATA_HEADER32结构体,我们要获取的OEP在该结构体的第7个成员中,在其之前分别有2个BYTE成员、 1个WORD成员和3个DWORD成员,所以在该结构体的16个字节就是存放OEP的起始地址。

那么,我们在PE文件头的起始位置加上PE文件标志占用的字节,再加上OEP值之前6个成员占用的字节,也就是加40个字节。这样就到了 OEP的起始位置了。

现在用SetFilePointer函数定位文件读取的起始位置,然后用Read_File函数就可以读取OEP的值了。

下面的完整的代码:

#include <windows.h>
#include <stdio.h>

int main()
{
 HANDLE hFile;

//打开文件
 if ( ( hFile = CreateFile( "notepad.exe", GENERIC_READ, FILE_SHARE_READ, NULL,
  OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ) ) == INVALID_HANDLE_VALUE )
 {
  printf( "文件打开失败!/n" );
  return 0;
 }

//DOS MZ文件头
 IMAGE_DOS_HEADER dos_head[ sizeof( IMAGE_DOS_HEADER ) ];

DWORD dwRead; //读取到的字节大小

//读取文件
 if ( !ReadFile( hFile, &dos_head, sizeof( IMAGE_DOS_HEADER ), &dwRead, NULL ) )
 {
  printf( "读取IMAGE_DOS_HEADER失败!/n" );
  CloseHandle( hFile );
  return 0;
 }

//指向PE文件头
 int EntryPoint = dos_head->e_lfanew;

//批向IMAGE_NT_HEADERS结构体中的
 //IMAGE_OPTIONAL_HEADER32结构体的
 //第7 个成员AddressOfEntryPoint, 即程序执行入口RVA
 //RVA 偏移量 文件映射到内存的偏移地址
 EntryPoint += 40;

//设置文件读写地址
 SetFilePointer( hFile, EntryPoint, NULL, FILE_BEGIN );

DWORD dwOEP;

//读取AddressOfEntryPoint的值
 if ( !ReadFile( hFile, &dwOEP, sizeof( dwOEP ), &dwRead, NULL ) )
 {
  CloseHandle( hFile );
  return 0;
 }

//关闭文件
 CloseHandle( hFile );

printf( "OEP by file:%d/n", dwOEP );
 return 0;
}

转载于:https://my.oschina.net/dake/blog/196767

VC读取PE文件的OEP(程序入口)相关推荐

  1. VC读取PE文件的OEP

    OEP是PE文件被加载时的起始地址,该值位于PE文件头的IMAGE_OPTIONAL_HEADER32结构体中.照着网上的教程写了一遍,收获不小,现在对PE文件的前两部分已经有一定的了解了. 下面的代 ...

  2. 图解VC++版PE文件解析器源码分析

    该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 2 PE结构解析的主要代码简要分析 首先看 ...

  3. VS VC 读取 INI文件

    1.获取应程序同极目录下的config.ini路劲void GetConfigFilePath(char *path,int len, char *file) {char module[256] = ...

  4. VC读取EXCEL文件

    2012-11-23 15:43 3026人阅读 评论(0) 收藏 举报 通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实 ...

  5. VC++读取txt文件指针的变化

    VC++在读取txt文本的时候,指针的位置是不断的变化的.是一点一点的向前推进的.在这个地方我们通过一个例子来分析VC++指针移动的情况,首先我们建立一个txt文本,并且在文本中输入一下面这些数据: ...

  6. ccs读取dat文件c语言程序,详解CCS中的.dat文件

    CCS支持的.dat文件的格式为: 文件头为 定数 数据格式 起始地址 页类型 数据块大小 1651             1                  80000000         0 ...

  7. c++语言读txt数据,关于C++中读取txt文件中字符串 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    #include<iostream> #include<fstream> #include<string> #include<vector> using ...

  8. ccs读取dat文件c语言程序,TMS320DM642学习----第六篇(CCS中.dat文件类型详解)

    1.如下为.dat文件中文件头的基本格式: MagicNumber Format StartingAddress PageNum Length [NewFormat] 下面是分别的解释: MagicN ...

  9. ccs读取dat文件c语言程序,CCS中dat文件的格式

    在CCS中,需要处理数据的时候有一种方式是采用load data,这时可以从文件中装入数据到板子的内存,数据文件格式有特定的要求,具体的格式如下: 文件头为 1651             1    ...

最新文章

  1. 802.1p 优先级与内部优先级的映射关系
  2. 解决 iOS 12.4 Killed: 9 的问题
  3. SAPSQL_IN_ITAB_ILLEGAL_OPTION dump
  4. 六、张正友标定法小结
  5. 【NOIP模拟】彩色树【树形dp】【树链剖分性质】【复杂度分析】
  6. caesar加密_如何编写Caesar密码:基本加密简介
  7. 北京林业大学计算机复试难度,北京林业大学考研难吗?一般要什么水平才可以进入?...
  8. OpenSubdiv:大规模并行CPU和GPU架构上实现高性能细分表面
  9. 【Arduino】开发入门【八】舵机操作+源代码
  10. c语言默认参数_GCC 11 将默认前端语言改成 C++ 17
  11. 解决方案架构师的职责
  12. [Spring实战系列](9)装配集合
  13. ANC主动降噪技术的原理
  14. 2021-07-11 layer与tier的区别(英语)
  15. 用例执行一半总是报错“An unknown server-side error occurred ...Original error: Error: socket hang up”
  16. java导出excel表格设置行高_EasyExcel之不使用对象灵活生成Excel,并且调整行高、自动列宽与自由合并...
  17. UA原生grid(sit-item-collection-viewer)主子表联动(直接用实体查询)、列表样式的新增
  18. 文本代码编辑器UltraEdit v26.00.0.74 中文版下载与破解方法【亲测有效】
  19. msray网址采集软件即将上线国外搜素引擎-QWANT
  20. 联想开机启动项按哪个_联想笔记本按哪个按键进入U盘启动|详解联想进入U盘启动的教程...

热门文章

  1. java队列(Queue)用法总结
  2. new bing的申请与使用教程
  3. 计算机高校应用现状的参考文献,学期计算机论文,关于高校专业应用为导向的小学期计算机课程改革方案相关参考文献资料-免费论文范文...
  4. Java网络爬虫-总结
  5. git clone出错:Failed to receive SOCKS4 connect request ack.
  6. M1 Ultra,这波很猛!
  7. 关于美赛论文书写经验
  8. “ChatGPT的问题、风险与机遇”会议综述
  9. java synthetic_Java冷知识(三)编译器的花招之synthetic
  10. Swim-Transform V2:用于目标检测,视觉大模型不再是难题(附源代码)