ASProtect 1.23RC4之System Cleaner 4.91d脫殼修復and破解

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

【脫文作者】 weiyi75[Dfcg]

【作者郵箱】 weiyi75@sohu.com

【作者主頁】 Dfcg官方大本營

【使用工具】 Ollydbg1.09d,ImportREC1.6F

【破解平臺】 Win2000/XP

【軟體名稱】 System Cleaner 4.91d

【下載地址】 http://218.63.244.68:1010/ckkd/attachment.php?aid=253

【軟體簡介】 提供了三種簡單有效的減肥方式。執行清除的速度很快,如果你不想清理某檔案也可以設定
System  Cleaner  2000把檔案先放到一個目錄暫存,或是執行ZIP把檔案壓縮起來。有定時的功能,可以讓
你訂定大掃 除的時間 ,或是定時清理你的硬碟。

【軟體大小】 1.01M

【加殼方式】 ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov

【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)

--------------------------------------------------------------------------------

【破解內容】

   前言,在我開始嘗試脫這個程式的程式的時候,我dump下來的檔案都是錯誤的,因為我在錯誤的地方dump程式,並因此常常導致脫殼後的程式崩潰。百思不解,後來看了Jeffzhang的動畫,知道了這個程式不能在入口處脫殼,不然即使修復Iat和補上程式碼也不能執行。本文沒有用AsprDbgr1b輔助修復IAT,全部IAT修復用ImportREC 1.6F,鍛鍊一下手動修復的能力。又經過jwh51指點破解過程,jwh51和Jeffzhang兄真是脫殼高手,吾望塵莫及,吾水平不行,克隆能力還是不錯的。

好,脫殼開始。

OD異常設定不忽略記憶體異常,其餘全部忽略,載入程式,用外掛隱藏OD。

00401000 >  68 01B05F00     PUSH SystemCl.005FB001   //停在這裡,F9執行。
00401005    E8 01000000     CALL SystemCl.0040100B
0040100A    C3              RETN
0040100B    C3              RETN
0040100C    0F39            ???                                      ; 未知命令
0040100E    44              INC ESP
0040100F    15 2F5BD708     ADC EAX,8D75B2F
00401014    58              POP EAX
00401015    A3 026254BC     MOV DWORD PTR DS:[BC546202],EAX
0040101A    8C4F DE         MOV WORD PTR DS:[EDI-22],CS
0040101D    1084D6 77A87E09 ADC BYTE PTR DS:[ESI+EDX*8+97EA877],AL
00401024    B5 D4           MOV CH,0D4
00401026    CF              IRETD
00401027    2F              DAS
00401028    B4 7C           MOV AH,7C
0040102A    23D8            AND EBX,EAX

.....................................................................


記憶體異常。

00C341E4    3100            XOR DWORD PTR DS:[EAX],EAX
00C341E6    EB 01           JMP SHORT 00C341E9
00C341E8    68 648F0500     PUSH 58F64
00C341ED    0000            ADD BYTE PTR DS:[EAX],AL
00C341EF    00EB            ADD BL,CH
00C341F1    02E8            ADD CH,AL
00C341F3    0158 68         ADD DWORD PTR DS:[EAX+68],EBX
00C341F6    6C              INS BYTE PTR ES:[EDI],DX                 ; I/O 命令
00C341F7    AF              SCAS DWORD PTR ES:[EDI]
00C341F8    C2 0068         RETN 6800
00C341FB    54              PUSH ESP
00C341FC    42              INC EDX
00C341FD    C3              RETN

.....................................................................


繼續Shift+F9 27次忽略異常到最後一次異常處。

