加密与解密(PE结构笔记④)
来源:互联网 发布:淘宝生意参谋怎么使用 编辑:程序博客网 时间:2024/06/03 19:16
实战:手工查找输入表中的函数
推荐书籍:《加密与解密》
推荐教程:鱼C工作室加密与解密系列系统篇
详解输入表(又称导入表)。
PE文件中的数据载入内存后根据不同页面属性被划分为很多区块,并有区块表来描述这些区块。一个区块中的数据仅仅是由于属性相同而放在一起,并不一定是同一种用途的内容。不同种用途的数据可能会被放在同一个区块中,因此仅仅依靠区块表无法定位,还要依靠IMAGE_OPTIONAL_HEADER32结构的数据目录表里指出它们的位置。
输入函数:在代码中,我们经常会遇到这个输入函数,输入函数指被程序调用但其代码又不再程序中的函数,这些函数的代码位于相关的DLL文件中,在调用者程序只保留相关的函数信息。
对于磁盘上的PE 文件来说,它无法得知这些输入函数在内存中的地址,只有当PE 文件被装入内存后,Windows 加载器才将相关DLL 装入,并将调用输入函数的指令和函数实际所处的地址联系起来。
这就是“动态链接”的概念。动态链接是通过PE 文件中定义的“输入表”来完成的,输入表中保存的正是函数名和其驻留的DLL 名等。
我们用一个Win32程序来做测试,寻找这个程序的MessageBox函数在内存中的地址。
通过对PE 文件的静态反编译分析来观察这个Test程序如何定位和调用MessageBox这个函数。
使用工具:W32Dasm静态反编译工具(当年被称为解密人的屠龙宝刀)
载入Test程序之后↓
可以看到这个程序调用了三个动态链接库,这几个都是系统重要的动态链接库。
表示只用了USER32.dll动态链接库中的一个函数,即MessageBoxW函数,虽然左侧有写函数的地址,但是我们还是要靠手动,掌握了原理性的东西,就凌驾在工具之上,要驾驭工具而不是被工具驾驭。
通过查找功能试图找到MessageBoxW函数的源代码。
首先第一句代码Call dword ptr [00419164]是目标函数的地址?可惜程序压根就没有到419164H这个地址,因为程序是运行时才调用这个动态链接库的,所以代码现在不在程序中。
再思考,400000不是VC程序默认加载到内存的地址吗?(虽然我用VS写的)那我们可以如何利用这个地址?00419164是一个VA,用PE结构查看工具看这个VA落在了哪个区块上,具体就是查一下区块表看19164H偏移地址大概在哪个区块表中。将这个VA与该程序的各个区块的VA地址逐一对比,由于PE 头文件有记载每个区块的VA地址也同时记载着它的实际物理地址。
通过查看,知道这个地址落在了idata区块表中。19164-19000=164H,得到的这个差值RVA,利用UE打开该文件,加上这个区块在磁盘中的起始地址,6600+164=6764H中。
00019378H,什么鬼?19378H-19164H=214H,6764H+214H=6978H,吭臭+G定位到该地址,终于是找到了。
实验完毕,找到了该该函数的名称,但是找不到它的地址。
推荐书籍:《加密与解密》
推荐教程:鱼C工作室加密与解密系列系统篇
详解输入表(又称导入表)。
PE文件中的数据载入内存后根据不同页面属性被划分为很多区块,并有区块表来描述这些区块。一个区块中的数据仅仅是由于属性相同而放在一起,并不一定是同一种用途的内容。不同种用途的数据可能会被放在同一个区块中,因此仅仅依靠区块表无法定位,还要依靠IMAGE_OPTIONAL_HEADER32结构的数据目录表里指出它们的位置。
输入函数:在代码中,我们经常会遇到这个输入函数,输入函数指被程序调用但其代码又不再程序中的函数,这些函数的代码位于相关的DLL文件中,在调用者程序只保留相关的函数信息。
对于磁盘上的PE 文件来说,它无法得知这些输入函数在内存中的地址,只有当PE 文件被装入内存后,Windows 加载器才将相关DLL 装入,并将调用输入函数的指令和函数实际所处的地址联系起来。
这就是“动态链接”的概念。动态链接是通过PE 文件中定义的“输入表”来完成的,输入表中保存的正是函数名和其驻留的DLL 名等。
我们用一个Win32程序来做测试,寻找这个程序的MessageBox函数在内存中的地址。
通过对PE 文件的静态反编译分析来观察这个Test程序如何定位和调用MessageBox这个函数。
使用工具:W32Dasm静态反编译工具(当年被称为解密人的屠龙宝刀)
载入Test程序之后↓
可以看到这个程序调用了三个动态链接库,这几个都是系统重要的动态链接库。
表示只用了USER32.dll动态链接库中的一个函数,即MessageBoxW函数,虽然左侧有写函数的地址,但是我们还是要靠手动,掌握了原理性的东西,就凌驾在工具之上,要驾驭工具而不是被工具驾驭。
通过查找功能试图找到MessageBoxW函数的源代码。
首先第一句代码Call dword ptr [00419164]是目标函数的地址?可惜程序压根就没有到419164H这个地址,因为程序是运行时才调用这个动态链接库的,所以代码现在不在程序中。
再思考,400000不是VC程序默认加载到内存的地址吗?(虽然我用VS写的)那我们可以如何利用这个地址?00419164是一个VA,用PE结构查看工具看这个VA落在了哪个区块上,具体就是查一下区块表看19164H偏移地址大概在哪个区块表中。将这个VA与该程序的各个区块的VA地址逐一对比,由于PE 头文件有记载每个区块的VA地址也同时记载着它的实际物理地址。
通过查看,知道这个地址落在了idata区块表中。19164-19000=164H,得到的这个差值RVA,利用UE打开该文件,加上这个区块在磁盘中的起始地址,6600+164=6764H中。
00019378H,什么鬼?19378H-19164H=214H,6764H+214H=6978H,吭臭+G定位到该地址,终于是找到了。
实验完毕,找到了该该函数的名称,但是找不到它的地址。
0 0
- 加密与解密(PE结构笔记④)
- 加密与解密(PE结构笔记_概述)
- 加密与解密(PE结构笔记①)
- 加密与解密(PE结构笔记②)
- 加密与解密(PE结构笔记③)
- 加密与解密(PE结构笔记⑤)
- 加密与解密(PE结构笔记⑥)
- 加密与解密(PE结构笔记⑦)
- 《加密与解密》4 PE
- 《加密与解密》学习笔记(二) - 加密算法和PE文件
- 《加密与解密》3 初步PE
- 加密与解密笔记
- 《加密与解密》笔记(一)
- 《加密与解密》笔记(二)
- 《加密与解密》笔记(三)
- 《加密与解密》笔记三(一)
- 《加密与解密》笔记三(二)
- 《加密与解密》笔记四(一)
- poj 2240 Arbitrage 【最短路&&floyd】
- poj1163 The Triangle
- Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本
- 加密与解密(PE结构笔记③)
- project euler 56
- 加密与解密(PE结构笔记④)
- JAVA一个完整的QQ登录界面,JFrame中的一些个性化设置功能
- project euler 57
- HTML学习笔记之--HTML主体的常用设置
- leetcode Ugly Number
- [转]排查线程池使用情况,可定时任务统计.打印到指定日志. 获取系统扩容,线程池改造信息.
- hpuoj 1720: 感恩节KK专场——面试难题【贪心】
- 加密与解密(PE结构笔记⑤)
- 39.XML数据解析的DOM解析