当前位置:鱼C工作室 >解密系列 >系统篇 > 查看文章

PE格式详细讲解7 – 系统篇07|解密系列

PE格式详细讲解7 – 系统篇07

 

让编程改变世界

Change the world by program


 

捷径并不是把弯路改直了,而是帮你把岔道堵上!

走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇!

岔路会将你引入万劫不复的深渊,并越走越深……

 

在开始讲解输入表(导入表)概念之前,请允许小甲鱼童鞋用简短的几句话来总结之前我们学过的内容,并做进一步的思想综合提升,注意咯!

首先,我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块。

这里我们需要注意的问题是:一个区块中的数据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。

例如接着要讲的输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为他们的属性都是可读不可写的。

 

其次,由于不同用途的数据有可能被放入同一个区块中,因此仅仅依靠区块表是无法确定和定位的。那要怎么办?

对了,PE 文件头中 IMAGE_OPTIONAL_DEADER32 结构的数据目录表来指出他们的位置。

我们可以由数据目录表来定位的数据包括输入表、输出表、资源、重定位表和TLS等15 种数据。(数据目录表,不要以为他在前边出现就不重要哦~)

 

这节课我们谈的是输入表,为什么需要输入表呢?因为我们从数据目录表得到的仅仅是一些指定数据的RVA 和数据块的尺寸。

很明显,不同的数据块中的数据组织方式(结构)是显然不同的,例如输入表和资源数据块中的数据就完全是牛马不相及的两个东西。

因此,我们想要深入了解PE 文件就必须了解这些数据的组织方式,以及了解系统是如何处理调用它们的。

 

输入函数

 

在代码分析或编程中经常遇到“输入函数(Import Functions,也称导入函数)”的概念。

这里我们就来解释下,输入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于相关的DLL 文件中,在调用者程序中只保留相关的函数信息(如函数名、DLL 文件名等)就可以。

对于磁盘上的PE 文件来说,它无法得知这些输入函数在内存中的地址,只有当PE 文件被装入内存后,Windows 加载器才将相关DLL 装入,并将调用输入函数的指令和函数实际所处的地址联系起来。

 

这就是“动态链接”的概念。动态链接是通过PE 文件中定义的“输入表”来完成的,输入表中保存的正是函数名和其驻留的DLL 名等。

实例预演(视频中将演示,这里只能截图)

之所以是预演,主要是因为咱还没对输入表进行解剖前就来给大家演示一下尝尝鲜找找滋味~不然学习总是无趣的和郁闷的~

输入函数

 

以上是咱这次实验的小青蛙哈~灰常简单的一个小程序,如图双击程序只显示一个对话窗口,然后就结束~试验用小程序,我们尽量的将内部的结构删减,调试起来才方便些。

我们这次体验的目的就是想靠所学的知识,试图来找到MessageBox 在内存中的地址。

注:MessageBox 是来自于USER32.DLL 动态链接库里的一个函数,我们通过对PE 文件的静态反编译分析来观察hello.exe 这个试验品是如何定位和调用MessageBox 这个在“异乡”的函数哈。

(MessageBox 有两个版本,一个是MessageBoxA 还有一个是MessageBoxW 分别带便ASCII码形式和UNICODE~历史故事了~)

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.