【脱文标题】 再次进阶Acprotect1.09的壳
【脱文作者】 二哥weiyi75[Dfcg]
【作者邮箱】 [email]weiyi75@sohu.com[/email]
【作者主页】 Dfcg官方大本营+龙族联盟论坛
【使用工具】 UnkillOd,Imprec1.42
【破解平台】 Win2000/XP
【软件名称】 Acprotect1.09加壳的Win98的记事本,选择了所有的Antidbg选项。
【下载地址 附件下载
【软件简介】:ACProtect is an application that allows you to protect Windows executable files against piracy,using public keys encryption algorithms (RSA) to create and verify the registration keys and unlock some RSA key locked code,it has embedded cryptor against dump and unpacker.it also has many anti debug tricks. And you can use it to create evaluation and trial application versions. with specialized API system, mutual communication between loader and application is also can be achieved.
【软件大小】 125k
【加壳方式】 UltraProtect 1.x -> RISCO Software Inc.
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
Od设置不忽略内存异常,其余异常全部忽略。
载入程序,全自动HIDEOD插件隐藏Od。
现在壳的最高境界是和程序融为一体,我们的最高境界是将壳脱个精光。达不到那个程度只好就带发修行或犹抱琵琶半遮面。
首先要找到Stote Code 处脱壳,这个要平时多修炼五种语言入口。
1. Stote Code
OD载入程序
0040D000 N> 60 pushad
0040D001 FC cld //这里运行Esp定律,命令行hr esp
0040D002 87FE xchg esi,edi
0040D004 66:C1CE A5 ror si,0A5
0040D008 66:13F0 adc si,ax
0040D00B 7E 03 jle short NOTEPAD.0040D010
0040D00D 7F 01 jg short NOTEPAD.0040D010
0040D00F - EB BF jmp short NOTEPAD.0040CFD0
0040D011 C7 ??? ; 未知命令
0040D012 F2: prefix repne:
0040D013 EB 5E jmp short NOTEPAD.0040D073
0040D015 E8 01000000 call NOTEPAD.0040D01B
0040D01A - 76 83 jbe short NOTEPAD.0040CF9F
................................................................................
F9运行
0041308E CD 01 int 1
00413090 40 inc eax
00413091 40 inc eax //因为SEH会清除断点,故在这里下F2断点,Shift+F9中断后清除断点,然后就可以F9 ESP定律中断了。
00413092 0BC0 or eax,eax
00413094 0F85 B6000000 jnz NOTEPAD.00413150
0041309A 60 pushad
0041309B 8DBD 36B74100 lea edi,dword ptr ss:[ebp+41B736]
004130A1 4F dec edi
004130A2 8D8D 70BE4100 lea ecx,dword ptr ss:[ebp+41BE70]
004130A8 83C1 02 add ecx,2
004130AB 2BCF sub ecx,edi
004130AD C1E9 02 shr ecx,2
004130B0 E8 49D8FFFF call NOTEPAD.004108FE
004130B5 AB stos dword ptr es:[edi]
004130B6 ^ E2 F8 loopd short NOTEPAD.004130B0
0012FF58 0012FFE0 指针到下一个 SEH 记录
0012FF5C 00413072 SE 句柄 //如果你这里下断点,Shift+F9将找不到Stote Code,ESP定律会断点失效。
0012FF60 FFFFFFEC
0012FF64 B05DF3D1
0012FF68 0000004D
...........................................................................
00427AF2 61 popad
00427AF3 55 push ebp //Stote Code发现,内存已经完全解压,可以在这里OD插件直接脱壳,不选择重建输入表选项。记住地址 427AF3 待会让IR修正入口为这里。
00427AF4 8BEC mov ebp,esp
00427AF6 83EC 44 sub esp,44
00427AF9 60 pushad
00427AFA 60 pushad
00427AFB E8 00000000 call NOTEPAD.00427B00
00427B00 5E pop esi
00427B01 83EE 06 sub esi,6
00427B04 B9 35000000 mov ecx,35
00427B09 29CE sub esi,ecx
00427B0B BA 2A43A05C mov edx,5CA0432A
00427B10 C1E9 02 shr ecx,2
00427B13 83E9 02 sub ecx,2
00427B16 83F9 00 cmp ecx,0
00427B19 7C 1A jl short NOTEPAD.00427B35
.....................................................................
ALT+M 打开内存镜像
内存镜像,项目 12
地址=00401000 //对准这里下F2断点,F9飞向光明之巅
大小=00004000 (16384.)
Owner=NOTEPAD 00400000
区段=.text
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
004010CC B3 BB mov bl,0BB //原入口代码已经替换,IR修复还是以这里为实际入口
004010CE 93 xchg eax,ebx
004010CF 44 inc esp
004010D0 8578 56 test dword ptr ds:[eax+56],edi
当然你可以还原Stote Code,也可以带发修行。
004010CC 55 push ebp
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D2 56 push esi //这里
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; NOTEPAD.0040D1BA
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:[eax]
004010DD 3C 22 cmp al,22
004010DF 75 1B jnz short NOTEPAD.004010FC
004010E1 56 push esi
004010E2 FF15 F4644000 call dword ptr ds:[4064F4] ; NOTEPAD.0040D4C6
004010E8 8BF0 mov esi,eax
004010EA 8A00 mov al,byte ptr ds:[eax]
004010EC 84C0 test al,al
004010EE 74 04 je short NOTEPAD.004010F4
004010F0 3C 22 cmp al,22
004010F2 ^ 75 ED jnz short NOTEPAD.004010E1
004010F4 803E 22 cmp byte ptr ds:[esi],22
004010F7 75 15 jnz short NOTEPAD.0040110E
...........................................................................
2. Patch IAT
因为ImportREC使用跟踪等级3时必须关闭OD,否则.....
重新运行加壳程序,运行ImportREC,选择这个进程。把OEP改为000010CC,点IT AutoSearch,点“Get Import”,我们看到并不是所有的指针都加密了,主要是user32.dll和kernel32.dll
这样的IAT加密是略有OD调试能力的脱壳手可以轻松对比找到加密位置。
对比法
1 000062E4 advapi32.dll 01A8 RegQueryValueExA 记住几个好指针的位置
1 000062FC gdi32.dll 0158 GetObjectA
加密指针
0 0000635C ? 0000 0040D000
0 00006414 ? 0000 0040D1EE
随便找突入口,由正确指针找到正确指针入口
OD载入程序,命令行
hr 4062E4
F9运行立即中断
004163D3 8907 mov dword ptr ds:[edi],eax //这里就是写正确指针入口的代码了
004163D5 8385 24404000 04 add dword ptr ss:[ebp+404024],4 //这里中断
004163DC ^ E9 D6FEFFFF jmp NOTEPAD.004162B7
004163E1 83C6 14 add esi,14
004163E4 8B95 28404000 mov edx,dword ptr ss:[ebp+404028]
004163EA ^ E9 38FEFFFF jmp NOTEPAD.00416227
004163EF 60 pushad
004163F0 E8 00000000 call NOTEPAD.004163F5
EAX=77D9858E ADVAPI32.RegQueryValueExA
...........................................................................
分析关键代码
004162B7 8B95 28404000 mov edx,dword ptr ss:[ebp+404028] ; NOTEPAD.00400000
004162BD 8B06 mov eax,dword ptr ds:[esi]
004162BF 0BC0 or eax,eax
004162C1 75 07 jnz short NOTEPAD.004162CA
004162CA 03C2 add eax,edx
004162CC 0385 24404000 add eax,dword ptr ss:[ebp+404024]
004162D2 8B18 mov ebx,dword ptr ds:[eax]
004162D4 8B7E 10 mov edi,dword ptr ds:[esi+10]
004162D7 03FA add edi,edx
.................................................................................
00416312 53 push ebx
00416313 FFB5 20404000 push dword ptr ss:[ebp+404020]
00416319 FF95 68C24100 call dword ptr ss:[ebp+41C268] ; KERNEL32.GetProcAddress
0041631F 3B9D 28404000 cmp ebx,dword ptr ss:[ebp+404028]
00416325 7C 0F jl short NOTEPAD.00416336
00416327 90 nop
00416328 90 nop
00416329 90 nop
0041632A 90 nop
0041632B 60 pushad
0041632C 2BC0 sub eax,eax
0041632E 8803 mov byte ptr ds:[ebx],al
00416330 43 inc ebx
00416331 3803 cmp byte ptr ds:[ebx],al
00416333 ^ 75 F9 jnz short NOTEPAD.0041632E
00416335 61 popad
00416336 0BC0 or eax,eax
00416338 ^ 0F84 2EFFFFFF je NOTEPAD.0041626C
0041633E 3B85 78C24100 cmp eax,dword ptr ss:[ebp+41C278]
00416344 75 0A jnz short NOTEPAD.00416350
00416350 56 push esi
00416351 FFB5 20404000 push dword ptr ss:[ebp+404020]
00416357 5E pop esi
00416358 39B5 E9204000 cmp dword ptr ss:[ebp+4020E9],esi
0041635E 74 15 je short NOTEPAD.00416375
00416360 90 nop
00416361 90 nop
00416362 90 nop
00416363 90 nop
00416364 39B5 ED204000 cmp dword ptr ss:[ebp+4020ED],esi
0041636A 74 09 je short NOTEPAD.00416375 //跳走还有一次机会,核心Patch点
0041636C 90 nop
0041636D 90 nop
0041636E 90 nop
0041636F 90 nop
00416370 EB 60 jmp short NOTEPAD.004163D2
00416372 90 nop
00416373 90 nop
00416374 90 nop
00416375 80BD 87A34000 00 cmp byte ptr ss:[ebp+40A387],0
0041637C 74 54 je short NOTEPAD.004163D2 //最后一次机会,不跳Over
0041637E 90 nop
0041637F 90 nop
00416380 90 nop
00416381 90 nop
00416382 EB 07 jmp short NOTEPAD.0041638B
00416384 90 nop
00416385 90 nop
00416386 90 nop
00416387 0100 add dword ptr ds:[eax],eax
00416389 0000 add byte ptr ds:[eax],al
0041638B 8BB5 ED404000 mov esi,dword ptr ss:[ebp+4040ED] //到这里看寄存器和信息提示了解加密地址。
00416391 83C6 0D add esi,0D
00416394 81EE C71F4000 sub esi,NOTEPAD.00401FC7
0041639A 2BF5 sub esi,ebp
0041639C 83FE 00 cmp esi,0
0041639F 7F 31 jg short NOTEPAD.004163D2
..............................................................
004163D2 5E pop esi
004163D3 8907 mov dword ptr ds:[edi],eax
004163D5 8385 24404000 04 add dword ptr ss:[ebp+404024],4
004163DC ^ E9 D6FEFFFF jmp NOTEPAD.004162B7 //循环处理
实际Patch发现Patch点选择有点意思,如果
修改
0041636A 74 09 je short NOTEPAD.00416375 //跳走还有一次机会,核心Patch点
IAT还是有不少加密了
如果改这个就还剩一个加密指针
0041637C 74 54 je short NOTEPAD.004163D2 //最后一次机会,不跳Over
我选择的方式2修改
这里下硬件执行断点
0041637C 74 54 je short NOTEPAD.004163D2
重启OD,F9运行
立即中断
0041637C /74 54 je short NOTEPAD.004163D2
修改为
0041637C /EB 54 jmp short NOTEPAD.004163D2
取消硬件断点,运行到程序运行。
获取输入表
0 000064AC ? 0000 004105CB
只剩下一个指针加密,不应该这样的?????
也好
hr 4064A8
为什么不是
Hr 4064AC
因为上面一个地址处理完了就是这里了,跟踪流程可以节约大量时间。
看是什么地方照顾它
004163D3 8907 mov dword ptr ds:[edi],eax //这里写入重定位
004163D5 8385 24404000 04 add dword ptr ss:[ebp+404024],4
004163DC ^ E9 D6FEFFFF jmp NOTEPAD.004162B7
004162B7 8B95 28404000 mov edx,dword ptr ss:[ebp+404028] ; NOTEPAD.00400000
004162BD 8B06 mov eax,dword ptr ds:[esi]
004162BF 0BC0 or eax,eax
004162C1 75 07 jnz short NOTEPAD.004162CA
004162CA 03C2 add eax,edx ; NOTEPAD.00400000
004162CC 0385 24404000 add eax,dword ptr ss:[ebp+404024]
004162D2 8B18 mov ebx,dword ptr ds:[eax]
004162D4 8B7E 10 mov edi,dword ptr ds:[esi+10]
004162D7 03FA add edi,edx
004162D9 03BD 24404000 add edi,dword ptr ss:[ebp+404024]
004162DF 85DB test ebx,ebx
004162E1 0F84 FA000000 je NOTEPAD.004163E1
004162E7 F7C3 00000080 test ebx,80000000
004162ED 75 1D jnz short NOTEPAD.0041630C
004162EF 90 nop
004162F0 90 nop
004162F1 90 nop
004162F2 90 nop
004162F3 03DA add ebx,edx
004162F5 83C3 02 add ebx,2
004162F8 56 push esi
004162F9 57 push edi
004162FA 50 push eax
004162FB 8BF3 mov esi,ebx
004162FD 8BFB mov edi,ebx
004162FF AC lods byte ptr ds:[esi]
00416300 C0C0 03 rol al,3
00416303 AA stos byte ptr es:[edi]
00416304 803F 00 cmp byte ptr ds:[edi],0
00416307 ^ 75 F6 jnz short NOTEPAD.004162FF
00416309 58 pop eax ; NOTEPAD.00406268
0041630A 5F pop edi
0041630B 5E pop esi
0041630C 81E3 FFFFFF0F and ebx,0FFFFFFF
00416312 53 push ebx
00416313 FFB5 20404000 push dword ptr ss:[ebp+404020]
00416319 FF95 68C24100 call dword ptr ss:[ebp+41C268]
0041631F 3B9D 28404000 cmp ebx,dword ptr ss:[ebp+404028] //注意EAX刚刚获取的
77E23D68 USER32.MessageBoxA 00416325 7C 0F jl short NOTEPAD.00416336
........................................................................
00416333 ^\75 F9 jnz short NOTEPAD.0041632E
00416335 61 popad
00416336 0BC0 or eax,eax
00416338 ^ 0F84 2EFFFFFF je NOTEPAD.0041626C
0041633E 3B85 78C24100 cmp eax,dword ptr ss:[ebp+41C278]
00416344 75 0A jnz short NOTEPAD.00416350 //这里修改跳过下面的重定位
0041634A 8D85 CB454000 lea eax,dword ptr ss:[ebp+4045CB] //发现这里改变EAX值
00416350 56 push esi
00416351 FFB5 20404000 push dword ptr ss:[ebp+404020]
00416357 5E pop esi
00416358 39B5 E9204000 cmp dword ptr ss:[ebp+4020E9],esi
0041635E 74 15 je short NOTEPAD.00416375
00416360 90 nop
00416361 90 nop
00416362 90 nop
00416363 90 nop
00416364 39B5 ED204000 cmp dword ptr ss:[ebp+4020ED],esi
0041636A 74 09 je short NOTEPAD.00416375
后面的就和先前一样了
.............................................................................
所以
Patch两个
00416344 /75 0A jnz short NOTEPAD.00416350
0041637C /EB 54 jmp short NOTEPAD.004163D2
直接下硬件执行断点,中断后修改,然后清除硬件断点
继续直达入口
运行ImportREC,选择这个进程。把OEP改为000010CC,点IT AutoSearch,点“Get Import”,指针全部有效,把OEP改为27AF3,修复程序,正常运行。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!附件:NOTEPAD.rar 附件:NOTEPAD.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)