00C33A2C    3100            XOR DWORD PTR DS:[EAX],EAX  //到這裡就可以用Loadpe脫殼了。
00C33A2E    64:8F05 0000000>POP DWORD PTR FS:[0]
00C33A35    58              POP EAX
00C33A36    833D B07EC300 0>CMP DWORD PTR DS:[C37EB0],0
00C33A3D    74 14           JE SHORT 00C33A53
00C33A3F    6A 0C           PUSH 0C
00C33A41    B9 B07EC300     MOV ECX,0C37EB0
00C33A46    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]
00C33A49    BA 04000000     MOV EDX,4
00C33A4E    E8 EDD0FFFF     CALL 00C30B40
00C33A53    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
00C33A56    FF75 F8         PUSH DWORD PTR SS:[EBP-8]
00C33A59    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00C33A5C    8338 00         CMP DWORD PTR DS:[EAX],0
00C33A5F    74 02           JE SHORT 00C33A63
00C33A61    FF30            PUSH DWORD PTR DS:[EAX]
00C33A63    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
00C33A66    FF75 EC         PUSH DWORD PTR SS:[EBP-14]
00C33A69    C3              RETN   //按F2在RET那裡設定一個斷點,然後再次按Shift+F9 

.......................................................................

 
我們會在停在RET這一行,清除斷點。

 
接著按ALT+M開啟記憶體映象。在第一個塊上下記憶體訪問斷點。
 
記憶體映象

地址       大小       Owner      Section    Contains      型別   訪問      初始訪問  對映為

 
00400000   00001000   SystemCl              PE header     Imag   R         RWE
00401000   00164000   SystemCl              code          Imag   R         RWE  //在此處上下內
存訪問斷點

 
按F9執行,程式到達這裡。

00407278  - FF25 2C235700   JMP DWORD PTR DS:[57232C]  //這裡 
0040727E    8BC0            MOV EAX,EAX
00407280  - FF25 28235700   JMP DWORD PTR DS:[572328]
00407286    8BC0            MOV EAX,EAX
00407288  - FF25 24235700   JMP DWORD PTR DS:[572324]
0040728E    8BC0            MOV EAX,EAX
00407290  - FF25 20235700   JMP DWORD PTR DS:[572320]
00407296    8BC0            MOV EAX,EAX
00407298    50              PUSH EAX
00407299    6A 40           PUSH 40
0040729B    E8 E0FFFFFF     CALL SystemCl.00407280
004072A0    C3              RETN

.......................................................................

 
如果我們按一次F8我們將回到殼的程式碼中,按Ctrl+F9返回到程式領空。

 
0040734D    A3 68E65600     MOV DWORD PTR DS:[56E668],EAX            ; SystemCl.00400000
00407352    A1 68E65600     MOV EAX,DWORD PTR DS:[56E668]
00407357    A3 D8505600     MOV DWORD PTR DS:[5650D8],EAX
0040735C    33C0            XOR EAX,EAX
0040735E    A3 DC505600     MOV DWORD PTR DS:[5650DC],EAX
00407363    33C0            XOR EAX,EAX
00407365    A3 E0505600     MOV DWORD PTR DS:[5650E0],EAX
0040736A    E8 C1FFFFFF     CALL SystemCl.00407330
0040736F    BA D4505600     MOV EDX,SystemCl.005650D4
00407374    8BC3            MOV EAX,EBX    //這裡的EAX裡面的值要記錄下來,EAX=564344,模擬Oep時
要用到。

00407376    E8 75D8FFFF     CALL SystemCl.00404BF0
0040737B    5B              POP EBX
0040737C    C3              RETN

.......................................................................

這些是什麼東西??這個問題花了我一些時間但在除錯了更多的別的程式之後,我認為這是對GetModuleHandleA的呼叫程式碼的一部分。

地址0040734D並不是OEP,我們按F8單步執行,直到RET,返回(ret)後我們來到這裡:  

00564A64    FF15 A4D15600   CALL DWORD PTR DS:[56D1A4]  這裡是臨時OEP
00564A6A    E8 4903EAFF     CALL SystemCl.00404DB8
00564A6F    90              NOP
00564A70    0000            ADD BYTE PTR DS:[EAX],AL
00564A72    0000            ADD BYTE PTR DS:[EAX],AL
00564A74    0000            ADD BYTE PTR DS:[EAX],AL
00564A76    0000            ADD BYTE PTR DS:[EAX],AL

