首页
社区
课程
招聘
[求助]ImportREC 1.6英文版 如何 修复 乱序的IAT
发表于: 2010-10-27 06:59 8839

[求助]ImportREC 1.6英文版 如何 修复 乱序的IAT

2010-10-27 06:59
8839
一直在用ImportREC修复 脱壳 文件的 IAT
只要 在内存中定位到的 API列表 中的 API地址 是连续 属于相同的 DLL的 。并且各个 DLL的 API地址 列表 之间 被 全零 的 一个Dword值分隔开,修复就很 傻瓜 。

可是今天 遇到的这个私壳的内存中的 API列表是乱序的 ,比如,第一个 API地址属于 Kernel32,第二个 就属于 User32,下一个又属于Kernel32,之间也没有全零 隔断 。
举例如下:
1 0013086C kernel32.dll 038C WriteFile
1 00130870 kernel32.dll 03AA lstrcmpi
1 00130874 user32.dll 0021 ChangeDisplaySettingsA
1 00130878 user32.dll 0036 CharUpperBuffA
1 0013087C user32.dll 01BE LoadImageA
1 00130880 user32.dll 01DD MessageBoxA
1 00130884 user32.dll 02D9 wsprintfA
1 00130888 user32.dll 02DB wvsprintfA
1 0013088C gdi32.dll 0004 AddFontResourceA
1 00130890 gdi32.dll 002E CreateCompatibleDC
1 00130894 gdi32.dll 0033 CreateDIBSection
1 00130898 gdi32.dll 008D DeleteDC
1 0013089C gdi32.dll 01F9 RemoveFontResourceA
1 001308A0 user32.dll 000E BeginPaint
1 001308A4 user32.dll 00C9 EndPaint
1 001308A8 gdi32.dll 0196 GetObjectA
1 001308AC gdi32.dll 020F SelectObject
1 001308B0 gdi32.dll 0090 DeleteObject
1 001308B4 gdi32.dll 0013 BitBlt
1 001308B8 user32.dll 017C GetWindowThreadProcessId
1 001308BC user32.dll 0244 SetActiveWindow
1 001308C0 user32.dll 0258 SetForegroundWindow
1 001308C4 user32.dll 0218 RegisterClassExA
1 001308C8 user32.dll 015E GetSystemMetrics
1 001308CC user32.dll 0061 CreateWindowExA
1 001308D0 user32.dll 013B GetMessageA
1 001308D4 user32.dll 02AB TranslateMessage
1 001308D8 user32.dll 00A2 DispatchMessageA
1 001308DC user32.dll 009A DestroyWindow
1 001308E0 user32.dll 00DF EnumWindows
1 001308E4 user32.dll 008F DefWindowProcA
1 001308E8 user32.dll 0200 PostMessageA
1 001308EC kernel32.dll 006D CreateThread

ImportREC 直接提示 加载的 列表 不可用 (Valid:NO)
我尝试通过按钮 Save Tree 将 列表导出,然后手工编辑 ,将相同DLL的 API合并在一起。
再用按钮 Load Tree导入,结果ImportREC竟然给自动排序了。刚刚的辛苦彻底白费。

请问大侠们有没有什么比较好的方法解决这个问题。

小弟的言辞可能有些混乱,希望已经描述清楚了问题的概况。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
可以试试UIF

h x x p://magic.shabgard.org/UIF.zip?Reload
2010-10-27 08:05
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢!
好像是个 命令行工具 。有时间试试看 。

刚刚尝试了一下(拖了N久时间)
发现UIF的确可以在内存中修复乱序的IAT。其会在目标程序空间重新申请一块儿高端内存,然后把IAT地址列表全部写在里面。

但是OD貌似无法再在UIF修复后Dump出所有的内存镜像(新地址太高了)。
我用的是OD右键菜单里面的插件 脱壳在当前调试的进程

所以再用ImportREC修复,直接提示
输入地址表问题:抓取的文件无效!此抓取的文件不符合RVA值偏移

而用OD右键菜单另一个Dump方式Make dump of process
不知道为什么MZ头,PE头,头两个节都是全零。
2010-10-27 08:29
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
每个壳都有对应的修复乱序的吧
2010-10-27 10:15
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
私壳呢?只能自己写专门的脚本修复?
2010-10-28 00:38
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我遇到过个什么壳,它是把不同DLL中间隔开的那个DWORD的0填写为一个指向本模块的函数地址指针。这样也没法用ImportREC直接修复,我就只好把这几个函数地址指针改成0修复掉,再修改程序入口先执行将那几个函数地址指针还原的代码,最后jmp回原程序入口。我估计LZ这个也没其他什么好方法。
2010-10-28 10:53
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我面临的这个私壳就是乱序。几个DLL的API地址相互之间乱插而已。所以之间并没有全零Dword的隔断。
自己感觉手工编辑IAT也能修复。但是如果已经有好用的工具,那不省事多了。
2010-11-11 07:29
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
刚刚尝试了一下(拖了N久时间)
发现UIF的确可以在内存中修复乱序的IAT。其会在目标程序空间重新申请一块儿高端内存,然后把IAT地址列表全部写在里面。

但是OD貌似无法再在UIF修复后Dump出所有的内存镜像(新地址太高了)。
我用的是OD右键菜单里面的插件 脱壳在当前调试的进程

所以再用ImportREC修复,直接提示
输入地址表问题:抓取的文件无效!此抓取的文件不符合RVA值偏移

而用OD右键菜单另一个Dump方式Make dump of process
不知道为什么MZ头,PE头,头两个节都是全零。
===================================================
基本上搞定了。
原来UIF需要手工指定IAT的VA。如果不填,就会默认申请新内存空间,并把IAT放进去。这样OD就没法Dump了。
我尝试让UIF覆盖了原来的IAT地址。

现在用 OD dump出来的 文件虽然还是无法运行(异常),但是用IDA分析已经可以了。所有相关的API都能自动识别出来。
基本上算是达到了目的。

希望能继续找出异常的原因。争取让脱壳的文件也能跑。
2010-11-11 07:36
0
雪    币: 89
活跃值: (214)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用K大的人肉流(一个一个手动填补),相信会成功~时间就是太久了。呵呵……不过方便你自己学习
2010-11-26 00:22
0
游客
登录 | 注册 方可回帖
返回
//