sigewangdaiduie 发表于 2022-12-18 21:40

简单说说什么是IAT,简单聊聊怎么修复IAT

简单聊一聊IAT
新手在脱壳后发现脱壳后的程序报错或无法使用,有可能是IAT没有修复好,但什么是IAT呢?我简单聊一聊,我也是破解小白,这篇帖子是我好不容易搞明白了IAT,所以想分享一下,如果有错误,希望大佬指出来。
什么是IAT?
在了解IAT之前我们需要知道什么是pe文件、什么是dll文件:
这两个文件的介绍是我从网上寻找的解释:
1、PE文件
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)
当然,也可以把PE文件简单理解为日常使用的后缀名为EXE的应用程序、可执行文件。
2、DLL文件
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
当然,也可以把DLL文件理解为将函数进行封装的外置库,可以想象成当PE文件是一个人时,那DLL文件就是帮助你完成某件事的工具。大概吧!

当我们粗略的了解完了PE文件和DLL文件,接下来将开始上正餐,聊聊IAT了!

百度百科上的解释是:
IAT(Import Address Table) 由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL 中.当PE 文件被装入内存的时候,Windows 装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成.其中导入地址表就指示函数实际地址。
其实百度百科讲的很好,但下面还是来梳理一下IAT,这样可以更易于理解:
我们知道了PE文件,和PE文件的外置封装库DLL文件,那PE文件该怎么调用DLL文件呢?
1、当你在编写程序的时候,你只需要在源代码中写函数名和参数,编译器就会将程序所需的函数名和函数所在的DLL文件这两个信息写入的输入表中,当你的程序启动运行时操作系统根据输入表中记录的信息,将程序所需的DLL加载到进程地址空间当中。
2、程序所需的DLL文件加载完毕后,会获取到导入名称表INT中的函数名称,从而通过INT中的函数名称获取到函数在进程地址空间中的地址,最后将地址加载到导入地址表IAT当中。然后程序就可以正常调用IAT中这些函数地址了,毕竟你的程序里调用的地址不太可能是直接调用DLL里函数的地址,因为你不知道地址是多少
所以简单来说,IAT就是一个用来记录程序所用到的函数在PE文件进程空间中位置的表。
既然IAT是用来记录程序所用到的函数在PE文件进程空间中位置的表,那如果这个表出问题了,这个程序就没法正常调用DLL文件中的函数了,那程序不得出问题啊!所以脱壳后IAT的修复是必要的。


第一步:找到OEP我们先查壳,看看这是什么类型的壳。可以看到这个壳是一个UPX的壳,那我们先试着使用ESP定律法进行脱壳。加载时显示代码段可能被加密或压缩,代码分析的信息不可靠,问我们还要不要分析,这里都说不可靠了,那就点否,其实点啥都无所谓。单步步过【F8】pushad,将所有寄存器都压入栈,可以看到右上角寄存器窗口除了EIP之外只有ESP红了,说明我们可以通过ESP定律来脱壳,ESP定律脱壳这里就不多说了,是一种利用堆栈平衡来进行脱壳的手段。感兴趣的话可以看看FCG大佬的帖子:脱壳破解之详解ESP定律原理及作用 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn通过ESP定律找到了OEP,OEP为005025A6,得到了OEP,下一步我们就需要修复IAT了,但在这之前我们需要确认一样东西是否存在,那就是ASLR,它会将我们基址随机化,其他地址也会随基址变化而变化,所以不得不注意。第一张图可以看到基址为00400000,第二张图可以看到勾选了重定位已分离,所以我们不用担心ASLR的问题了。下一步我们可以进入call中寻找特征码为FF 15的call,也可以通过查找来寻找特征码为FF 15的call,寻找到特征码为FF 15的call后,我们可以回车进去看一下,可以发现call里的地址为系统领空,我们可以大胆猜测特征码为FF 15的call跳转到了加载到进程地址空间的DLL文件中的函数,而在进程地址空间中的DLL文件中函数的地址就加载在IAT当中。那我们知道这个call所去的地方是加载到进程地址空间的DLL文件中函数的地址,那么00527854这个地址中存的应该就是加载到进程地址空间的DLL文件中函数的地址了,既然如此,那我们直接数据窗口跟随就可以看到加载到进程地址空间的DLL文件中函数的地址了。确实如此,既然00527854中的值是加载到IAT中的函数地址,那我们往上翻找到第一个加载到IAT的函数地址。往上翻找到了第一个加载到IAT的函数地址00527000,再往下翻找到最后一个加载到IAT的函数地址。



最后一个加载到IAT的函数地址为0052795C,用最后一个减去第一个得到大小95C,你大小可以填1000、1500,你填的大小只能比95C大,不能比95C小。
填什么呢?填IAT修复工具的RVA和大小

在必需的IAT信息下填好OEP和RVA,以及大小,OEP是出口点,这里填的时候需要用OEP地址005025A6减去基址00400000,得到001025A6后填入OEP中,RVA同理,用第一个加载到IAT的函数地址减去基址,得到00127000填入RVA。
填好必需的IAT信息后,点击‘获取导入表’,得到如下图所示:

找到的导入表函数有些是无效的,我们需要做的就是将无效的导入表函数去除,我们可以点击右上角的‘显示无效的’,得到如下图所示:

我们接下来右击‘找到的导入表函数’窗口中的蓝色部分,点击‘剪切指针’或‘删除指针’:

清理完无效的导入表函数后,我们这个软件的IAT就修复好了,接下来点击‘修正转储’,找到dump好的软件,将修复好的IAT修正转储到dump好的软件中。

可以从日志中看到修正转储成功了,到此IAT我们就修复好了。

涛之雨 发表于 2022-12-19 23:31

不仅排版乱。。。od相关的图片还都很模糊。。。

排版的话推荐花5分钟学一下markdown。
图片的话。。。(应该是在虚拟机外面截虚拟机里界面的吧)

alongzhenggang 发表于 2022-12-22 20:19

sigewangdaiduie 发表于 2022-12-22 18:45
好,这个我去下个用,我在物理机截虚拟机的图确实不是很清晰,而且不好编辑,谢谢告知!

{:301_998:}
不知道

你懂么懂

我说的是 硬盘直通 挂载   

在虚拟机 里 截图软件自动保存指定的挂载盘

再或者 直接虚拟机 上论坛

sigewangdaiduie 发表于 2022-12-18 21:47

我没想到成品会如此的乱,是我操作失误,十分抱歉!

Anneliese 发表于 2022-12-20 11:02

感谢分享,正巧学下IAT原理

hahhahah 发表于 2022-12-20 11:33

感谢,学习了。

y21 发表于 2022-12-20 14:32

感谢分享

sigewangdaiduie 发表于 2022-12-20 14:46

涛之雨 发表于 2022-12-19 23:31
不仅排版乱。。。od相关的图片还都很模糊。。。

排版的话推荐花5分钟学一下markdown。


好嘞!感谢指导

chizha 发表于 2022-12-21 09:47

学习了,谢谢分享

yonghuming999 发表于 2022-12-21 12:45

感谢分享

Hacking2heart 发表于 2022-12-21 20:46

学习中,感谢分享。
页: [1] 2 3
查看完整版本: 简单说说什么是IAT,简单聊聊怎么修复IAT