相关文章推荐
活泼的柚子  ·  blob转file ...·  1 月前    · 
纯真的橙子  ·  fp = ...·  1 年前    · 

(1)定位到PE文件头。

(2)从PE文件头中的IMAGE_OPTIONAL_HEADER32结构中取出数据目录表,并从第一个数据目录中得到导出表的地址。

(3)从导出表的nBase字段得到起始序号。

(4)将需要查找的导出序号减去起始序号,就得到了函数在入口地址表中的索引。

(5)检测索引值是否大于导出表的NumberOfFunctions字段的值,如果大于后者的话,说明输入的序号是无效的。

(6)用这个索引值在AddressOfFunctions字段指向的导出函数入口地址表中取出相应的项目,这就是函数的入口地址RVA值,当函数被装入内存的时候,这个RVA值加上模块实际装入的基址,就得到了函数真正的入口地址。

从函数名称查找入口地址

(1)最初的步骤是一样的,那就是首先得到导出表的地址。

(2)从导出表的NumberOfNames字段得到已命名函数的总数,并以这个数字作为循环的次数来构造一个循环。

(3)从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名相比较,如果没有任何一个函数名是符合的,表示文件中没有指定名称的函数。

(4)如果某一项定义的函数名与要查找的函数名符合,那么记下这个函数名在字符串地址表中的索引值,然后在AddressOfNameOrdinals 指向的数组中以同样的索引值取出数组项的值,暂且假定这个值为x。

(5)最后,以x值作为索引值,在AddressOfFunctions 字段指向的函数入口地址表中获取的RVA就是函数的入口地址。

使用VC环境开发的程序 入口 处的代码并非是所谓的main函数的代码,而是运行时态库代码,也就是说VC在链接生成 PE 文件 时, PE 入口 处的代码是VC自动添加上去的,在这段自动添加的代码中对运行时态库进行了初始化,并将程序运行时装载的基 地址 传给CRT 入口 函数,然后由CRT调用了用户编写的MAIN函数。 CVP中以追加方式将FileInfect追加到MessageBox后面时需要重定位FileInf 使用例子为: Windows.UI.Xaml.dll、010editor 1、 导出 ,重定位 地址 存放在哪里 DOS头-à PE 文件 (_IMAGE_NT_HEADERS)-à扩展头(IMAGE_OPTIONAL_HEADER32)-à数据目录 数据目录 中的内容: structIMAGE_DATA_DIRECTORY  Export 入口 介绍: 一个程序从最开头往下算大致可以分为DOS头,DOS头相关数据, PE 头,然后才是 文件 数据,我们要找的 入口 地址 写在了 PE 头里面。DOS头的长度是固定的,但其相关数据是不固定的,好在DOS头里有一个LONG类型的e_lfanew,这个变量记载了 PE 头相对DOS头的偏移。 IMAGE_NT_HEADERS是 PE 头结构体的宏,在32位和64位下分别对应_IMAGE_NT_HEADERS和_IMAGE_NT_HEADERS64。 ty pe def struct _IMAGE_NT_HEADERS PE 文件 中显示的所有 地址 基本都是RVA,倘若想要换算成VA一般需要加上基 地址 ImageBase与 文件 偏移 地址 RVA。 虚拟 地址 (VA=virtual address):每个32位 PE 文件 被加载到内存的时候都会被分配4GB的虚拟内存,虚拟 地址 等于“程序的相对虚拟 地址 +基 地址 ”。 相对虚拟 地址 (RVA=relatively virtual address):相对虚拟 地址 是相比较于 文件 开头的地 (1)MZ头:长度 40H,即4行乘16位,最前面的5A4D显示是MZ,是EXE标识,最后4个字节000000F0是el_fanew 字段,指向 PE 文件 地址 ,即 PE 文件 头指向000000F0处。(2) PE 文件 头: PE 标识往后20字节, PE 文件 头前2个字节014C是设备型号,之后2个字节0003是是节 数目, 示有3个节 。3、节 :每个节 40字节,节 数目在 PE 文件 头中查看,总共是节 数目×40字节。(2)DOS存根:从MZ头到 PE 头之间的部分,显示提示字符。(3) PE 可选 文件 头: PE 文件 头。 <br />大家好,最近在网上看了一下 PE 文件 结构的解释的文章,里面有一个修改 PE 文件 的示例,是向 PE 文件 插入一个消息框,以让目标 PE 文件 执行时首先显示插入的消息框,其中有一段代码如下:<br /><br />//计算新的程序 入口 地址 <br />DWORD dwNewEntryAddress = dwEntryWrite + dwCodeOffset;<br /><br />这段代码我看不明白,为什么要在最后加上代码偏移值呢?被写入的代码是写在dwEntryWrite 地址 处,把 入口 改在这个地方不就可以了么 关于 pe 中的 入口 和跳转问题作者:admin 日期:2009-08-27字体大小: 小 中 大 pe 里面的 入口 和跳转问题。在我一开始学习 pe 的时候曾经就被这两个问题困惑过,可能很多朋友在学习的过程中也会遇到,所以我想在这里把这两个问题说清楚一 。没什么技术含量大牛飘过啦。大家知道 pe 入口 是在IMAGE_FILE_HEADER里面AddressOfEntryPoint指定的。其实这个说得挺清楚... PE 文件 的全称是Portable Executable,意为可移植的可执行的 文件 ,常见的EXE、DLL、OCX、SYS、COM都是 PE 文件 PE 文件 是微软Windows操作系统上的程序 文件 (可能是间接被执行,如DLL)。它是跨win32平台的,只要运行在Windows上,不管是在什么体系的CPU上都可以运行 PE 文件 使用平面的 地址 空间,所有代码和数据都合并在一起,组成一个很大的结构, 文件 的内容被分