加密与解密(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定位到该地址,终于是找到了。

    实验完毕,找到了该该函数的名称,但是找不到它的地址。
0 0
原创粉丝点击