JavaShuo
栏目
标签
小甲鱼PE详解之输入表(导入表)详解(PE详解07)
时间 2019-12-09
标签
甲鱼
详解
输入
导入
繁體版
原文
原文链接
捷径并非把弯路改直了,而是帮你把岔道堵上!
走得弯路跟成长的速度是成正比的!不要惧怕走上弯路,弯路会让你懂得更多,最终仍是会在终点交汇!
岔路会将你引入万劫不复的深渊,并越走越深……
在开始讲解输入表(导入表)概念以前,请容许小甲鱼童鞋用简短的几句话来总结以前咱们学过的内容,并作进一步的思想综合提高,注意咯!
首先,咱们知道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. 咱们用曾经号称为屠龙刀的W32DAM 对hello.exe进行反编译,如图:
咱们能够看到这个程序只有两个导入模块(Import Module),分别导入来自两个动态连接库(USER32.DLL和KERNEL32.DLL)的若干函数,咱们还清晰可见,咱要跟踪的MessageBoxA 就在USER32.DLL 中,这里程序还自动给咱们定位了它的虚拟地址:2A2DC,但咱们不要用这个,由于咱们说过这回咱们是来探险的,凡事讲究人工……
咱们经过W32DASM 的查找功能找出MessageBox 这个函数代码的位置,并试图查看他的汇编跳转~
为啥,这要从汇编调用子程序提及啦~简单的说就是汇编语言要调用子程序会运用到CALL 和 RET这样的搭配来进行,学过咱《零基础入门学习汇编语言》的童鞋还记得小甲鱼当时的动画片演示吧?!上图……
各位看官看到了吧?push xxxx push xxxx push xxxx push xxxx 以后再来一个Call xxxx ……
没错,这就是调用函数的一个标准形式。每一个push 其实就是将所要调用的函数须要的参数入栈,为啥要入栈呢?这又要从地球的起源提及了……我这里就简单的说下吧:栈的发明,使得函数和子程序的出现成为可能!对于局部变量和参数,栈的特性最适合不过~不明白不急哈,这个是汇编语言和编译原理的范畴了,之后咱学习深刻天然会碰到,到时候再来详细解决就能够。
int MessageBox( HWND
hWnd
, LPCTSTR
lpText
, LPCTSTR
lpCaption
, UINT
uType
// style of message box
);
由定义可见MessageBox 函数
共有四个参数,所以咱们四次push xxxx 分别将参数按照STDCALL 的方式入栈以后,就能够CALL MessageBox 这个函数了。好,既然是CALL 咱们的目标函数了,经过反汇编咱们就能够观察到它的地址是:[0042A2AC],难道就这么简单?
42A2AC 就是目标函数的地址?
那咱们就直接把程序往下拉,试图找找这个 42A2AC 的地址吧~
但是…… ……
咱们悲剧的发觉,程序压根还没到
42A2AC
这地方,到了421FF8 就结束了!!
什么状况呢?
或许……或许……或许……
在没详细讲输入表时咱们还不能直接给你们答案……
好吧,小甲鱼这里提问一下,这是一个什么地址呢?偏移地址 or 虚拟地址?
恩,没错,这是一个VA 哈,那这个VA 上节课咱们说过能够换算成存放在实际物理内存上的方法。具体就是将这个VA 与该程序的各个区块的VA 地址逐一对比,因为PE 头文件有记载每一个区块的VA 地址也同时记载着它的实际物理地址,所以咱们能够经过判断该VA 位于哪一个区块内并求出与区块VA 的差值进而求出该VA 的实际物理地址。那既然前边直直的路子走不通,咱们就试下把他转换为物理地址试试吧?!
好吧,我知道我说话又绕口令了,咱就实例演示下,否则你们要喷了……上图……
咱们看到,咱的
42A2AC 地址加载咱的2A000 和 2B000 之间(改程序VC编写,映像基地址为400000打头哦~),所以咱们能够将该地址定位到改程序位于.idata 区块内。该区块的VA 起始地址为42A000,所以42A2AC - 42A000 = 2AC,raw data offs 跟咱们说该区块的物理地址是28000,所以42A2AC 这个VA 所对应的物理偏移地址就是 28000 + 2AC = 282AC。
咱用UE 打开看下282AC 这偏移地址上有啥东西……
282AC 这个地址上存放着 DCA20200 这个数据,翻译成ASCII 码也是莫名其妙的说~
但咱们把DCA20200 当成一个DWORD 类型的数据来读的话咱们获得数据 0002A2DC(还记得大端与小端吧)
慢着,是否是很熟悉,又是2A****开头,跟咱以前的地址是否是差很少?那好,咱们又按照刚才的方法转化为偏移地址试试,转化后获得的偏移地址是:282DC,咱再看看282DC 里边有啥神秘的东西吧?
哈哈,看到奇迹了吗?从282DC 地址读起,ASCII 码对应的值是MessageBoxA.USER32.dll 怎么样,有点神秘的成就感吧~ 但根本问题咱们仍是没能解决:MessageBox 的地址是?其实在这里咱们还不能帮你们解决这个问题,由于咱们缺少对输入表的深刻理解,因此咱们期待吧,下节课将揭开输入表的神秘面纱……
相关文章
1.
小甲鱼PE详解之输入表(导入表)详解(PE详解07)
2.
小甲鱼PE详解之输入表(导入表)详解2(PE详解08)
3.
小甲鱼PE详解之输入表(导出表)详解(PE详解09)
4.
小甲鱼PE详解之输出表(导出表)详解(PE详解09)
5.
PE格式详细讲解【06】详解-输入表(导入表)详解
6.
PE详解(根据小甲鱼总结)
7.
PE文件结构详解(四)PE导入表
8.
小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
9.
PE格式解析-区段表及导入表结构详解
10.
PE结构导出表详细解析
更多相关文章...
•
免费ARP详解
-
TCP/IP教程
•
*.hbm.xml映射文件详解
-
Hibernate教程
•
Flink 数据传输及反压详解
•
为了进字节跳动,我精选了29道Java经典算法题,带详细讲解
相关标签/搜索
详解
注解详解
超详解+图解
分步详解
iptables详解
ansible详解 一
Flexbox详解
超详解
jni详解
Spring教程
MyBatis教程
NoSQL教程
数据传输
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
Duang!超快Wi-Fi来袭
2.
机器学习-补充03 神经网络之**函数(Activation Function)
3.
git上开源maven项目部署 多module maven项目(多module maven+redis+tomcat+mysql)后台部署流程学习记录
4.
ecliple-tomcat部署maven项目方式之一
5.
eclipse新导入的项目经常可以看到“XX cannot be resolved to a type”的报错信息
6.
Spark RDD的依赖于DAG的工作原理
7.
VMware安装CentOS-8教程详解
8.
YDOOK:Java 项目 Spring 项目导入基本四大 jar 包 导入依赖,怎样在 IDEA 的项目结构中导入 jar 包 导入依赖
9.
简单方法使得putty(windows10上)可以免密登录树莓派
10.
idea怎么用本地maven
本站公众号
欢迎关注本站公众号,获取更多信息
相关文章
1.
小甲鱼PE详解之输入表(导入表)详解(PE详解07)
2.
小甲鱼PE详解之输入表(导入表)详解2(PE详解08)
3.
小甲鱼PE详解之输入表(导出表)详解(PE详解09)
4.
小甲鱼PE详解之输出表(导出表)详解(PE详解09)
5.
PE格式详细讲解【06】详解-输入表(导入表)详解
6.
PE详解(根据小甲鱼总结)
7.
PE文件结构详解(四)PE导入表
8.
小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
9.
PE格式解析-区段表及导入表结构详解
10.
PE结构导出表详细解析
>>更多相关文章<<