ASProtect 1.23RC4之Dephi語言篇
【脫文作者】 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還不錯吧,好累啊,全文完。
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!
相關文章
- Acprotect1.10 Build123之Dephi語言篇2015-11-15UI
- ASProtect 1.23RC4之System Cleaner
4.91d脫殼修復and破解2015-11-15
- 以殼解殼――ASProtect
1.23RC4殼的Stolen Code簡便解決方案2004-05-13
- Go語言流程控制之迴圈結構篇2024-07-10Go
- 如何系統學習C 語言(下)之 檔案篇2021-11-13
- 如何系統學習C 語言(上)之 基礎篇2021-10-31
- 最具有價效比的語言javascript之介紹篇2013-09-28JavaScript
- Go語言高階資料型別之指標篇2024-07-06Go資料型別指標
- D程式語言基礎篇2019-12-02
- 飛機的 PHP 學習筆記之語言基礎篇2020-01-14PHP筆記
- 如何系統學習C 語言(中)之 結構體篇2021-11-11結構體
- ASProtect
1.23RC4 以殼解殼+暗樁修復+解除自校驗+破解――ArtCursors V3.99B32004-06-16
- 如何系統學習C 語言(下)之 預處理命令篇2021-11-14
- Dart 語言基礎入門篇2020-01-07Dart
- Go語言常用的運算子篇2024-07-07Go
- prometheus之查詢語言2022-04-02Prometheus
- oracle之PLSql語言(一)2017-09-20OracleSQL
- 如何系統學習C 語言(中)之 聯合體、列舉篇2021-11-12
- 第五篇:R語言資料視覺化之散點圖2016-04-23R語言視覺化
- 第三篇:R語言資料視覺化之條形圖2016-03-30R語言視覺化
- Go語言庫系列之email2020-04-06GoAI
- Flutter系列之Dart語言概述2019-08-25FlutterDart
- Go語言淺嘗之方法2021-09-09Go
- iOS 多語言化之痛2018-07-17iOS
- 也談ASProtect 1.3之stolen code的修復2015-11-15
- C語言的本質(32)——C語言與彙編之C語言內聯彙編2014-07-24C語言
- GO語言學習筆記之mac環境go語言配置2024-09-09Go筆記Mac
- Dart語法篇之基礎語法(一)2019-10-27Dart
- spaCy 學習 第二篇:語言模型2019-05-13模型
- 【面試篇】Go語言常見踩坑(一)2021-10-29面試Go
- C語言第四篇:指標的辨析2016-03-22C語言指標
- C語言第五篇:位運算2016-03-23C語言
- Golang語言檔案操作快速入門篇2024-08-01Golang
- Golang語言標準庫time實戰篇2024-08-02Golang
- 大資料系列部落格之 — 深入簡出 Shell 指令碼語言(高階篇)2018-11-06大資料指令碼
- oracle之PLSql語言(二)sql語句的使用2017-09-20OracleSQL
- 語言奇想錄之我們語速太慢了!2013-07-26
- Go 語言操作 MySQL 之 SQLX 包2020-07-07GoMySql