再次進階Acprotect1.09的殼
【脫文標題】 再次進階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,修復程式,正常執行。
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!
相關文章
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30
- 脫殼----對用Petite2.2加殼的程式進行手動脫殼的一點分析
(5千字)2000-07-27
- 識別殼的簡單程式,高手免進。2004-12-14
- Armadillo 2.52加殼原理分析和改進的脫殼方法
(12千字)2015-11-15
- 殼的工作原理脫殼2013-04-10
- 進階目標 -- 新的一年的進階目標2011-12-30
- 函式的進階2018-11-01函式
- vstpd的進階2017-08-11
- CSS高階進階2018-02-12CSS
- 高階前端的進階——CSS之flex2019-03-11前端CSSFlex
- 高階前端進階(五)2022-05-09前端
- 高階前端進階(七)2022-12-17前端
- 高階前端進階(三)2021-11-22前端
- React 進階之高階元件2017-06-27React元件
- 前端進階的破冰之旅2018-11-17前端
- Vue的進階屬性2020-12-21Vue
- css進階less的使用2018-04-27CSS
- Scala的for表示式進階2016-04-25
- Redux 進階2021-09-09Redux
- ElasticSearch 進階2021-03-09Elasticsearch
- HBase進階2020-10-26
- SQL進階2023-11-12SQL
- JavaScript進階2023-02-08JavaScript
- css進階2017-12-28CSS
- Mongodb進階2015-07-07MongoDB
- Masonry進階2015-12-10
- vue進階2024-03-10Vue
- protobuf進階2024-03-19
- 06進階2024-10-19
- Typescript 高階語法進階2020-08-09TypeScript
- React 進階(三) 高階元件2019-03-18React元件
- 高階前端進階系列 - webview2019-05-10前端WebView
- CSS使用的一些小技巧/高階進階2019-03-04CSS
- 高階 Android 工程師的進階之路2018-07-13Android工程師
- Python函式的進階2019-01-06Python函式
- day 10 函式的進階2018-12-10函式
- Python的基礎進階2020-10-06Python
- 進階篇_STL中的容器2017-04-28