再次進階Acprotect1.09的殼

看雪資料發表於2015-11-15

【脫文標題】 再次進階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,修復程式,正常執行。

--------------------------------------------------------------------------------  
 
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!


相關文章