................................................................. 

但哪裡才是OEP ?                                                 

如果你往上看,你會發現這樣的程式碼:      

00564A4F    001C43          ADD BYTE PTR DS:[EBX+EAX*2],BL
00564A52    56              PUSH ESI
00564A53    0000            ADD BYTE PTR DS:[EAX],AL
00564A55    0000            ADD BYTE PTR DS:[EAX],AL
00564A57    0000            ADD BYTE PTR DS:[EAX],AL
00564A59    0000            ADD BYTE PTR DS:[EAX],AL
00564A5B    0000            ADD BYTE PTR DS:[EAX],AL
00564A5D    0000            ADD BYTE PTR DS:[EAX],AL
00564A5F    E8 D828EAFF     CALL SystemCl.0040733C

真正的OEP是 :   

00564A54                                                      

你可能會問\"為什麼 ?\"...                                           
ASPR使用了一種叫做 \"Steal-Bytes\"的技術:                            
asrp隱藏了PE檔案OEP開始處的位元組,並把這些位元組從原始PE檔案中擦除.. 

=====================                                                
關於stolen bytes                                                     
=====================                                                

稍微說明一下:                                                    

每一種編譯工具例如 : VC++ , Delphi , Borland , etc..                
在OEP有一個唯一的/相同的PE頭                              
其中的一些是這樣的:                                             

Push EBP                                                             
MOV Ebp,Esp                                                          
Add ESP , -010                                                       
Mov EAX, SOME_VALUE                                                  

(共11bytes)                                                   

或者:                                                                 

Push EBP                                                             
MOV Ebp,Esp                                                          
Add ESP , -010                                                       
Push EBX                                                             
Push ESi                                                             
Push EDi                                                             
Mov EAX, SOME_VALUE                                                  

(共14 bytes)     

這個程式被抽掉多少位元組,11個,因為

00564A4F    001C43          ADD BYTE PTR DS:[EBX+EAX*2],BL
00564A52    56              PUSH ESI
00564A53    0000            ADD BYTE PTR DS:[EAX],AL  //這裡往下一共12個位元組,被抽掉的位元組會用
00補充,故Oep判斷為564a54
00564A55    0000            ADD BYTE PTR DS:[EAX],AL
00564A57    0000            ADD BYTE PTR DS:[EAX],AL
00564A59    0000            ADD BYTE PTR DS:[EAX],AL
00564A5B    0000            ADD BYTE PTR DS:[EAX],AL
00564A5D    0000            ADD BYTE PTR DS:[EAX],AL
00564A5F    E8 D828EAFF     CALL SystemCl.0040733C

用Peid掃描一下脫殼的檔案,Borland Delphi 6.0 - 7.0,我們模擬入口點11個位元組。

Push EBP                  //固定格式                                            
Mov EBP,ESP               //固定格式                                                
Add ESP,-010              //ADD ESP 的值一般 Delphi 程式都是-010
Mov eax, 00564344         //這裡EAX的值就是剛才記錄下來的。

將模擬入口碼先記錄下來。

ok,現在剩下的工作就是修復IAT了。    

先關閉OD,開啟單獨的程式。                                                     

在improved ImpRec 1.6 Final中選取程式,然後  

Oep處的1000別修改  

點選: 自動搜尋IAT (IAT AutoSearch) 

RVA   0017221C  大小為0C8  //太小了

修改RVA的大小(Size of the RVA )為1000         

然後點選獲取輸入表(GetImports)     

點選顯示非法函式(Show Invalid)  
                                                      
在無效地址列表(invalid list)中點選右鍵選擇\"Trace Level 1\" 修復。    

還有452個指標要手動修復。

然後用ASProtect 1.22再減輕一下壓力,注意不能用1.2x和1.3版的外掛修復,也修復不了。                     
還有441個指標要手動修復。

現在的問題是,這441個指標是有用的嗎?ImpRec 1.6會告訴你

點選show invalid並右鍵單擊選擇其中的一個,讓我們來修復它 : 
                                      
