(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
文件
使用平面的
地址
空间,所有代码和数据都合并在一起,组成一个很大的结构,
文件
的内容被分