手动修复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)。
仅允许非商业转载,转载请注明出处
手动修复IAT的更多相关文章
- <逆向学习第三天>手动脱FSG壳,修复IAT。
其实对于简单的壳来说,脱壳常用的方法也无非是那几种,但是每种有每种的好处,具体使用那种方法视情况而定,我今天学习的这个壳很简单,但是重点在于修复IAT. 一.查壳: FSG 2.0的壳. 二.脱壳: ...
- 手动修复OneDrive的DNS污染屏蔽的方法
随着云计算的发展和微软云战略的持续推进,使用网盘进行文档存储.协同编辑与共享已成为文档操作的新流程.而Office.Office 365和OneDrive等微软产品是Windows用户的首选.但由于国 ...
- 防DNS劫持教程,手动修复本地DNS教程
防DNS劫持教程,手动修复本地DNS教程 该如何避免DNS劫持的问题呢?1. 请不要轻易连接陌生网络.2. 可以通过手动指定DNS(DNS用于将域名正确转换为您想访问的网站的作用),修改后你的网络应用 ...
- IE首页被篡改(手动修复)
所谓手动修复,即以不变应万变,修改注册表,其实工具软件也只是帮你代工而已. win + R 打开 “运行”,键入 “regedit.exe” 打开注册表编辑器,在 路径 HKEY_LOCAL_MACH ...
- SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步
原文:SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步 由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名 ...
- 手动修复 under-replicated blocks in HDFS
解决方式步骤: 1.进入hdfs的pod kubectl get pod -o wide | grep hdfs kubectl exec -ti hadoop-hdfs-namenode-hdfs1 ...
- 菜鸟脱壳之脱壳的基础知识(六)——手动查找IAT和修复Dump的程序
前面讲了如何寻找OEP和脱壳,有的时候,Dump出来的时候不能正常运行,是因为还有一个输入表没有进行处理,一些加密壳会在IAT加密上面大做文章,用HOOK - API的外壳地址来代替真是的IAT的地址 ...
- Hacker(20)----手动修复Windows系统漏洞
Win7系统中存在漏洞时,用户需要采用各种办法来修复系统中存在的漏洞,既可以使用Windows Update修复,也可使用360安全卫士来修复. 一.使用Windows Update修复系统漏洞 Wi ...
- 记录一次Orthanc dicom数据异常手动修复
问题复现场景 同一个StudyInstanceUID,对应两个不同的PatientID. 通俗讲,原本是一个病人的一次影像,却割裂成两个病人的影像,虽然两个病人不影响系统数据,但是同一个Study分别 ...
随机推荐
- LVS工作模式与调度算法
LVS三种工作模式.十种调度算法介绍 工作模式介绍: 1.Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,物理服务器可以分配 ...
- Java基础(7)-异常处理
异常处理 异常继承层次 Throwable |-Error 致命的错误无法处理 |-Exception |-IOException 系统资源读取失败等错误 |-RuntimeException(未检异 ...
- 揭开Socket编程的面纱(留着自己慢慢看)
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP?2. Socket在哪里呢?3. Socket ...
- Python3 从入门到出门
引:此文是自己学习python过程中的笔记和总结,适合有语言基础的人快速了解python3和没基础的作为学习的大纲,了解学习的方向:笔记是从多本书和视频上学习后的整合版. (一)初识python 1. ...
- OpenCV探索之路(十八):使用imwrite调整保存的图片质量
近日在用opencv做一些图像处理的操作时,需要对一些高分辨率的图像进行保存.比如,在操作一个容量为230M的图像后,并对该图像保存为JPG格式后,发现图像容量变为80M了!针对这个问题,忙了大半天, ...
- NEWS-包名-baseTest-类名-BaseDao
package baseTest; import java.sql.Connection;import java.sql.DriverManager;//通过配置文件读取BASEDAOimport j ...
- JS实现悬浮导航的制作--web前端
思想:导航在这里只有两种状态,一种是初始状态.一种是固定布局状态.实现悬浮导航其实就是通过Javascript脚本语言控制导航的两种状态,主要是对两种状态成立条件的判断,明确了这些,实现起来就不会太难 ...
- 二维坐标点排序(JavaScript)
今天给大家分享下最近web项目中出现的一个技术难点问题--坐标排序: 如下图所示,要求在前端页面上按顺序将下面5个模块的坐标依次保存至数据库 现在已知信息如下: 1.每个模块分别为一个div 2.每个 ...
- 小哈学Python第四课--运算符
运算符: 1.算数运算符: 2. 比较运算符 3.赋值运算符 4. 逻辑运算符: 5. 成员运算:
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...