Acprotect之完美解除安裝XP V9.15脫殼修復+偽破解篇祝賀FLY大俠

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

【脫文作者】 weiyi75[Dfcg]

【作者郵箱】 weiyi75@sohu.com 

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

【使用工具】 Peid0.91,Ollydbg1.10b(反Antidbg版),ImportREC1.42,,Freeres,ResScope,PEedit

【破解平臺】 Win2000/XP

【軟體名稱】 完美解除安裝XP V9.15

【下載地址】 天空軟體站

【軟體簡介】:軟體共有3個小程式,分別是:磁碟垃圾清理軟體、軟體安裝監視器、軟體解除安裝工具,是一套功能比較強大的安裝/解除安裝/清理工具,新版更加全面的系統監視,讓軟體安裝的一舉一動歷歷在目,二次清理技術,軟體解除安裝後將不留任何垃圾,磁碟垃圾清理的數量更多,軟體執行更加穩定。 

【軟體大小】 4.64M

【加殼方式】 UltraProtect 1.x -> RISCO Software Inc.

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

【破解目的】 尋找Stolen Code具體內容,欺騙Acprotect完全解碼。

 先用peid查殼,UltraProtect 1.x -> RISCO Software Inc.這個版本估計是用Acprotect1.10 Build123以上的版本加密的。此版本的Stolen Code隱藏更深,硬體斷點設定不當根本攔截不住Stolen Code,模擬跟蹤我的Win2000平臺5-15分鐘可以截獲Stolen Code,Xp平臺遇到無效指令或單步跟蹤陷阱。根據9.14版的除錯經驗

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

04AE000 >  60              pushad    //加殼程式入口點,F9執行。
004AE001    FC              cld
004AE002    48              dec eax
004AE003    66:81C2 2FAC    add dx, 0AC2F
004AE008    50              push eax
004AE009    E8 01000000     call NetClean.004AE00F
004AE00E    EA 5858668B F55>jmp far 50F5:8B665858
004AE015    E8 01000000     call NetClean.004AE01B
004AE01A    EB 58           jmp short NetClean.004AE074
004AE01C    58              pop eax
004AE01D    87F2            xchg edxesi
004AE01F    E8 01000000     call NetClean.004AE025
004AE024    9A 83042406 C30>call far 0FC3:06240483
004AE02B    8801            mov byte ptr ds:[ecx], al
004AE02D    0000            add byte ptr ds:[eax], al
004AE02F    0048 E8         add byte ptr ds:[eax-18], cl
004AE032    0100            add dword ptr ds:[eax], eax
004AE034    0000            add byte ptr ds:[eax], al
004AE036  - 76 83           jbe short NetClean.004ADFBB
...........................................................

INT3中斷

004BCB23    90              nop  //典型Acprotect小於1.20版最後一次異常。
004BCB24    64:67:8F06 0000 pop dword ptr fs:[0]
004BCB2A    83C4 04         add esp, 4
004BCB2D    60              pushad
004BCB2E    E8 00000000     call NetClean.004BCB33
004BCB33    5E              pop esi
004BCB34    83EE 06         sub esi, 6
004BCB37    B9 5B000000     mov ecx, 5B
004BCB3C    29CE            sub esiecx
004BCB3E    BA F631BE1F     mov edx, 1FBE31F6
004BCB43    C1E9 02         shr ecx, 2
004BCB46    83E9 02         sub ecx, 2
004BCB49    83F9 00         cmp ecx, 0
004BCB4C    7C 1A           jl short NetClean.004BCB68
004BCB4E    8B048E          mov eaxdword ptr ds:[esi+ecx*4]
........................................................................

堆疊內容

0012FF58   0012FFE0  指標到下一個 SEH 記錄
0012FF5C   004BCAF0  SE 控制程式碼      //這裡同原來不同,為了跟蹤到Stolen Code,選擇合適的地點跟蹤很關鍵,在跟蹤N個Acprotect程式後,找到了關鍵點,這些沒什麼技術可言,只是不斷的實際,無數次的失敗總結。右鍵對004BCAF0轉存中跟隨,下記憶體訪問斷點。
0012FF60   00000035
........................................................................

004BCAF0    8B4424 04       mov eaxdword ptr ss:[esp+4]  //下斷點Shift+F9中斷1
004BCAF4    8B4C24 0C       mov ecxdword ptr ss:[esp+C]
004BCAF8    FF81 B8000000   inc dword ptr ds:[ecx+B8]
004BCAFE    8B00            mov eaxdword ptr ds:[eax]
004BCB00    2D 03000080     sub eax, 80000003
004BCB05    75 12           jnz short NetClean.004BCB19
004BCB07    90              nop
004BCB08    90              nop
004BCB09    90              nop
004BCB0A    90              nop
004BCB0B    33C0            xor eaxeax
004BCB0D    8941 04         mov dword ptr ds:[ecx+4], eax
004BCB10    8941 08         mov dword ptr ds:[ecx+8], eax
004BCB13    8941 0C         mov dword ptr ds:[ecx+C], eax
004BCB16    8941 10         mov dword ptr ds:[ecx+10], eax
004BCB19    C3              retn
........................................................................

