首页
社区
课程
招聘
[原创]通过x64dbg脚本功能修复IAT表
发表于: 2022-8-2 01:34 28548

[原创]通过x64dbg脚本功能修复IAT表

2022-8-2 01:34
28548

[PEDIY.华章 Crackme 竞赛 2009] [第十回] –ninejs
感兴趣可自行去下载,看到下面评论也不少在说会dump但不会修复IAT表,故开此贴简单介绍一下刚学的方法

通过栈平衡应该可以很快定位到OEP位置,这种基础操作不再赘述
确定入口点在0x0047148B,此处下硬件执行断点,方便下次快速定位
图片描述

直接先 dump 一手,有问题再慢慢修
x64dbg 下方控制台可输入scylla指令,调出 scylla 工具,直接点上方图标也可以
图片描述图片描述
确认 OEP 地址是否正确,然后点击 dump,成功后可以看到源文件目录下多了一个后缀为 xxx_dump 的文件,双击运行
不出意外的话是无法正常运行的,这时候不要慌,将此文件拖入 x64dbg,咱们一步步看问题出在哪了

这个 x64dbg 的脚本语法和汇编还挺像,里面可以用变量,可以用条件跳,可以添加段声明,这里简单说一下老王的思路
他首先确定了 IAT 表的范围,然后直接对 IAT 表进行遍历,把 EIP 依次设为表中的地址开始跑,每跑完一次就把获取到的地址写回,跑完即可把 IAT 表修复
但他这个判定方法很奇葩,还记得我们上面说的call [0x475080],这个函数是通过ret下方的四个字节作为跳板跳到系统 API,他这就是吃定了每个函数都用这种方法跳转
但现实可能真的这么简单吗?然后课堂上就被打脸了,有的地方用的是jmp xxx,有的地方是call reg,这种跳转的,脚本根本无法正常获取到地址,最后老王只能灰溜溜的手动修复了剩下的部分

欸嘿,是时候到我表演真正的技术了!经过我花了数小时仔仔细细,认认真真把 x64dbg 手册翻了个遍,终于我悟了,老王他不行,我行!开玩笑哈,我就是吹水比他强
首先咱们还是基于老王这个思想进行架构,遍历没问题,修改EIP没问题,但置单步和这个判定逻辑咱们得改,自己置单步实在是太慢了,我们可以用 x64dbg 的 api,让他帮我们跑,这样效率会更高,比如说像“跟踪”菜单里的“步进直到条件满足”,直接在这里写暂停条件肯定比我们自己置单步判断条件来的快,我这里主要用到了一个重要 API:RunToParty,这个函数的功能是运行到指定模块,参数0为用户模块,参数1为系统模块,我的想法很简单,我管你是用什么方式跳转的,反正你肯定要跳转到系统模块,只要在这个时候断下,我们就能拿到系统函数的首地址,我本来这里用的是模块地址范围做逻辑判断的,正好看到有这么一个函数,倒省了我一番心思,ok,上代码

我的这种写法 x64dbg 也是支持的,是不是十分的简洁明了,运行完脚本之后,可以看到 IAT 表已经被完美修复
图片描述

图片描述
图片描述
这时候我们再打开scylla工具,确定好 OEP,直接点击 IAT AutoSearch,然后点击 Get Imports,此时表已经能被加载出来,点击右侧的 Fix Dump,选择我们之前 dump 出来无法正常运行的文件,大功告成,新生成的xxx_dump_SCY已经能够完美运行,拖进 IDA 也可以清楚的看到调用的函数,收工!

// 运行到OEP
bph 0x47148b        // 设定硬件执行断点
g
 
// 导入表范围
// 表范围可以通过内存页跳转至 0x475080 直接看出来
impStart = 0x00475000
impEnd = 0x00475120
 
WHILEBEGIN:
    //取出一项
    mov itaItem, dword:[impStart]
 
    //跳过0
    cmp itaItem, 0
    jz WHILECONTINUE
 
    //设为新的EIP
    mov eip, itaItem
 
    //单步,直到遇到ret
    SETBEGIN:
        sti         // 置单步
 
        // 判断是否到达ret
        mov code, byte:[eip]
                // ret的机器码为0xC3
        cmp code, 0xC3
        jnz SETBEGIN
 
    //从栈顶取出API地址,存入IAT对应项
    mov apiAddr, dword:[esp]
    mov dword:[impStart],apiAddr
 
WHILECONTINUE:
    add impStart, 4
        cmp impStart, impEnd
        jb WHILEBEGIN
 
ret
// 运行到OEP
bph 0x47148b        // 设定硬件执行断点
g
 
// 导入表范围
// 表范围可以通过内存页跳转至 0x475080 直接看出来
impStart = 0x00475000
impEnd = 0x00475120
 
WHILEBEGIN:
    //取出一项
    mov itaItem, dword:[impStart]
 
    //跳过0
    cmp itaItem, 0
    jz WHILECONTINUE
 
    //设为新的EIP
    mov eip, itaItem
 
    //单步,直到遇到ret
    SETBEGIN:
        sti         // 置单步
 
        // 判断是否到达ret
        mov code, byte:[eip]
                // ret的机器码为0xC3
        cmp code, 0xC3
        jnz SETBEGIN
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 14
支持
分享
最新回复 (17)
雪    币: 3517
活跃值: (2823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
分析的很透彻
2022-8-2 07:20
0
雪    币: 8845
活跃值: (5341)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
学习了。
2022-8-2 09:20
0
雪    币: 950
活跃值: (9946)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
4

学习了. 脚本加了个log. 方便看日志. 

$ArrayPtr = 475000
$ArrayEnd = 475120
 
Loop:
cmp dword:[$ArrayPtr], 0    // 跳过模块空隙
je Next
 
EIP = dword:[$ArrayPtr]
log "cur EIP is 0x{x:cip}"
RunToParty 1                // 执行到系统模块断下
log "kernel EIP is {a:cip}"
dword:[$ArrayPtr] = EIP     // 取当前地址

Next:
 
$ArrayPtr += 4              // 指向下一块地址
cmp $ArrayPtr, $ArrayEnd    // 判断是否结束
jne Loop
ret


最后于 2022-8-2 10:19 被TkBinary编辑 ,原因:
2022-8-2 09:50
0
雪    币: 10088
活跃值: (4491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了。
2022-8-2 11:23
0
雪    币: 1378
活跃值: (3067)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
挺好使,感谢分享`
2022-8-2 15:23
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2022-8-2 17:04
0
雪    币: 1243
活跃值: (1449)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2022-8-3 13:56
0
雪    币: 329
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大佬就是牛啊
2022-8-4 00:24
0
雪    币: 3103
活跃值: (2405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了
2022-8-10 17:12
0
雪    币: 224
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2022-8-24 20:35
0
雪    币: 12520
活跃值: (5263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

学习了,多谢楼主分享哟
2022-8-25 09:21
0
雪    币: 38
活跃值: (1931)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢分享,学习了
2022-8-25 10:35
0
雪    币: 2620
活跃值: (1965)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
14
cy学习啦。IAT表x64dbg脚本修复。
2023-9-19 13:51
0
雪    币: 1290
活跃值: (2332)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
15
和OD的脚本类似
2023-9-21 16:56
0
雪    币: 27
活跃值: (561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个脚本有通用性
2023-12-21 12:44
0
雪    币: 213
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
多谢分享,学习了
2024-1-11 14:57
0
雪    币: 8845
活跃值: (5341)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
RunToParty,又学到一招。
2024-7-30 09:51
0
游客
登录 | 注册 方可回帖
返回
//