ASProtect 1.23RC4之Dephi語言篇

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

【脫文作者】 weiyi75[Dfcg]

【作者郵箱】 weiyi75@sohu.com
 
【作者主頁】 Dfcg官方大本營

【使用工具】 Ollydbg1.10b,ImportREC1.6F,LoadPe
 
【破解平臺】 Win2000/XP
 
【軟體名稱】 PE檔案分析器

【下載地址】 原程式

http://bbs2.pediy.com/download.php?id=1514

【下載地址】 加密程式

http://bbs2.pediy.com/download.php?id=1513

【軟體簡介】 ASProtect 1.23 RC4 Registered版本加密的一個PE檔案分析器。
 
【軟體大小】 453K

【加殼方式】 ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov
 
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享。

【破解目的】 模擬跟蹤尋找Stolen Code具體內容或Oep入口。

前言,這個軟體是我用ASProtect 1.23 RC4 Registered版本加密的,使用了所有反跟蹤選項。

先OD載入原程式看看   

004B7220 > $  55            PUSH EBP    //典型Dephi語言入口點 

004B7221   .  8BEC          MOV EBP,ESP

004B7223   .  83C4 F0       ADD ESP,-10

004B7226   .  B8 A86F4B00   MOV EAX,Pe.004B6FA8

004B722B   .  E8 6CF4F4FF   CALL Pe.0040669C

004B7230   .  A1 C4A04B00   MOV EAX,DWORD PTR DS:[4BA0C4]

004B7235   .  8B00          MOV EAX,DWORD PTR DS:[EAX]

004B7237   .  E8 C48CFCFF   CALL Pe.0047FF00

004B723C   .  A1 C4A04B00   MOV EAX,DWORD PTR DS:[4BA0C4]

004B7241   .  8B00          MOV EAX,DWORD PTR DS:[EAX]

004B7243   .  BA 80724B00   MOV EDX,Pe.004B7280

004B7248   .  E8 AB88FCFF   CALL Pe.0047FAF8

004B724D   .  8B0D F4A14B00 MOV ECX,DWORD PTR DS:[4BA1F4]            ;  Pe.004BBCAC

004B7253   .  A1 C4A04B00   MOV EAX,DWORD PTR DS:[4BA0C4]

004B7258   .  8B00          MOV EAX,DWORD PTR DS:[EAX]

004B725A   .  8B15 48E44A00 MOV EDX,DWORD PTR DS:[4AE448]            ;  Pe.004AE494

004B7260   .  E8 B38CFCFF   CALL Pe.0047FF18

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


暫存器EBP=0012FFF0   //這是程式停在入口點EBP的值,其它Dephi語言或程式語言這裡的EBP值全部相同,這又說明什麼,當Asprotect執行到這裡或Stolen Code時EBP的值就為EBP=0012FFF0,我們來具體試試。

 

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

 

00401000 >  68 01F04E00     PUSH Pej.004EF001        //加殼程式入口點,F9執行

00401005    E8 01000000     CALL Pej.0040100B

0040100A    C3              RETN

0040100B    C3              RETN

0040100C    9A 7FCE25CC 76C>CALL FAR CE76:CC25CE7F                   ; 遠距呼叫

00401013    FA              CLI

00401014    0C 55           OR AL,55

00401016    6C              INS BYTE PTR ES:[EDI],DX                 ; I/O 命令

00401017    D0DC            RCR AH,1

00401019    25 4B551335     AND EAX,3513554B

0040101E    45              INC EBP

0040101F    BC B431C8D3     MOV ESP,D3C831B4

00401024    73 66           JNB SHORT Pej.0040108C

00401026    5C              POP ESP

00401027    21E2            AND EDX,ESP

00401029    04 04           ADD AL,4

0040102B    7C 0C           JL SHORT Pej.00401039

0040102D  - 75 AB           JNZ SHORT Pej.00400FDA

0040102F    2B4415 15       SUB EAX,DWORD PTR SS:[EBP+EDX+15]