004BCB4E    8B048E          mov eaxdword ptr ds:[esi+ecx*4] //下斷點Shift+F9中斷2,清除記憶體斷點
004BCB51    8B5C8E 04       mov ebxdword ptr ds:[esi+ecx*4+4]
004BCB55    03C3            add eaxebx
004BCB57    C1C0 13         rol eax, 13
004BCB5A    2BC2            sub eaxedx
004BCB5C    81EA DA4777C0   sub edx, C07747DA
004BCB62    89048E          mov dword ptr ds:[esi+ecx*4], eax
004BCB65    49              dec ecx
004BCB66  ^ EB E1           jmp short NetClean.004BCB49
004BCB68    61              popad
004BCB69    61              popad
004BCB6A    C3              retn //F4直接下來,這時是模擬跟蹤的時候了。
.......................................................................

命令列下  tc ebp==12fff0

為什麼要設定這個命令,先前已說明這是Acprotect的死穴之一,對準它點吧。

004CBB31    55              push ebp
004CBB32    8BEC            mov ebpesp
004CBB34    6A FF           push -1
004CBB36    90              nop
004CBB37    60              pushad
004CBB38    60              pushad
004CBB39    E8 00000000     call NetClean.004CBB3E

Ctrl+F11跟蹤進入每個Call,1分鐘左右。

004CBB31    55              push ebp           //Stolen Code
004CBB32    8BEC            mov ebpesp      //Stolen Code //一切盡在掌握
004CBB34    6A FF           push -1         //Stolen Code    
004CBB36    90              nop            //注意它填充了一個nop,所以ImportREC修復時有點.....
004CBB37    60              pushad
004CBB38    60              pushad
004CBB39    E8 00000000     call NetClean.004CBB3E

Btw:只有用INT3中斷,才能順利截獲這個版本的Stolen Code,如果你用記憶體異常Tc ebp==12fff0,你會踏進它早已佈下的單步異常陷阱。當然硬體斷點12fff0也無法斷下,因為你試圖中斷時12fff0已經寫入資料,中斷失敗
 
我們來看看硬體斷點。

004BCB4E    8B048E          mov eaxdword ptr ds:[esi+ecx*4]  
004BCB51    8B5C8E 04       mov ebxdword ptr ds:[esi+ecx*4+4]
004BCB55    03C3            add eaxebx
004BCB57    C1C0 13         rol eax, 13
004BCB5A    2BC2            sub eaxedx
004BCB5C    81EA DA4777C0   sub edx, C07747DA
004BCB62    89048E          mov dword ptr ds:[esi+ecx*4], eax
004BCB65    49              dec ecx
004BCB66  ^ EB E1           jmp short NetClean.004BCB49
004BCB68    61              popad
004BCB69    61              popad 
004BCB6A    C3              retn  //同樣F4直接下來

命令列下斷點
 
d 12ffc0

0012FFC0  00 00 00 00 C7 14 E6 77  ....?w
0012FFC8  E6 17 F5 77 78 17 F5 77  ?wx w
0012FFD0  00 F0 FD 7F F0 7C 11 F7  .瘕| 
0012FFF0  00 00 00 00 00 00 00 00  ........  注意這時12ffc0還沒有寫入資料。
0012FFF8  00 E0 4A 00 00 00 00 00  .J.....
 
我們對準0012ffc0下一個硬體訪問dword斷點,F9執行,硬體中斷1

如果你對0012ffc0下一個硬體寫入dword斷點,F9執行,你就會硬體中斷2

004CBB31    55              push ebp           //Stolen Code  //硬體中斷1
004CBB32    8BEC            mov ebpesp      //Stolen Code //一切盡在掌握 硬體中斷2
004CBB34    6A FF           push -1         //Stolen Code    
004CBB36    90              nop
004CBB37    60              pushad
004CBB38    60              pushad
004CBB39    E8 00000000     call NetClean.004CBB3E
........................................................................
 
這個程式抽了5個位元組。

ALT+M 開啟記憶體映象斷點,對準它的第二個死穴點。   

記憶體映象,專案 26

 地址=00401000     //Code段下記憶體訪問斷點
 大小=00047000 (290816.)
 Owner=NetClean 00400000
 區段=.text
 包含=code
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE
 
F9執行到達

