-
-
[原创]两种方法搞定ACProtect 1.09(Anti-Debug + Code Splicing + Stolen Code)
-
发表于:
2006-8-10 08:17
10777
-
[原创]两种方法搞定ACProtect 1.09(Anti-Debug + Code Splicing + Stolen Code)
【文章标题】: 两种方法搞定ACProtect 1.09(Anti-Debug + Code Splicing + Stolen Code)
【文章作者】: wynney
【软件名称】: Calories
【下载地址】: 打包下载
【保护方式】: Anti-Debug + Code Splicing + Stolen Code
【编写语言】: Borland Delphi 4.0 - 5.0
【操作平台】: XP SP2
【作者声明】: 凑热闹~^_^
--------------------------------------------------------------------------------
【详细过程】
一、前言
前几天在某国外论坛上看到某老外求助脱这个软件,遂下载下来瞧了瞧,蛮有点意思。很巧合,在看雪论坛上同样看到了某兄
弟关于Anti-Debug求助,突然想起了这个软件。对于这个有点心得,于是,抽空就写这篇文章。这里说的两种方
法,其实只是前面的反Anti-Debug + 找Stolen Code + 找伪OEP的方法不一样而已,后面修复IAT、处理Code Splicing的方法
是一样的。所以我将把两种方法的反Anti-Debug + 找Stolen Code + 找伪OEP的过程分开来讲,修复IAT、处理Code Splicing
的方法放在最后一起讲
二、方法一
2.1、反Anti-Debug + 找Stolen Code + 找伪OEP
使用看雪老大的HideOD插件,设置如下:
1、选上:Process32Next,HideNtDebutBit,None
2、忽略除了内存访问、指定异常外的所有异常(也就是说这2个不打勾)
OD载入目标程序,HideOD插件点下HIDE,单步F8一下
00645000 C> 60 pushad ; EP,F8
00645001 85F5 test ebp,esi ; ESP=0012FFA4
00645003 46 inc esi
00645004 E8 01000000 call Calories.0064500A
00645009 - 73 83 jnb short Calories.00644F8E
hr 0012FFA4
Shit+F9,中断在最后一次内存访问异常
0064B08E CD 01 int 1 ; 中断在最后一次内存访问异常
0064B090 40 inc eax
0064B091 40 inc eax
0064B092 0BC0 or eax,eax
0064B094 0F85 B6000000 jnz Calories.0064B150
注意看堆栈
0012FF58 /0012FFE0 指针到下一个 SEH 记录
0012FF5C |0064B072 SE 句柄 ;右键--转存中跟随,看转存窗口
0012FF60 |53C89D53
0064B072 0C245C8B ;右键--断点--内存访问,Shit+F9中断下来
0064B076 00B88383
0064B07A 33020000
0064B072 8B5C24 0C mov ebx,dword ptr ss:[esp+C] ; 中断在这,F2,继续Shit+F9
0064B076 8383 B8000000 02 add dword ptr ds:[ebx+B8],2
0064B07D 33C0 xor eax,eax
0064B07F C3 retn
0064B177 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; 中断在这,F2,继续Shit+F9
0064B17A 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+4]
0064B17E 2BC3 sub eax,ebx
0064B18B 89048E mov dword ptr ds:[esi+ecx*4],eax ; 中断在这,此时取消2个F2断点,1个内存访问断点,在retn处F4
0064B18E 49 dec ecx
0064B18F ^ EB E1 jmp short Calories.0064B172
0064B191 61 popad
0064B192 61 popad
0064B193 C3 retn ; 3个断点取消完毕后,F4
中断在retn后,Ctrl+T-->命令是一个-->push ebp-->Ctrl+F11运行跟踪,由于我们开始下的hr esp的缘故会中断在Stolen Code处
0065FAF3 55 push ebp ; Stolen Code第一句
0065FAF4 8BEC mov ebp,esp ; Stolen Code第二句
0065FAF6 90 nop
0065FAF7 90 nop
0065FAF8 90 nop
0065FAF9 60 pushad
0065FAFA 60 pushad
0065FAFB E8 00000000 call Calories.0065FB00
55 8B EC
删除硬件断点,Alt+M-->00401000段F2-->Shift+F9中断在伪OEP
00569498 42 inc edx ; OEP
00569499 44 inc esp
0056949A A6 cmps byte ptr ds:[esi],byte pt>
0056949B B9 04000000 mov ecx,4 ; 中断在这里,FOEP
005694A0 6A 00 push 0
005694A2 6A 00 push 0
三、方法二
3.1、反Anti-Debug + 找Stolen Code + 找伪OEP
OD的隐藏插件设置随便(我设置的是全部勾选上),忽略所有的异常!OD载入目标程序
00645000 C> 60 pushad ; EP
00645001 85F5 test ebp,esi ; ESP=0012FFA4
00645003 46 inc esi
00645004 E8 01000000 call Calories.0064500A
Ctrl+G-->CreateToolhelp32Snapshot-->找到段尾-->F2下断
7C864835 5E pop esi
7C864836 C9 leave
7C864837 C2 0800 retn 8 ; CreateToolhelp32Snapshot的段尾,F2
F9运行,中断下来,注意看EAX=6C(在你那里可能不是这个值)-->右键归零(把EAX清0)
再次F9,此时注意看EAX=68(在你那里可能不是这个值)-->再次右键归零(把EAX清0)
此时EAX的值就是Anti-Debug的校验值,所以,清除为0,就可以防止Anti-Debug
取消7C864837处的断点,F9运行,由于前面下hr ESP的缘故,中断在Stolen Code
0065FAF3 55 push ebp ; Stolen Code第一句
0065FAF4 8BEC mov ebp,esp ; Stolen Code第二句
0065FAF6 90 nop
0065FAF7 90 nop
0065FAF8 90 nop
55 8B EC
硬件断点不要取消,继续F9,第2次硬件中断
0065FAFA 60 pushad ; 第2次硬件中断
0065FAFB E8 00000000 call Calories.0065FB00
0065FB00 5E pop esi
硬件断点不要取消,继续F9,第3次硬件中断
0065FE8F 60 pushad ; 第3次硬件中断
0065FE90 E8 00000000 call Calories.0065FE95
0065FE95 5E pop esi
0065FE96 83EE 06 sub esi,6
硬件断点不要取消,继续F9,第4次硬件中断
0065FECB /EB 01 jmp short Calories.0065FECE ; 第4次硬件中断
0065FECD -|E9 FF25D4FE jmp FF3A24D1
0065FED2 65:009B 94560000 add byte ptr gs:[ebx+5694],bl
0065FED9 0000 add byte ptr ds:[eax],al
0065FEDB 0000 add byte ptr ds:[eax],al
0065FEDD 0000 add byte ptr ds:[eax],al
此时可以删除硬件断点,F8
0065FECE - FF25 D4FE6500 jmp dword ptr ds:[65FED4] ; F8到了这里,继续F8,即可来到FOEP
0065FED4 9B wait
0065FED5 94 xchg eax,esp
0065FED6 56 push esi
0065FED7 0000 add byte ptr ds:[eax],al
0065FED9 0000 add byte ptr ds:[eax],al
0065FEDB 0000 add byte ptr ds:[eax],al
0065FEDD 0000 add byte ptr ds:[eax],al
0065FEDF 0043 46 add byte ptr ds:[ebx+46],al
00569498 42 inc edx ; OEP
00569499 44 inc esp
0056949A A6 cmps byte ptr ds:[esi],byte pt>
0056949B B9 04000000 mov ecx,4 ; 来到这里,FOEP
005694A0 6A 00 push 0
005694A2 6A 00 push 0
005694A4 49 dec ecx
四、还原Stolen Code + 试探性Dump + 修复IAT
修补好Stolen Code之后
00645000 C> 60 pushad ; EP,F8
00645001 85F5 test ebp,esi ; ESP=0012FFA4
00645003 46 inc esi
00645004 E8 01000000 call Calories.0064500A
00645009 - 73 83 jnb short Calories.00644F8E
0064B08E CD 01 int 1 ; 中断在最后一次内存访问异常
0064B090 40 inc eax
0064B091 40 inc eax
0064B092 0BC0 or eax,eax
0064B094 0F85 B6000000 jnz Calories.0064B150
0012FF58 /0012FFE0 指针到下一个 SEH 记录
0012FF5C |0064B072 SE 句柄 ;右键--转存中跟随,看转存窗口
0012FF60 |53C89D53
0064B072 0C245C8B ;右键--断点--内存访问,Shit+F9中断下来
0064B076 00B88383
0064B07A 33020000
0064B072 8B5C24 0C mov ebx,dword ptr ss:[esp+C] ; 中断在这,F2,继续Shit+F9
0064B076 8383 B8000000 02 add dword ptr ds:[ebx+B8],2
0064B07D 33C0 xor eax,eax
0064B07F C3 retn
0064B177 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; 中断在这,F2,继续Shit+F9
0064B17A 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+4]
0064B17E 2BC3 sub eax,ebx
0064B18B 89048E mov dword ptr ds:[esi+ecx*4],eax ; 中断在这,此时取消2个F2断点,1个内存访问断点,在retn处F4
0064B18E 49 dec ecx
0064B18F ^ EB E1 jmp short Calories.0064B172
0064B191 61 popad
0064B192 61 popad
0064B193 C3 retn ; 3个断点取消完毕后,F4
0065FAF3 55 push ebp ; Stolen Code第一句
0065FAF4 8BEC mov ebp,esp ; Stolen Code第二句
0065FAF6 90 nop
0065FAF7 90 nop
0065FAF8 90 nop
0065FAF9 60 pushad
0065FAFA 60 pushad
0065FAFB E8 00000000 call Calories.0065FB00
55 8B EC
00569498 42 inc edx ; OEP
00569499 44 inc esp
0056949A A6 cmps byte ptr ds:[esi],byte pt>
0056949B B9 04000000 mov ecx,4 ; 中断在这里,FOEP
005694A0 6A 00 push 0
005694A2 6A 00 push 0
00645000 C> 60 pushad ; EP
00645001 85F5 test ebp,esi ; ESP=0012FFA4
00645003 46 inc esi
00645004 E8 01000000 call Calories.0064500A
7C864835 5E pop esi
7C864836 C9 leave
7C864837 C2 0800 retn 8 ; CreateToolhelp32Snapshot的段尾,F2
0065FAF3 55 push ebp ; Stolen Code第一句
0065FAF4 8BEC mov ebp,esp ; Stolen Code第二句
0065FAF6 90 nop
0065FAF7 90 nop
0065FAF8 90 nop
55 8B EC
0065FAFA 60 pushad ; 第2次硬件中断
0065FAFB E8 00000000 call Calories.0065FB00
0065FB00 5E pop esi
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课