ACProtect 1.X IAT分析与Ollydbg脚本编写
看了 ximo 的基础脱壳教程17:脱ACProtect(存在Stolen Code),我成功的找到了OEP,但是按照ximo的方法无法修复IAT,ImportREC的跟踪级别1和跟踪级别3都不行,我只好写了一个用于IAT修复的Ollydbg脚本,写个帖子记录一下。
下文中的演示文件来自于 爱盘, ximo 的基础脱壳教程。
目录
第一部分:寻找OEP。
第二部分:复现IAT修复失败的场景。
第三部分:编写Ollydbg脚本,修复IAT。
第一部分:寻找OEP。
使用最后一次异常法寻找OEP。
具体的步骤:
- 查壳,ACProtect 1.X壳。(1-查壳)
- 使用OllyDbg调试。
- 选项-调试设置-异常-取消勾选 非法访问内存。(2-1,2-2)
- 插件-StrongOD-Options-取消勾选 Skip Some Exceptions-Save。(2-3,2-4)
- shift+F9,在"SE处理程序"上面 右键-在数据窗口跟随。(2-5,2-6)
- 右键-断点-内存访问,shift+F9。(2-7)
- 右键-断点-切换,shift+F9;右键-断点-切换,shift+F9。(2-8,2-9)
- 右键-断点-删除内存断点;查看-断点-删除这2个断点。(3-1,3-2)
- 接下来,运行到下面的retn,右键-断点-运行到选定位置。(3-3)
- 调试-设置条件-勾选 命令是一个 -填写"push ebp",调试-跟踪步入。(3-4,3-5)
- 等待几分钟,跟踪完毕之后,到了Stolen Code,选中这三行,右键-二进制-二进制复制。(3-6)
- 查看-内存-找到401000-右键-在访问上设置中断,shift+F9。(3-7)
- 二进制粘贴到这一行前面(如果字节不够,就nop一下之前的字节),在4010CC,右键-此处为新EIP。(3-8)
- OEP为4010CC。
- 使用LordPE来dump内存映像,右键-完整转存。 (3-9)
第二部分:复现IAT修复失败的场景。
- 打开 ImportREConstructor,选进程, 填写OEP -IAT自动搜索-获取导入表-显示无效的。(4-1)
- 使用 跟踪级别1,修复第一个失效,失败。(4-2)
- 使用 跟踪级别2,修复第一个失效,卡死。
- 使用 跟踪级别3,修复第一个失效,卡死。(4-3)
第三部分:编写Ollydbg脚本,修复IAT。
-
找到IAT的方法有很多,我这里使用 ImportREConstructor,第一个无效函数的RVA是 635C。那么,右键-转到-表达式,填写 635C-RVA-OK。(5-1,5-2)
-
上下翻一翻,很显然,完整IAT是从 4062E4 开始,406524 结束。无效函数,分为2段,第一段,0040635C~004063F4;第二段,00406414~00406504。(5-3,5-4)
-
第一个无效函数的地址,0040635C,里面存储的值是 0040D000 。在反汇编界面 转到该地址,发现,每一个无效函数的加密方法都是 异或2个值。(5-5,5-6)
-
下面为Ollydbg脚本的代码。
;IAT重建, ximo基础脱壳教程17:脱ACProtect(存在Stolen Code)
;初始化变量
mov iat_a ,0040635C
mov iat_b ,004063F4
mov iat_c ,00406414
mov iat_d ,00406504
;初始化循环变量iat = a
mov iat,iat_a
@loop_start:
;循环条件判断: iat <= d ?
cmp iat , iat_d ; 比较iat和d
jg @loop_end ; 如果iat > d,跳出循环
;判断: if(iat - 4 == b)
mov iat_2 , iat ; iat_2 = iat iat的临时副本
sub iat_2 , 4 ; iat_2 = iat_2 - 4
cmp iat_2 , iat_b ; 比较iat-4和b
jne @work ; 不相等则跳过赋值
;执行iat = c
mov iat , iat_c ; iat = c
@work:
; 循环体: 重建iat
mov iat_nei , [iat] ;取出指针iat指向的地址里面的值
mov api_1,[iat_nei +1]
mov api_2,[iat_nei +8]
xor api_1,api_2 ;不要把xor误写成了or
mov [iat],api_1 ;重建iat
;循环增量: iat = iat + 4
add iat , 4
;跳回循环开始
jmp @loop_start
@loop_end:
MSG "OK IAT 修复已经完成iat"
ret
- 写好脚本保存到一个TXT文件,在反汇编界面,右键-script function-脚本运行窗口;在脚本运行窗口,右键-载入脚本-打开。(5-7,5-8)
- 运行脚本,脚本一运行完成,左下角的IAT瞬间变了(5-9)
- 使用ImportREConstructor重建输入表,选进程, 填写OEP -IAT自动搜索-获取导入表-显示无效的。只有一个无效,剪切掉它。修正转储 到刚才dump下来的文件。(6-1,6-2,6-3)
- 最后运行成功。(6-4)
|