004432D9    68 D8B24400     push NetClean.0044B2D8
004432DE    68 94344400     push NetClean.00443494     //臨時Oep,捲軸向上看,如何判斷抽掉多少位元組,用捲軸是程式碼會混亂,右鍵分析程式碼,如我現在調整的樣式,標籤1
004432E3    64:A1 00000000  mov eaxdword ptr fs:[0]
004432E9    50              push eax
004432EA    64:8925 0000000>mov dword ptr fs:[0], esp
004432F1    83EC 68         sub esp, 68
004432F4    53              push ebx
004432F5    56              push esi
004432F6    57              push edi
004432F7    8965 E8         mov dword ptr ss:[ebp-18], esp
004432FA    33DB            xor ebxebx
004432FC    895D FC         mov dword ptr ss:[ebp-4], ebx
004432FF    6A 02           push 2
00443301    FF15 70874400   call dword ptr ds:[448770]               ; MSVCRT.__set_app_type

 

標籤1

 

004432D1  .  C2 1000       retn 10 

004432D4      60            db 60     //確定真Oep為004432d4                         ;  CHAR '`'

004432D5      CA            db CA

004432D6      B5            db B5

004432D7   .  D4 11         aam 11

004432D9   .  68 D8B24400   push NetClean.0044B2D8

004432DE   .  68 94344400   push NetClean.00443494                   ;  jmp to MSVCRT._except_handler3; SE handler installation

004432E3   .  64:A1 0000000>mov eaxdword ptr fs:[0]

004432E9   .  50            push eax

004432EA   .  64:8925 00000>mov dword ptr fs:[0], esp

004432F1   .  83EC 68       sub esp, 68

004432F4   .  53            push ebx

004432F5   .  56            push esi

004432F6   .  57            push edi

004432F7   .  8965 E8       mov dword ptr ss:[ebp-18], esp

004432FA   .  33DB          xor ebxebx

004432FC   .  895D FC       mov dword ptr ss:[ebp-4], ebx

004432FF   .  6A 02         push 2

00443301   .  FF15 70874400 call dword ptr ds:[448770]               ;  MSVCRT.__set_app_type

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

 

OD直接修復找到的5個位元組。

 

004432D4 >/$  55            push ebp   //用Od外掛修正入口為432D4直接脫殼吧,重建輸入表的勾去掉

004432D5  |.  8BEC          mov ebpesp

004432D7  |.  6A FF         push -1

004432D9  |.  68 D8B24400   push Unpack_.0044B2D8

004432DE  |.  68 94344400   push <jmp.&msvcrt._except_handler3>      ;  SE handler installation

004432E3  |.  64:A1 0000000>mov eaxdword ptr fs:[0]

004432E9  |.  50            push eax

004432EA  |.  64:8925 00000>mov dword ptr fs:[0], esp

004432F1  |.  83EC 68       sub esp, 68

004432F4  |.  53            push ebx

004432F5  |.  56            push esi

004432F6  |.  57            push edi

004432F7  |.  8965 E8       mov dword ptr ss:[ebp-18], esp

004432FA  |.  33DB          xor ebxebx

004432FC  |.  895D FC       mov dword ptr ss:[ebp-4], ebx

004432FF  |.  6A 02         push 2

