• 标 题:再次进阶Acprotect1.09的壳
  • 作 者:David
  • 时 间:2004-11-30,12:59
  • 链 接:http://bbs.pediy.com

【脱文标题】 再次进阶Acprotect1.09的壳

【脱文作者】 二哥weiyi75[Dfcg]

【作者邮箱】 weiyi75@sohu.com

【作者主页】 Dfcg官方大本营+龙族联盟论坛

【使用工具】 UnkillOd,Imprec1.42

【破解平台】 Win2000/XP

【软件名称】 Acprotect1.09加壳的Win98的记事本,选择了所有的Antidbg选项。

【下载地址】   附件下载http://bbs.pediy.com/showthread.php?s=&threadid=7715

【软件简介】: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,修复程序,正常运行。

--------------------------------------------------------------------------------  
 
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!