鱼C论坛

 找回密码
 立即注册
查看: 3286|回复: 3

[学习笔记] 《解密系列-系统篇》第七讲:PE结构详解7

[复制链接]
发表于 2018-1-20 15:02:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2018-1-20 15:09 编辑

越努力,越幸运。欢迎大家来看我的笔记,不对的请各位大佬指正,谢谢

具体讲解可到: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 这个函数了
1.JPG

(3)在反汇编工具中找不到42A2AC这个地址,那么我们把42A2AC换算成存放在实际物理内存地址
(PS:这里默认装入基地址是400000,在区块中工具没有显示出来)
2.JPG

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 里边有啥神秘的东西吧?
3.JPG

哈哈,看到奇迹了吗?从282DC 地址读起,ASCII 码对应的值是MessageBoxA.USER32.dll 
怎么样,有点神秘的成就感吧~





谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记,不对的请各位大佬指教,谢谢

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-26 18:46:31 | 显示全部楼层
打卡学习,今天目标完成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-1 14:23:17 From FishC Mobile | 显示全部楼层
实际物理地址是指文件偏移地址吗
而虚拟地址是内存中运行时的地址吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-1 14:27:08 From FishC Mobile | 显示全部楼层
文件.exe的文件偏移地址是指在硬盘中的地址吗,求大神解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 02:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表