00401033    826D 84 F0      SUB BYTE PTR SS:[EBP-7C],-10

00401037    CA 5FD0         RETF 0D05F                               ; 遠距返回

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

 

記憶體異常

 

00DB41A4    3100            XOR DWORD PTR DS:[EAX],EAX

00DB41A6    EB 01           JMP SHORT 00DB41A9

00DB41A8    68 648F0500     PUSH 58F64

00DB41AD    0000            ADD BYTE PTR DS:[EAX],AL

00DB41AF    00EB            ADD BL,CH

00DB41B1    02E8            ADD CH,AL

00DB41B3    0158 68         ADD DWORD PTR DS:[EAX+68],EBX

00DB41B6    6C              INS BYTE PTR ES:[EDI],DX                 ; I/O 命令

00DB41B7    AF              SCAS DWORD PTR ES:[EDI]

00DB41B8    DA00            FIADD DWORD PTR DS:[EAX]

00DB41BA    68 1442DB00     PUSH 0DB4214

00DB41BF    68 8836DB00     PUSH 0DB3688

00DB41C4    68 5033DB00     PUSH 0DB3350

00DB41C9    68 002DDB00     PUSH 0DB2D00

00DB41CE    68 BC26DB00     PUSH 0DB26BC

00DB41D3    68 4C3ADB00     PUSH 0DB3A4C

00DB41D8    C3              RETN

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

繼續Shift+F9 25次來到Asprotect典型的最後一次異常。

00DB39EC    3100            XOR DWORD PTR DS:[EAX],EAX    //特徵碼

00DB39EE    64:8F05 0000000>POP DWORD PTR FS:[0]

00DB39F5    58              POP EAX

00DB39F6    833D B07EDB00 0>CMP DWORD PTR DS:[DB7EB0],0

00DB39FD    74 14           JE SHORT 00DB3A13

00DB39FF    6A 0C           PUSH 0C

00DB3A01    B9 B07EDB00     MOV ECX,0DB7EB0

00DB3A06    8D45 F8         LEA EAX,DWORD PTR SS:[EBP-8]

00DB3A09    BA 04000000     MOV EDX,4

00DB3A0E    E8 2DD1FFFF     CALL 00DB0B40

00DB3A13    FF75 FC         PUSH DWORD PTR SS:[EBP-4]

00DB3A16    FF75 F8         PUSH DWORD PTR SS:[EBP-8]

00DB3A19    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]

00DB3A1C    8338 00         CMP DWORD PTR DS:[EAX],0

00DB3A1F    74 02           JE SHORT 00DB3A23

00DB3A21    FF30            PUSH DWORD PTR DS:[EAX]

00DB3A23    FF75 F0         PUSH DWORD PTR SS:[EBP-10]

00DB3A26    FF75 EC         PUSH DWORD PTR SS:[EBP-14]

00DB3A29    C3              RETN    //這裡下斷點,Shift+F9中斷後取消斷點。 

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

我這次沒有用記憶體映象斷點到OEP,下面的這個方法可以發現Stolen Code(如果有)+Oep二合一。

仍然是命令列斷點

tc ebp==12fff0       //當前EBP內容為12fff0就被中斷,略微看看就可以找到Stolen Code(如果有)或Oep

00DC6348   /EB 02           JMP SHORT 00DC634C //一會就來到這裡,呵呵,C++語言就開始有Stolen Code,而且略有變形,往下全部用F7步過,轉標籤1

00DC634A   |CD 20           INT 20

00DC634C   F2:             PREFIX REPNE:     //這樣的語句其實是一些變形Jmp  ; 多餘的字首

00DC634D    EB 01           JMP SHORT 00DC6350

00DC634F  - E9 65EB01E9     JMP E9DE4EB9

00DC6354    68 91AA7FAE     PUSH AE7FAA91

00DC6359    6A 2A           PUSH 2A

00DC635B    897C24 04       MOV DWORD PTR SS:[ESP+4],EDI

00DC635F    F2:             PREFIX REPNE:                            ; 多餘的字首

