手动修复IAT

现在我们已经了解了IAT的的工作原理,现在我们来一起学习手动修复IAT,一方面是深入了解运行过程一方面是为了避免遇到有些阻碍自动修复IAT的壳时不知所措。

首先我们用ESP定律找到加了UPX壳后的OEP,现在我们处于OEP处,原程序区段已经解密完毕,我们现在可以进行dump了。

前面已经提到过,有很多dump的工具,OD有一个款插件OllyDump的dump效果也不错,这里我们来使用另外一个工具PE TOOLS来进行dump。

PE TOOLS的界面是这样的,我们用PE-TOOLS定位到CRACKME UPX所在的进程。单击鼠标右键选择-Dump Full。、

这里,我们就dump完毕了,接下来我们来修复IAT,关闭PE TOOLS,将dump后的dumped.exe保存到CRACKME UPX所在的目录中。

我们知道没有修复IAT,是不能运行的,我们双击Dumped.exe看看会发生什么。

提示无效的win32程序,我们需要修复IAT,我们需要用到一个工具,名字叫做Import REConstructor,不要关闭OD,将让其断在OEP处,Import REConstructor需要用到它。

运行Import REConstructor,定位到CRACKME UPX所在的进程。

这里很多初学者可能会有疑问-如何定位IAT的起始位置和结束位置呢?我们知道当前该CRACKME UPX进程停在了OEP处,此时壳已经将导入表破坏了,我们知道IID项的第四个字段为动态库名称字符串的指针,第五个字段为其对应IAT项第一个元素的地址,这些已经被壳破坏了,我们需要通过其他方式来定位。

我们知道API函数的调用通常是通过间接跳转或者间接CALL来实现的。

JMP [XXXXXXX] or CALL [XXXXXX]

上一章我们已经介绍过了,这样是直接调用IAT中保存的API函数地址。我们来看看CRACKME UPX。

这里我们看到第二行的CALL指令,OD提示调用的是Kernel32.dll中的GetModuleHandleA,是个间接跳转,我们选中这一行,单击鼠标右键选择-Follow。

这里我们定位到获取IAT中函数地址的跳转表,这里就是该程序将要调用到的一些API函数,我们可以看到这些跳转指令的都是以机器码FF 25开头的,有些教程里面说直接搜索二进制FF 25就可以快速的定位该跳表。

其实,并不是所有的程序都通过这种间接跳转来调用API函数,所以直接搜索FF 25这种方法有时候会失败,而通过定位某个API函数的调用处,然后Follow到跳表是这种方式才是一直有效的。

这里我们看到JMP [403238]:

403238是IAT的其中一个元素,里面保存的是GetModuleHandleA这个API函数的入口地址,我们dump出来的程序的IAT部分跟这里是一样的,我们来看看IAT的起始位置和结束位置分别在哪儿。

其实,大家可以通过跳转表中最小的地址和最大的地址算出IAT的起始位置和结束位置,但是比较慢,比较好的做法是,直接将数据窗口往上滚动,我们知道IAT的每个元素中都保存了一个API函数的入口地址,比如这里的76861245,在数据窗口中显示的形式为45 12 86 76 (小端存储),我们将显示列数调整为两列,这样看起来更方便一些。

这里我们看到的就是整个IAT了,我们直接下拉到IAT的尾部,我们知道属于同一个动态库的API函数地址都是连续存放的,不同的动态库函数地址列表是用零隔开的。

有一些壳会将这部分全部填零,使得我们的IAT重建工作变得异常困难,这里由于原程序还需要调用这些API函数,所以该壳没有将这部分填零,我们现在来看看其中一个动态库的IAT项,如下:

这里显示了该DLL中的三个API函数,入口地址都是7C XXXXXX的形式,然后紧接着是一个零。

我们单击工具栏中的M按钮看看7C开头的地址是属于哪个DLL的。

我们可以看到这几个地址处于kernel32.dll的代码段范围内。

当然在你们的机器上kernel32.dll可能在别的地址处,但在我的机器上,这几个函数地址是属于kernel32.dll的。

属于kernel32.dll中的函数地址这里我用粉红色标注出来了,我们再来看看77DXXXXX这类地址是属于哪个DLL的。

这里我们可以看到77DXXXXX这类地址是属于user32.dll的,我也用粉红色标注出来了。

我们可以看到user32.dll的这些函数地址项上面是全零的,表示IAT的起始地址为403184,403184中存放的了IAT中的第一个元素。

这里我们用红线标注出来了,403184是IAT的起始地址。有些强壳可能会将IAT前后都填充上垃圾数据,让我们定位IAT的起始位置和结束位置更加困难。但是我们知道IAT中的数值都是属于某个动态库代码段范围内的,如果我们发现某数值不属于任何一个动态库的代码段的话,就说明该数值是垃圾数据。

现在我们知道了IAT开始于403184,我们现在来看一看IAT的结束位置在哪里。

后面我们会遇到有些壳会将IAT重定向到壳的例程中去,然后再跳转到API函数的入口处,这样的话,上面这样定位IAT的起始和结束位置的做法就行不通了。该如何应对这样情况,我们后面再来介绍。

这里我们可以看到IAT的最后一个元素的地址形式为76XXXXXX,我们来看看它是属于哪个DLL的。

这里我们可以看到其是属于COMDLG32.DLL的,后面全是零了,所以40328C是IAT的结束位置。

