吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1226|回复: 2
收起左侧

[原创] ACProtect 1.X IAT分析与Ollydbg脚本编写

[复制链接]
tie1zhu 发表于 2025-12-28 00:07

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-查壳)
    1_查壳.png
  • 使用OllyDbg调试。
  • 选项-调试设置-异常-取消勾选 非法访问内存。(2-1,2-2)
    2-1.png 2-2.png
  • 插件-StrongOD-Options-取消勾选 Skip Some Exceptions-Save。(2-3,2-4)
    2-3.png 2-4.png
  • shift+F9,在"SE处理程序"上面 右键-在数据窗口跟随。(2-5,2-6)
    2-5.png 2-6.png
  • 右键-断点-内存访问,shift+F9。(2-7)
    2-7.png
  • 右键-断点-切换,shift+F9;右键-断点-切换,shift+F9。(2-8,2-9)
    2-8.png 2-9.png
  • 右键-断点-删除内存断点;查看-断点-删除这2个断点。(3-1,3-2)
    3-1.png 3-2.png
  • 接下来,运行到下面的retn,右键-断点-运行到选定位置。(3-3)
    3-3.png
  • 调试-设置条件-勾选 命令是一个 -填写"push ebp",调试-跟踪步入。(3-4,3-5)
    3-4.png 3-5.png
  • 等待几分钟,跟踪完毕之后,到了Stolen Code,选中这三行,右键-二进制-二进制复制。(3-6)
    3-6.png
  • 查看-内存-找到401000-右键-在访问上设置中断,shift+F9。(3-7)
    3-7.png
  • 二进制粘贴到这一行前面(如果字节不够,就nop一下之前的字节),在4010CC,右键-此处为新EIP。(3-8)
    3-8.png
  • OEP为4010CC。
  • 使用LordPE来dump内存映像,右键-完整转存。 (3-9)
    3-9.png

第二部分:复现IAT修复失败的场景。

  • 打开 ImportREConstructor,选进程, 填写OEP -IAT自动搜索-获取导入表-显示无效的。(4-1)
    4-1.png
  • 使用 跟踪级别1,修复第一个失效,失败。(4-2)
    4-2.png
  • 使用 跟踪级别2,修复第一个失效,卡死。
  • 使用 跟踪级别3,修复第一个失效,卡死。(4-3)
    4-3.png

第三部分:编写Ollydbg脚本,修复IAT。

  • 找到IAT的方法有很多,我这里使用 ImportREConstructor,第一个无效函数的RVA是 635C。那么,右键-转到-表达式,填写 635C-RVA-OK。(5-1,5-2)
    5-1.png 5-2.png

  • 上下翻一翻,很显然,完整IAT是从 4062E4 开始,406524 结束。无效函数,分为2段,第一段,0040635C~004063F4;第二段,00406414~00406504。(5-3,5-4)
    5-3.png 5-4.png

  • 第一个无效函数的地址,0040635C,里面存储的值是 0040D000 。在反汇编界面 转到该地址,发现,每一个无效函数的加密方法都是 异或2个值。(5-5,5-6)
    5-5.png 5-6.png

  • 下面为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)
    5-7.png 5-8.png
  • 运行脚本,脚本一运行完成,左下角的IAT瞬间变了(5-9)
    5-9.png
  • 使用ImportREConstructor重建输入表,选进程, 填写OEP -IAT自动搜索-获取导入表-显示无效的。只有一个无效,剪切掉它。修正转储 到刚才dump下来的文件。(6-1,6-2,6-3)
    6-1.png 6-2.png 6-3.png
  • 最后运行成功。(6-4)
    6-4.png

notepad98,密码是www.52pojie.cn.7z

115.52 KB, 下载次数: 6, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 5吾爱币 +12 热心值 +5 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
piginwind + 1 + 1 谢谢@Thanks!
hailongxl + 1 用心讨论,共获提升!
evan1s + 1 + 1 谢谢@Thanks!
bypasshwid + 3 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

pjpjpj 发表于 2025-12-29 09:15
学习,谢谢大神指点
tqp 发表于 2025-12-31 11:50
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-1-3 00:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表