00DC6360    EB 01           JMP SHORT 00DC6363

00DC6362    9A 8D642404 F3E>CALL FAR EBF3:0424648D                   ; 遠距呼叫

00DC6369    02CD            ADD CL,CH

00DC636B    20F2            AND DL,DH

00DC636D    EB 01           JMP SHORT 00DC6370

00DC636F    C7              ???                                      ; 未知命令

00DC6370    0FCF            BSWAP EDI

00DC6372    EB 02           JMP SHORT 00DC6376

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

標籤1

00DC634C    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC6350   /65:EB 01        JMP SHORT 00DC6354                       ; 多餘的字首

 

00DC6354    68 91AA7FAE     PUSH AE7FAA91

00DC6359    6A 2A           PUSH 2A

00DC635B    897C24 04       MOV DWORD PTR SS:[ESP+4],EDI

00DC635F    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC6363    8D6424 04       LEA ESP,DWORD PTR SS:[ESP+4]

00DC6367    F3:             PREFIX REP:                              ; 多餘的字首

00DC6368    EB 02           JMP SHORT 00DC636C

 

00DC636C    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC6370    0FCF            BSWAP EDI

00DC6372    EB 02           JMP SHORT 00DC6376

 

00DC6376    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC637A    FF7424 07       PUSH DWORD PTR SS:[ESP+7]

00DC637E    36:EB 01        JMP SHORT 00DC6382                       ; 多餘的字首

 

00DC6382    68 6C63DC00     PUSH 0DC636C

00DC6387    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC638B    8F4424 00       POP DWORD PTR SS:[ESP]                   ; 00DC636C

00DC638F    5F              POP EDI

00DC6390    FF57 28         CALL DWORD PTR DS:[EDI+28]

 

00DC639D    5F              POP EDI                                  ; 00DC6393

00DC639E    26:EB 01        JMP SHORT 00DC63A2                       ; 多餘的字首

 

00DC63A2    81E7 E50A9E59   AND EDI,599E0AE5

00DC63A8    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC63AC    C1E7 E1         SHL EDI,0E1                              ; 移動常數超出 1..31 的範圍

00DC63AF    EB 01           JMP SHORT 00DC63B2

 

00DC63B2    C1EF D6         SHR EDI,0D6                              ; 移動常數超出 1..31 的範圍

00DC63B5    5F              POP EDI

00DC63B6    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC63BA    8D6424 F7       LEA ESP,DWORD PTR SS:[ESP-9]

00DC63BE    66:8135 C763DC0>XOR WORD PTR DS:[DC63C7],0AA91

00DC63C7    7A AB           JPE SHORT 00DC6374

 

00DC63C7   /EB 01           JMP SHORT 00DC63CA

 

00DC63CA    8D6424 42       LEA ESP,DWORD PTR SS:[ESP+42]

00DC63CE    8D6424 C3       LEA ESP,DWORD PTR SS:[ESP-3D]

00DC63D2    66:8135 DB63DC0>XOR WORD PTR DS:[DC63DB],0D71A

 

00DC63DB    F3:             PREFIX REP:                              ; 多餘的字首

 

00DC63E0    55              PUSH EBP //Stolen Code第一句。

00DC63E1    66:8135 EB63DC0>XOR WORD PTR DS:[DC63EB],80A3

00DC63EA    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC63EE    8F4424 00       POP DWORD PTR SS:[ESP]                   ; 0012FFF0

00DC63F2    8BEC            MOV EBP,ESP   執行完它後,EBP=ESP=12FFC0,打破了從跟蹤到這裡EBP的值一直為12fff0的情況,同時也讓我們也可以知道入口程式碼就在附近。Stolen Code第二句。

00DC63F4    81EC 10000000   SUB ESP,10 Stolen Code第三句,這句要改為ADD ESP,10 標準化。

00DC63FA    F2:             PREFIX REPNE:                            ; 多餘的字首

 

00DC63FE   /65:EB 01        JMP SHORT 00DC6402                       ; 多餘的字首

 