好了,现在我们知道了IAT的起始位置和结束位置。

begin:403184

end:40328c

===========================================================================================================

Import REConstructor重建IAT需要三项指标:

1)IAT的起始地址,这里是403184,减去映像基址400000就得到了3184(RVA:相对虚拟地址)。

2)IAT的大小,IAT的大小 = 40328C - 403184 = 108(十六进制)

3)OEP = 401000(虚拟地址)- 映像基址400000 = 1000(OEP的RVA)。

时间: 2024-12-23 02:25:02

手动修复IAT的相关文章

实战处理mysql主从延时不一致之手动修复

前2天经常被同事反应crm后台系统和前台,经常报前后查询不一致的问题.一开始也很抓狂,从集群.日志跟踪.网络转包等方面排查,都没找到原因,后来经过和研发同事一起沟通,提出线上mysql主从数据库可能不一致导致,于是立马登陆mysql主从服务器,查看复制状态,到这很明显问题就找到. 手动修复主从延时不一致,主库完整mysqldump导出,注意用的参数.经过实践,是线上成功修复主从不一致的结果哦.还有个奇葩的问题,就是刚修复主从不一致,很快又出现,延时又拉很大.到这你是否会想到,主库有大量数据的写入

手动修复OneDrive的DNS污染屏蔽的方法

随着云计算的发展和微软云战略的持续推进,使用网盘进行文档存储.协同编辑与共享已成为文档操作的新流程.而Office.Office 365和OneDrive等微软产品是Windows用户的首选.但由于国内对Ondrive的DNS污染屏蔽,导致在浏览器端无法使用OneDrive的情况发生,跟用户到来极大不便.下面介绍的就是手动修复OneDrive的DNS污染屏蔽的方法. 对于使用Windows 7版本以上用户以“管理员身份”打开记事本. File=>Open,浏览到“C:\Windows\Syste

手动修复 under-replicated blocks in HDFS

解决方式步骤: 1.进入hdfs的pod kubectl get pod -o wide | grep hdfs kubectl exec -ti hadoop-hdfs-namenode-hdfs1-948569108-c5d70 bash 2.获取票据 kinit -kt /etc/hdfs1/conf/hdfs.keytab hdfs/gz232-112 3.查询每个blocks信息 hdfs fsck -blocks -files -locations / 4.找出replication

Hacker(20)----手动修复Windows系统漏洞

Win7系统中存在漏洞时,用户需要采用各种办法来修复系统中存在的漏洞,既可以使用Windows Update修复,也可使用360安全卫士来修复. 一.使用Windows Update修复系统漏洞 Windows Update时Microsoft公司提供的一款自动更新工具,该工具提供了漏洞补丁的安装.驱动程序和软件的升级等功能.利用Windows Update可以更新当前的系统,扩展系统的功能,让系统支持更多的软.硬件,解决各种兼容性问题,打造更安全.更稳定的系统. 1)打开控制面板 2)单击Wi

SqlServer 禁止架构更改的复制中手动修复使在发布和订阅中分别增加字段同步

由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名字段,怎么使这发布和订阅的两个字段建立同步关系呢? 下面就测试更改:此次发布类型为事务复制的可更新订阅,其他类型的发布没有测试. 首先建立事务复制的可更新订阅,建立好之后. 在发布创建一张测试表: CREATE TABLE [dbo].[DemoTab]( [Guid] [uniqueidentifier] NOT NULL, [SID] [varbinary](85) NOT NUL

Ceph手动修复mon 集群

目录 一.背景介绍 二. 解决过程 一.背景介绍 ceph 版本为L版,集群由于异常断电,导致文件丢失,ceph mon 数据文件store.db/目录下的sst 文件丢失,所以无法正常启动. 本集群有三台mon节点,其中有一台mon 节点的服务可以正常启动,另外两台无法正常启动. 二. 解决过程 因为判断可能出现文件丢失导致的mon无法启动,所以决定重做另两台mon来解决问题 1.本环境中control3的mon是好的,control1和control2是坏的 在control3上导出monm

手动脱FSG壳实战

作者:Fly2015 对于FSG壳.之前没有接触过是第一次接触.这次拿来脱壳的程序仍然是吾爱破解论坛破解培训的作业3的程序.对于这个壳折腾了一会儿,后来还是被搞定了. 1.查壳 首先对该程序(吾爱破解培训第一课作业三.exe)进行查壳: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 非常遗憾.这次

手动脱FSG壳实战--吾爱破解培训第一课作业3

作者:Fly2015 对于FSG壳,之前没有接触过是第一次接触,这次拿来脱壳的程序仍然是吾爱破解论坛破解培训的作业3的程序.对于这个壳折腾了一会儿,后来还是被搞定了. 1.查壳 首先对该程序(吾爱破解培训第一课作业三.exe)进行查壳: 很遗憾,这次DIE也不行了,不过没事. 2.脱壳 OD载入该加壳的程序进行分析,下面是入口点的汇编代码: 起初对于该种加壳程序也是比较陌生,但是由于OD使用的还算熟悉,以及结合该加壳程序获取函数的API调用地址的特点,很快发现了该程序的关键点汇编: 于是在地址0

PEtools

// PETools.cpp : Defines the entry point for the console application.// #include "stdafx.h"#include <windows.h>#include <malloc.h> DWORD len=0; //记录文件读取时的大小 作为还原内存镜像缓冲区时的长度 //==========================================================