《解密系列-系统篇》第七讲:PE结构详解7
本帖最后由 shuiyu 于 2018-1-20 15:09 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:},不对的请各位大佬指正,谢谢{:10_254:}
具体讲解可到:http://blog.csdn.net/shuiyu486/article/details/79111192
一、复习复习
(1)首先,我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块。这里我们需要注意的问题是:一个区块中的数据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。例如接着要讲的输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为他们的属性都是可读不可写的。(所以我们不能根据区块名字来判断区块的属性,在上讲中我们也重点讲述了)
(2)其次,由于不同用途的数据有可能被放入同一个区块中,因此仅仅依靠区块表是无法确定和定位的。那要怎么办?对了,PE 文件头中 IMAGE_OPTIONAL_HEADER32 结构的数据目录表来指出他们的位置,我们可以由数据目录表来定位的数据包括输入表、输出表、资源、重定位表和TLS等15 种数据。(数据目录表,不要以为他在前边出现就不重要哦~)
二、输入函数
(1)这节课我们谈的是输入表,为什么需要输入表呢?因为我们从数据目录表得到的仅仅是一些指定数据的RVA 和数据块的尺寸,很明显,不同的数据块中的数据组织方式(结构)是显然不同的,例如输入表和资源数据块中的数据就完全是牛马不相及的两个东西。因此,我们想要深入了解PE 文件就必须了解这些数据的组织方式,以及了解系统是如何处理调用它们的。所以我们要先了解输出函数
(2)在代码分析或编程中经常遇到“输入函数(Import Functions,也称导入函数)”的概念。这里我们就来解释下,输入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于相关的DLL 文件中,在调用者程序中只保留相关的函数信息(如函数名、DLL 文件名等)就可以。对于磁盘上的PE 文件来说,它无法得知这些输入函数在内存中的地址,只有当PE 文件被装入内存后,Windows 加载器才将相关DLL 装入,并将调用输入函数的指令和函数实际所处的地址联系起来。这就是“动态链接”的概念。动态链接是通过PE 文件中定义的“输入表”来完成的,输入表中保存的正是函数名和其驻留的DLL 名等。
三、实例:试图找到MessageBox 在内存中的地址。
(1)使用反汇编工具W32DAM对hello.exe进行反编译,通过W32DASM 的查找功能找出MessageBox 这个函数代码的位置。
(2)push xxxx push xxxx push xxxx push xxxx 之后再来一个Call xxxx ……没错,这就是调用函数的一个标准形式。
int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType // style of message box );由定义可见MessageBox 函数共有四个参数,因此我们四次push xxxx 分别将参数按照STDCALL 的方式入栈之后,就可以CALL MessageBox 这个函数了
(3)在反汇编工具中找不到42A2AC这个地址,那么我们把42A2AC换算成存放在实际物理内存地址:
(PS:这里默认装入基地址是400000,在区块中工具没有显示出来)
1.定位目标 RVA(0042A2AC) 处于具体的哪个区块?
首先确定了在".idata"区块。
2.得到目标 RVA 相对于起始地址的偏移量 RVA2。
所在区块的起始RVA为:42A000
则RVA2=42A2AC-42A000=2AC
3.真正的文件偏移地址=区块在文件中所处的偏移地址+RVA2。
即:428000+2AC=4282AC
(4)使用二进制查看器(例如:UE、winhex)打开看下282AC 这偏移地址上有啥东西。282AC 这个地址上存放着 DCA20200 这个数据,翻译成ASCII 码也是莫名其妙的说~但我们把DCA20200 当成一个DWORD 类型的数据来读的话我们得到数据 0002A2DC(还记得大端与小端吧)
慢着,是不是很熟悉,又是2Axxxx开头,跟咱之前的地址是不是差不多?那好,我们又按照刚才的方法转化为偏移地址试试,转化后得到的偏移地址是:282DC,咱再看看282DC 里边有啥神秘的东西吧?
哈哈,看到奇迹了吗?从282DC 地址读起,ASCII 码对应的值是MessageBoxA.USER32.dll
怎么样,有点神秘的成就感吧~
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:},不对的请各位大佬指教,谢谢{:10_254:}
打卡学习,今天目标完成 实际物理地址是指文件偏移地址吗
而虚拟地址是内存中运行时的地址吗 文件.exe的文件偏移地址是指在硬盘中的地址吗,求大神解答
页:
[1]