00DC6402    51              PUSH ECX

00DC6403   /EB 04           JMP SHORT 00DC6409

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

後面有無數條小跳轉,全部都是垃圾,我跟蹤了40分鐘,還沒走完,已經吐血了。

所以Dephi程式最好先確定Stolen Code數目。

004B7220 > $  55            PUSH EBP

004B7221   .  8BEC          MOV EBP,ESP

004B7223   .  83C4 F0       ADD ESP,-10   

004B7226   .  B8 A86F4B00   MOV EAX,Pe.004B6FA8

 

這個程式一共抽掉11位元組。

 

前面三句我們已經得到,現在的問題是MOV EAX,xxxxxxxx

 

EAX的值是多少?  

 

ALT+M 開啟記憶體映象。

 

記憶體映象, 專案 12

 

 地址=00401000      //對401000 Code段下記憶體斷點。

 大小=000B7000 (749568.)

 Owner=Pej      00400000

 區段=

 Contains=code

 型別=Imag 01001002

 訪問=R

 初始訪問=RWE

     

004065D8  - FF25 58C24B00   JMP DWORD PTR DS:[4BC258]  //中斷在這裡,清除記憶體斷點。

004065DE    8BC0            MOV EAX,EAX

004065E0  - FF25 54C24B00   JMP DWORD PTR DS:[4BC254]

004065E6    8BC0            MOV EAX,EAX

004065E8  - FF25 50C24B00   JMP DWORD PTR DS:[4BC250]

004065EE    8BC0            MOV EAX,EAX

004065F0  - FF25 4CC24B00   JMP DWORD PTR DS:[4BC24C]

004065F6    8BC0            MOV EAX,EAX

004065F8    50              PUSH EAX

004065F9    6A 40           PUSH 40

004065FB    E8 E0FFFFFF     CALL Pej.004065E0

00406600    C3              RETN

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

                  

00DB1C64    55              PUSH EBP  //F8返回殼中。

00DB1C65    8BEC            MOV EBP,ESP

00DB1C67    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]

00DB1C6A    85C0            TEST EAX,EAX

00DB1C6C    75 13           JNZ SHORT 00DB1C81

00DB1C6E    813D A47ADB00 0>CMP DWORD PTR DS:[DB7AA4],400000         ; ASCII "MZP"

00DB1C78    75 07           JNZ SHORT 00DB1C81

00DB1C7A    A1 A47ADB00     MOV EAX,DWORD PTR DS:[DB7AA4]

00DB1C7F    EB 06           JMP SHORT 00DB1C87

00DB1C81    50              PUSH EAX

00DB1C82    E8 3135FFFF     CALL 00DA51B8                            ; JMP to kernel32.GetModuleHandleA

00DB1C87    5D              POP EBP

00DB1C88    C2 0400         RETN 4  //Ctrl+F9返回。

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

 

004066AD    A3 68B64B00     MOV DWORD PTR DS:[4BB668],EAX            ; Pej.00400000

004066B2    A1 68B64B00     MOV EAX,DWORD PTR DS:[4BB668]

004066B7    A3 AC804B00     MOV DWORD PTR DS:[4B80AC],EAX

004066BC    33C0            XOR EAX,EAX

004066BE    A3 B0804B00     MOV DWORD PTR DS:[4B80B0],EAX

004066C3    33C0            XOR EAX,EAX

004066C5    A3 B4804B00     MOV DWORD PTR DS:[4B80B4],EAX

004066CA    E8 C1FFFFFF     CALL Pej.00406690

004066CF    BA A8804B00     MOV EDX,Pej.004B80A8

004066D4    8BC3            MOV EAX,EBX  //這裡EBX就是我們要的EAX的數值。004B6FA8 記下來。

004066D6    E8 D9DBFFFF     CALL Pej.004042B4

004066DB    5B              POP EBX

004066DC    C3              RETN

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

 

004B721B    0080 6F4B0000   ADD BYTE PTR DS:[EAX+4B6F],AL  //向上數11個00,確定真Oep為004B7220,補上我們記錄的Stolen Code吧。

