Acprotect1.10 Build123之Dephi語言篇
【脫文作者】 weiyi75[Dfcg]
【作者郵箱】 weiyi75@sohu.com
【作者主頁】 Dfcg官方大本營
【使用工具】 Ollydbg1.10b(反Antidbg版),ImportREC1.42
【破解平臺】 Win2000/XP
【軟體名稱】 PE檔案分析器
【下載地址】 附件下載
【軟體簡介】 Acprotect1.10 Build123“註冊”版本加密的一個加密的一個PE檔案分析器。
【軟體大小】 553k
【加殼方式】 UltraProtect 1.x -> RISCO Software Inc.
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享。
【破解目的】 模擬跟蹤尋找Stolen Code具體內容。
前言,這個軟體是我用Acprotect1.10 Build123“註冊”版本加密的,沒有使用RSA生成KEY保護,使用了所有反跟蹤選項,關於動態程式碼替換保護軟體已說明只支援C++和Dephi,呵呵,對準敵人的死穴點吧,就是模擬跟蹤+記憶體映象斷點。
先OD載入原程式看看
004B7220 > $ 55 PUSH EBP //典型Dephi語言入口點,當Acprotect的殼執行到OEP時,你會發現入口點附近的一些程式碼被修改,如果你直接脫殼會導致不能執行。經過分析幾個Acprotect修改入口程式碼個數,暫時發現一般是6個位元組,有待驗證。
稍微說明一下:
每一種編譯工具例如 : VC++ , Delphi , Borland , etc..
在OEP有一個唯一的/相同的PE頭
其中的一些是這樣的:
Push EBP //第一句就是我們模擬跟蹤的物件,幸運的是,目前Acprotect還沒有采用Asprotect的入口程式碼變形技術,變了也沒用?!
MOV Ebp,Esp
Add ESP , -010
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
..........................................................................................
我們再次複習Dephi語言入口特徵碼。
這次EBP=12fff0不管用了,程式執行到入口時,EBP的值根本不是12fff0。
OD異常設定不忽略記憶體異常,其餘全部忽略,載入程式,用外掛隱藏OD。
004EF000 > 60 pushad //加殼程式入口點,F9執行。
004EF001 87E9 xchg ecx, ebp
004EF003 F9 stc
004EF004 41 inc ecx
004EF005 BF 08589F45 mov edi, 459F5808
004EF00A 50 push eax
004EF00B E8 01000000 call Pey.004EF011
004EF010 7E 58 jle short Pey.004EF06A
004EF012 58 pop eax
004EF013 C1ED E9 shr ebp, 0E9
004EF016 EB 01 jmp short Pey.004EF019
004EF018 - 76 D3 jbe short Pey.004EEFED
004EF01A ED in eax, dx
004EF01B EB 01 jmp short Pey.004EF01E
004EF01D - 75 85 jnz short Pey.004EEFA4
........................................................................
記憶體異常
00415719 CD 01 int 1 //典型Acprotect小於1.20版最後一次異常。
004F771B 40 inc eax
004F771C 40 inc eax
004F771D 0BC0 or eax, eax
004F771F 75 05 jnz short Pey.004F7726
004F7721 90 nop
004F7722 90 nop
004F7723 90 nop
004F7724 90 nop
004F7725 61 popad
004F7726 33C0 xor eax, eax
004F7728 64:8F00 pop dword ptr fs:[eax]
004F772B 58 pop eax
004F772C 60 pushad
004F772D E8 00000000 call Pey.004F7732
........................................................................
堆疊內容
0012FF58 0012FFE0 指標到下一個 SEH 記錄
0012FF5C 004F76FD SE 控制程式碼 //這裡同原來不同,為了跟蹤到Stolen Code,選擇合適的地點跟蹤很關鍵,在跟蹤N個Acprotect程式後,找到了關鍵點,這些沒什麼技術可言,只是不斷的實際,無數次的失敗總結。右鍵對004F76FD轉存中跟隨,下記憶體訪問斷點。
0012FF60 00000042
0012FF64 59D26602
........................................................................
004156FD 8B5C24 0C mov ebx, dword ptr ss:[esp+C] //下斷點Shift+F9中斷1
004F7701 8383 B8000000 0>add dword ptr ds:[ebx+B8], 2
004F7708 33C0 xor eax, eax
004F770A C3 retn
004F770B 64:67:FF36 0000 push dword ptr fs:[0]
004F7711 64:67:8926 0000 mov dword ptr fs:[0], esp
004F7717 33C0 xor eax, eax
004F7719 CD 01 int 1
004F771B 40 inc eax
004F771C 40 inc eax
004F771D 0BC0 or eax, eax
004F771F 75 05 jnz short Pey.004F7726
004F7721 90 nop
004F7722 90 nop
004F7723 90 nop
004F7724 90 nop
004F7725 61 popad
........................................................................
004F774D 8B048E mov eax, dword ptr ds:[esi+ecx*4] //下斷點Shift+F9中斷2,清除記憶體斷點。
004F7750 8B5C8E 04 mov ebx, dword ptr ds:[esi+ecx*4+4]
004F7754 2BC3 sub eax, ebx
004F7756 C1C8 11 ror eax, 11
004F7759 03C2 add eax, edx
004F775B 81F2 B0362B9F xor edx, 9F2B36B0
004F7761 89048E mov dword ptr ds:[esi+ecx*4], eax
004F7764 49 dec ecx
004F7765 ^ EB E1 jmp short Pey.004F7748
004F7767 61 popad
004F7768 61 popad
004F7769 C3 retn //F4直接下來,這時是模擬跟蹤的時候了。
........................................................................
Ctrl+T設定暫停執行跟蹤條件
將命令是一個核取方塊打勾,填入 PUSH EBP ,確定。
這個條件斷點如何在命令列設定,肯請諸位大俠不吝指教。為什麼要設定這個命令,先前已說明這是Acprotect的死穴之一,對準它點吧。
Ctrl+F11跟蹤進入每個Call,1分鐘左右。
004254C9 55 push ebp //Stolen Code
004254CA 8BEC mov ebp, esp //Stolen Code //一切盡在掌握
004254CC 83EC 44 ADD ESP,-10 //Stolen Code
004254CF 60 pushad
004254D0 60 pushad
005074D1 E8 00000000 call Pey.005074D6
也可以下個12ffc0的硬體寫入dword斷點,可以斷在4254CA這句
........................................................................
這個程式抽了六個位元組。
ALT+M 開啟記憶體映象斷點,對準它的第二個死穴點。
記憶體映象,專案 21
地址=00401000 //Code段下記憶體訪問斷點
大小=000B7000 (749568.)
Owner=Pey 00400000
區段=CODE
包含=code
型別=Imag 01001002
訪問=R
初始訪問=RWE
F9執行到達
004B7220 BF C12D8DE2 mov edi, E28D2DC1
004B7225 90 nop
004B7226 B8 A86F4B00 mov eax, Pey.004B6FA8 //臨時Oep,捲軸向上看,如何判斷抽掉多少位元組,用捲軸是程式碼會混亂,然後用Ctrl+向上下鍵配合保證看到臨時Oep程式碼完整,並且上面的要有幾行程式碼同時存在,如我現在調整的樣式。
004B722B E8 6CF4F4FF call Pey.0040669C
004B7230 A1 C4A04B00 mov eax, dword ptr ds:[4BA0C4]
004B7235 8B00 mov eax, dword ptr ds:[eax]
004B7237 E8 C48CFCFF call Pey.0047FF00
004B723C A1 C4A04B00 mov eax, dword ptr ds:[4BA0C4]
004B7241 8B00 mov eax, dword ptr ds:[eax]
004B7243 BA 80724B00 mov edx, Pey.004B7280
004B7248 E8 AB88FCFF call Pey.0047FAF8
004B724D 8B0D F4A14B00 mov ecx, dword ptr ds:[4BA1F4] ; Pey.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] ; Pey.004AE494
004B7260 E8 B38CFCFF call Pey.0047FF18
........................................................................
OD直接修復找到的六個位元組。
004B7220 55 push ebp //用Od外掛修正入口為B7220直接脫殼吧,重建輸入表的勾去掉
004B7221 8BEC mov ebp, esp
004B7223 83C4 F0 add esp, -10
004B7226 B8 A86F4B00 mov eax, Pey.004B6FA8
004B722B E8 6CF4F4FF call Pey.0040669C
004B7230 A1 C4A04B00 mov eax, dword ptr ds:[4BA0C4]
004B7235 8B00 mov eax, dword ptr ds:[eax]
004B7237 E8 C48CFCFF call Pey.0047FF00
004B723C A1 C4A04B00 mov eax, dword ptr ds:[4BA0C4]
004B7241 8B00 mov eax, dword ptr ds:[eax]
004B7243 BA 80724B00 mov edx, Pey.004B7280
004B7248 E8 AB88FCFF call Pey.0047FAF8
004B724D 8B0D F4A14B00 mov ecx, dword ptr ds:[4BA1F4] ; Pey.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] ; Pey.004AE494
004B7260 E8 B38CFCFF call Pey.0047FF18
........................................................................
修復IAT必須關閉OD單獨開加殼程式修復,不然ImportREC停止響應,最後用ImportREC Oep填B7220,跟蹤等級三輕鬆修復,無法執行!?
尋找出錯原因。
004F01F8 /78 01 js short dumped_.004F01FB
004F01FA |F8 clc
004F01FB BF 58D5CC8F mov edi, 8FCCD558
004F0200 8B45 00 mov eax, dword ptr ss:[ebp]
004F0203 7C 03 jl short dumped_.004F0208
004F0205 7D 01 jge short dumped_.004F0208
004F0207 E9 E9040000 jmp dumped_.004F06F5
004F020C 004E 66 add byte ptr ds:[esi+66], cl
004F020F 1BD9 sbb ebx, ecx
004F0211 33C2 xor eax, edx
004F0213 50 push eax
004F0214 E8 01000000 call dumped_.004F021A //發現這個Call可能是新版Acprotect的解碼技術,和完美解除安裝Xp裡面的一樣的,這一段修復一直沒搞定,比原先的Jmp xxxxx 那種語句難多了。
004F0219 EA 58587B05 668>jmp far 8166:057B5858
不好意思,文章沒寫完,卡住了。
今天看到Fly大俠的文章,呵呵,明白是什麼一會事。
其實本版本Acprotect嵌有Oep處程式碼檢驗程式,發現Oep處程式碼被替換,立即拒絕解碼,你失去了關鍵的程式碼當然程式無法執行,還要承認N次錯誤確定按鈕。
004254C9 55 push ebp //Stolen Code
004254CA 8BEC mov ebp, esp //Stolen Code //一切盡在掌握
004254CC 83EC 44 ADD ESP,-10 //Stolen Code
我們已經掌握。
004B7226 B8 A86F4B00 mov eax, Pey.004B6FA8 //臨時Oep也知道。
現在做什麼,讓程式認為你沒有脫殼,乖乖將perplex段裡面有用的內容全部解碼。
方法
push ebp //Stolen Code
mov ebp, esp //Stolen Code //一切盡在掌握
ADD ESP,-10 //Stolen Code
jmp 004B7226 //直接跳向臨時Oep
Od載入脫殼修復後的程式,Ctrl+G 004EF000
004EF000 >/$ 68 420E715B PUSH 5B710E42 //4EF000是原來殼的入口點,狸貓換太子,將Oep入口程式碼複製到這裡。
004EF005 |. 813424 A27989>XOR DWORD PTR SS:[ESP],2C8979A2
004EF00C . C3 RETN
004EF00D . 68 59266136 PUSH 36612659
004EF012 . 813424 248C99>XOR DWORD PTR SS:[ESP],41998C24
004EF019 . C3 RETN
004EF01A . 68 24C959F5 PUSH F559C924
004EF01F . 813424 6863A1>XOR DWORD PTR SS:[ESP],82A16368
004EF026 . C3 RETN
004EF027 . 68 CF904873 PUSH 734890CF
004EF02C . 813424 C01DAE>XOR DWORD PTR SS:[ESP],4AE1DC0
004EF033 . C3 RETN
.........................................................
004EF000 > . 55 PUSH EBP
004EF001 . 8BEC MOV EBP,ESP
004EF003 . 83C4 F0 ADD ESP,-10
004EF006 .- E9 1B82FCFF JMP dumpedw4.004B7226
004EF00B 90 NOP //注意保持程式碼完整,填入一個Nop
004EF00C . C3 RETN
004EF00D . 68 59266136 PUSH 36612659
004EF012 . 813424 248C99>XOR DWORD PTR SS:[ESP],41998C24
004EF019 . C3 RETN
004EF01A . 68 24C959F5 PUSH F559C924
004EF01F . 813424 6863A1>XOR DWORD PTR SS:[ESP],82A16368
004EF026 . C3 RETN
004EF027 . 68 CF904873 PUSH 734890CF
004EF02C . 813424 C01DAE>XOR DWORD PTR SS:[ESP],4AE1DC0
004EF033 . C3 RETN
.........................................................
將替換的程式碼複製到程式中,另存為一個檔案,用PEedit修正入口為EF000,正常執行。
【破解總結】發現Dephi語言的Acprotect的殼採用了Stolen Code,動態解碼,用Acprotect保護的它人沒加上RSAKEY就有強勁的保護,加RSAKEY保護殼繼續研究中,感謝你耐心看完.
相關文章
- ASProtect 1.23RC4之Dephi語言篇2015-11-15
- 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結構體
- 如何系統學習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
- 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
- Go 語言操作 MySQL 之 CURD 操作2020-07-01GoMySql
- MySQL之資料定義語言(DDL)2021-05-25MySql
- Gradle 之語言基礎 Groovy2018-11-30Gradle
- 語言演算法之:階乘2022-02-25演算法