001722E8<- 右鍵單擊選擇Deasm\HexView檢視:  

ImpRec 1.6提示你,read error!好,夠了,只要有這個提示的一律可以安全的Cut。

如果這個指標有效,裡面會顯示彙編指令。

找了一會,發現001724D8處的指標是唯一一個沒識別的指標。

右鍵單擊選擇Deasm\HexView檢視,究竟它是Kernel32.dll中的哪個函式呢,按Page Down兩次,看到

00C31D6E    call 00C25158    // = kernel32.dll/00D9/FindResourceA

第一個看到的Api函式就是要修復的指標。

呵呵,修復它吧,雙擊00C31D6E這行,填入Api函式FindResourceA。

最後面幾百個靠一塊的指標一眼看出全是垃圾,用Deasm\HexView驗證一下。

現在點選show invalid,將剩下440個垃圾指標全部Cut掉,提示所有指標修復完成,爽啊!

Btw:我是除了未部幾百個垃圾指標,其餘20多個指標一個個驗證的。

將Oep填入00164A54,然後修復脫殼檔案。

補上抽掉的11個位元組。

換Od上場,載入修復的檔案,補上我們剛才分析的程式碼,儲存檔案,正常執行。

脫殼後發現和原版一樣有隨機NAG提示和30天限制,想半法去掉它的30天時間限制。各位脫殼愛好都也可能發現脫Aspr經常有這種現象,有一種解決方案是脫殼後再把NAG視窗想法NOP掉,其實沒必要這麼做,在脫殼過程中就可以解決這個問題,以前有在SoftICE下的操作方案,這裡就談談OD下的操作方案.

例子就用這個systemClean,這裡主要說一下如何解決時間過期問題:

1.用OD載入加殼的主程式,F9執行,異常後按SHIFT+F9共23次,為什麼是23次,因為總共有27次異常,我們要提前4-5次中斷,所以是23次,這個是前輩的經驗,要多看些脫文才能完全理解。

 
2.接著按ALT+M開啟記憶體映象。在第一個塊上下記憶體訪問斷點。
 
記憶體映象

地址       大小       Owner      Section    Contains      型別   訪問      初始訪問  對映為
 
00400000   00001000   SystemCl              PE header     Imag   R         RWE
00401000   00164000   SystemCl              code          Imag   R         RWE  //在此處上下內
存訪問斷點,按SHIFT+F9,程式碼來到了這裡:

00563EB0    55                    PUSH    EBP
00563EB1    8BEC                  MOV     EBPESP
00563EB3    A1 2CD75600           MOV     EAXDWORD PTR DS:[56D72C]  //注意這一行
00563EB8    8B55 08               MOV     EDXDWORD PTR SS:[EBP+8]
00563EBB    8910                  MOV     DWORD PTR DS:[EAX], EDX
00563EBD    5D                    POP     EBP
00563EBE    C2 0400               RETN    4

注意以上程式碼的第三行mov eax dword ptr[56d72c];

[56d72c]中的值為566578,

我們輸入命令:dd 566578 看看記憶體:

00566578  0049D74C  SystemCl.0049D74C  ,存放的是註冊名的地址,改成自己的.
0056657C  FFFFFFFF                                 ,這一行是試用天數.
00566580  FFFFFFFF                                 ,這一行是剩下的天數.
00566584  00000000
00566588  00000001
0056658C  00000002

前三行就是我們要改的東西了.

用OD開啟脫殼後的檔案,把兩個時間的地址全改為FF(共8個位元組),然後在檔案後面的某個空白處輸入你的大名,我選擇了在56DFB4處,

輸入例如:Crack By weiyi75[Dfcg] Thank Jwh51[Dfcg]

在566578處改為 B4 DF 56 00 ,也就是我們大名的地點,儲存.再執行看看.呵呵,時間限制沒有了,在關於對話方塊中出現了Licensed to 你的大名。
 

感謝:某老外,Jeffzhang,Jwh51提供技術指點。 

-------------------------------------------------------------------------------- 

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

相關文章