004B7221    0000            ADD BYTE PTR DS:[EAX],AL

004B7223    0000            ADD BYTE PTR DS:[EAX],AL

004B7225    0000            ADD BYTE PTR DS:[EAX],AL

004B7227    0000            ADD BYTE PTR DS:[EAX],AL

004B7229    0000            ADD BYTE PTR DS:[EAX],AL

004B722B    E8 6CF4F4FF     CALL Pej.0040669C

004B7230    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]  //臨時Oep

004B7235    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B7237    E8 C48CFCFF     CALL Pej.0047FF00

004B723C    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B7241    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B7243    BA 80724B00     MOV EDX,Pej.004B7280

004B7248    E8 AB88FCFF     CALL Pej.0047FAF8

004B724D    8B0D F4A14B00   MOV ECX,DWORD PTR DS:[4BA1F4]            ; Pej.004BBCAC

004B7253    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B7258    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B725A    8B15 48E44A00   MOV EDX,DWORD PTR DS:[4AE448]            ; Pej.004AE494

004B7260    E8 B38CFCFF     CALL Pej.0047FF18

004B7265    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B726A    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B726C    E8 278DFCFF     CALL Pej.0047FF98

004B7271    E8 06D2F4FF     CALL Pej.0040447C

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

 

Ctrl+G 004B7220  

 

004B7220    55              PUSH EBP      //現在可以用外掛修正入口為B7220,重建輸入表選方式2脫殼。

004B7221    8BEC            MOV EBP,ESP

004B7223    83C4 10         ADD ESP,10

004B7226    B8 A86F4B00     MOV EAX,Pej.004B6FA8

004B722B    E8 6CF4F4FF     CALL Pej.0040669C

004B7230    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B7235    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B7237    E8 C48CFCFF     CALL Pej.0047FF00

004B723C    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B7241    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B7243    BA 80724B00     MOV EDX,Pej.004B7280

004B7248    E8 AB88FCFF     CALL Pej.0047FAF8

004B724D    8B0D F4A14B00   MOV ECX,DWORD PTR DS:[4BA1F4]            ; Pej.004BBCAC

004B7253    A1 C4A04B00     MOV EAX,DWORD PTR DS:[4BA0C4]

004B7258    8B00            MOV EAX,DWORD PTR DS:[EAX]

004B725A    8B15 48E44A00   MOV EDX,DWORD PTR DS:[4AE448]            ; Pej.004AE494

004B7260    E8 B38CFCFF     CALL Pej.0047FF18

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

 

IAT修復,關閉OD,開啟加殼程式,呵呵OEP填1000,ImportREC把Size認為000000A8太小了,改為1000,點獲得輸入表。顯示無效,先用等級1方式跟蹤,然後用Asprtect1.22外掛再減輕一下壓力。還剩591個指標沒修復。

 

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

 

點選show invalid並右鍵單擊選擇其中的一個,讓我們來修復它                        

 

00BC214<- 右鍵單擊選擇DeasmHexView檢視:  

 

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

 

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

 

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

 

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

 

00DB1D2E    call 00DA5158    // = kernel32.dll/00B3/FindResourceA

 

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

 

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

 

拿起剪刀,將剩下590個垃圾指標全部Cut,IAT全部修復,爽啊。修正Oep 為 B7220 最後修復檔案,無法執行!

 

經過除錯N個Dephi檔案,發現Asprotect1.23rc4的Dephi程式,入口處脫殼有反脫殼程式碼,只能在最後一次異常處脫殼,不然即使修復IAT和補上程式碼也不能執行。

 

於是在最後一次異常處用LoadPe脫殼,IAT修復和Stolen Code過程同上面,最後正常執行。

 

 

【破解總結】發現Dephi語言的Asprotect1.23Rc4的殼開始用Stolen Code,並且有變形指令,反脫殼程式碼,最麻煩,tc ebp==12fff0還不錯吧,好累啊,全文完。

 

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

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

相關文章