00443301  |.  FF15 70874400 call dword ptr ds:[<&msvcrt.__set_app_ty>;  MSVCRT.__set_app_type

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

 

修復IAT必須關閉OD單獨開加殼程式修復,不然ImportREC停止響應,最後用ImportREC Oep填432D3,跟蹤等級三輕鬆修復,有10個指標提示無法修復,你可以驗證一下,經過驗證全部是垃圾指標,通常ImportREC可全部修復指標,如有沒有一般都是垃圾,拿剪刀全部Cut掉,Oep改回為432D4修復後無法執行,尋找出錯原因。

 

尋找出錯原因。

 

004431C4  |.  68 00404500   PUSH 2_.00454000

004431C9  |.  E8 DC000000   CALL <JMP.&msvcrt._initterm>  //這個Call可能是新版Acprotect的解碼技術,進這個Call裡面,迴圈解碼,沒解完程式就崩潰。

004431CE  |.  83C4 24       ADD ESP,24  //這裡類似程式碼,我沒有再次跟蹤。

 

其實本版本Acprotect嵌有Oep處程式碼檢驗程式,發現Oep處程式碼被替換,立即拒絕解碼,你失去了關鍵的程式碼當然程式無法執行,還要承認N次錯誤確定按鈕。

 

004CBB31    55              push ebp           //Stolen Code

004CBB32    8BEC            mov ebpesp      //Stolen Code //一切盡在掌握

004CBB34    6A FF           push -1         //Stolen Code  

 

我們已經掌握。

 

004432D9   .  68 D8B24400   push NetClean.0044B2D8   //臨時Oep也知道。

 

現在做什麼,讓程式認為你沒有脫殼,將perplex段裡面有用的內容全部解碼。

 

方法

 

push ebp       //Stolen Code

mov ebpesp  //Stolen Code                //一切盡在掌握

push -1      //Stolen Code

jmp  004432D9

 

Od載入脫殼修復後的程式,Ctrl+G 004AE000

 

004AE000    60              pushad   //4AE000是原來殼的入口點,狸貓換太子,將Oep入口程式碼複製到這裡。

004AE001    FC              cld

004AE002    48              dec eax

004AE003    66:81C2 2FAC    add dx, 0AC2F

004AE008    50              push eax

004AE009    E8 01000000     call Unpack_.004AE00F

004AE00E    EA 5858668B F55>jmp far 50F5:8B665858

004AE015    E8 01000000     call Unpack_.004AE01B

004AE01A    EB 58           jmp short Unpack_.004AE074

004AE01C    58              pop eax

004AE01D    87F2            xchg edxesi

004AE01F    E8 01000000     call Unpack_.004AE025

004AE024    9A 83042406 C30>call far 0FC3:06240483

004AE02B    8801            mov byte ptr ds:[ecx], al

004AE02D    0000            add byte ptr ds:[eax], al

004AE02F    0048 E8         add byte ptr ds:[eax-18], cl

004AE032    0100            add dword ptr ds:[eax], eax

004AE034    0000            add byte ptr ds:[eax], al

004AE036  - 76 83           jbe short Unpack_.004ADFBB

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

 

004AE000    55              push ebp

004AE001    8BEC            mov ebpesp

004AE003    6A FF           push -1

004AE005  - E9 CF52F9FF     jmp Unpack_.004432D9

004AE00A    90              nop    

004AE00B    90              nop    //注意保持程式碼完整,填入4個Nop

004AE00C    90              nop

004AE00D    90              nop

004AE00E    EA 5858668B F55>jmp far 50F5:8B665858

004AE015    E8 01000000     call Unpack_.004AE01B

004AE01A    EB 58           jmp short Unpack_.004AE074

004AE01C    58              pop eax

004AE01D    87F2            xchg edxesi

004AE01F    E8 01000000     call Unpack_.004AE025

004AE024    9A 83042406 C30>call far 0FC3:06240483

004AE02B    8801            mov byte ptr ds:[ecx], al

004AE02D    0000            add byte ptr ds:[eax], al

004AE02F    0048 E8         add byte ptr ds:[eax-18], cl

004AE032    0100            add dword ptr ds:[eax], eax

004AE034    0000            add byte ptr ds:[eax], al

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

 

將替換的程式碼複製到程式中,另存為一個檔案,用PEedit修正入口為AC000正常執行。

 

完美解除安裝XP很久已經就是DEMO版,破解基本沒希望,針對C語言資源容易修改的特點。用ResScope修改主介面102對話方塊資源,將本軟體授權給: NOP掉。合作伙伴: 修改為 本軟體授權給David,儲存時錯誤,看來資源沒完全釋放啊,再用Freeres釋放資源,可以反彙編,必盡這只是模擬脫殼。繼續完成修改過程,看勝利截圖,聊博一笑。


 

【破解總結】發現C語言的Acprotect的殼採用了Stolen Code,動態解碼,用Acprotect保護的它人沒加上RSAKEY就有強勁的保護,新版Acprotect異常設定應選INT3中斷,模擬跟蹤或硬體斷點截獲Stolen Code。

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

 

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


David:

Oep改回為432D4修復後無法執行,尋找出錯原因。 

尋找出錯原因。 

004431C4  |.  68 00404500   PUSH 2_.00454000 

004431C9  |.  E8 DC000000   CALL <JMP.&msvcrt._initterm>  //這個Call可能是新版Acprotect的解碼技術,進這個Call裡面,迴圈解碼,沒解完程式就崩潰。 

004431CE  |.  83C4 24       ADD ESP,24  //這裡類似程式碼,我沒有再次跟蹤。 
  
其實本版本Acprotect嵌有Oep處程式碼檢驗程式,發現Oep處程式碼被替換,立即拒絕解碼,你失去了關鍵的程式碼當然程式無法執行,還要承認N次錯誤確定按鈕。

我測試了一下跨平臺,一點問題都沒有,因為部分程式碼臨時解壓,估計跨平臺能力不錯,這個辦法可以反彙編程式,可以修改資源,也是個不錯的方法,Acprotect真正可怕的是用RSAKEY嵌入校驗解碼,無KEY就無法完全解碼,最多是走DEMO路線。

Dfcg的YOCK有更好的修復方法,你可以問問他。

相關文章