用Armadillo標準加殼的程式的脫殼和引入表修復方案---OLLYDBG (8千字)
用過ARMADILLO的人都知道,用它加殼有兩種方式,一是使用COPYMEMII,一是標準加殼.用COPYMEMII的一般可用DILLODUMP脫(當然也有時脫不了),而用標準加殼用DILLODUMP是脫不了的,這是DILLODUMP中的說明,我們來看看:
NOTE: This only really works on programs that are at least protected to some extent.
For example, it will not work on "Standard Protection" aramadillo files, which isn't
a big deal, because for those you do not need to have any "advanced" tools to dump. I plan
on released a "lite" version to support those files soon..
本人E文很菜,只能瞭解大意,是說標準加殼的脫殼比較簡單,不需用工具.但是對我等菜來說,還是要用工具的好,不過既然現在還沒有,還是手脫吧.
脫殼目標:SoundEdit pro v1.30.634,5月29日更新.
下載:
http://www.rmbsoft.com/getit.asp?pid=6&server=http://www.winsoft98.com/programs/sep13.exe
加殼程式:Armadillo v3.00a
工具:OLLYDBG,LOADPE,importREC
SoundEdit是一個聲音編輯軟體(國外的),採用了ARMADILLO的KEY加密,啟動要你輸入KEY,否則要等N秒才能讓你啟動,還有30天試用期,所以,如果脫了殼,上述現象都將沒有了.現在開始脫殼歷程.!!
第一步,DUMP出程式:
用OLLYDBG載入程式.在除錯選項中忽略所有異常,這樣可以少按SHIFT+F9
BP VirtualProtect,F9執行,這時會有異常,用SHIFT+F9過程式會斷下來,這時你不停按F9,一般在第5次會出現註冊框,OK後再次中斷,這時你要注意堆?技竅F9的次數了.我這第20下時在堆3魷秩縵灤畔:
0012F214 7342F406 /CALL to VirtualProtect from MSVBVM60.7342F400
說明程式,已經執行了.(VB是先執行MSVBVM60.DLL的,在其中也用呼叫VirtualProtect,如果是DELPHI等程式,可一直F9到程式執行為止)
現在重新載入程式,到出現這個資訊的前一次中斷停下來,然後按幾次CTRL+F9到程式中(也就是地址較低的地方,一般都是004*****,005*****,本程式在這:
004DA060 83C4 04 ADD ESP, 4
004DA063 8945 FC MOV DWORD PTR SS:[EBP-4], EAX
004DA066 837D B8 00 CMP DWORD PTR SS:[EBP-48], 0
004DA06A 74 0A JE SHORT SoundEdi.004DA076
004DA06C 8B45 B8 MOV EAX, DWORD PTR SS:[EBP-48]
004DA06F 50 PUSH EAX
004DA070 FF15 E8615000 CALL DWORD PTR DS:[<&USER32.DestroyWi>; USER32.DestroyWindow
004DA076 8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
004DA079 8BE5 MOV ESP, EBP
004DA07B 5D POP EBP
004DA07C C3 RETN
這時小心地用F8,因為有一堆的JMP,JNZ,JO等,不過也用不了多久的,大概20多次就可來到這:
004DB483 61 POPAD
004DB484 6A 00 PUSH 0
004DB486 E8 6E000000 CALL SoundEdi.004DB4F9
004DB48B 83C4 04 ADD ESP, 4
004DB48E 6A 00 PUSH 0
004DB490 E8 46830000 CALL SoundEdi.004E37DB
004DB495 83C4 04 ADD ESP, 4
004DB498 837D E4 01 CMP DWORD PTR SS:[EBP-1C], 1
004DB49C 75 11 JNZ SHORT SoundEdi.004DB4AF
004DB49E 68 E8965000 PUSH SoundEdi.005096E8
004DB4A3 FF15 0C975000 CALL DWORD PTR DS:[50970C] ,這個CALL用F7跟進
004DB4A9 83C4 04 ADD ESP, 4
004DB4AC 8945 E4 MOV DWORD PTR SS:[EBP-1C], EAX
004DB4AF 68 0C9E4D00 PUSH SoundEdi.004D9E0C
在4db4a3這個CALL用f7跟進,然後繼續F8,幾次後就來到這:
00D0B5E0 /75 29 JNZ SHORT 00D0B60B
00D0B5E2 |E8 A05AFFFF CALL 00D01087
00D0B5E7 |FF76 04 PUSH DWORD PTR DS:[ESI+4]
00D0B5EA |8BF8 MOV EDI, EAX
00D0B5EC |A1 CCEED100 MOV EAX, DWORD PTR DS:[D1EECC]
00D0B5F1 |FF76 08 PUSH DWORD PTR DS:[ESI+8]
00D0B5F4 |8B48 70 MOV ECX, DWORD PTR DS:[EAX+70]
00D0B5F7 |3348 50 XOR ECX, DWORD PTR DS:[EAX+50]
00D0B5FA |6A 00 PUSH 0
00D0B5FC |3348 34 XOR ECX, DWORD PTR DS:[EAX+34]
00D0B5FF |03F9 ADD EDI, ECX
00D0B601 |E8 815AFFFF CALL 00D01087
00D0B606 |50 PUSH EAX
00D0B607 |FFD7 CALL EDI SoundEdi.004059B0
看到最後這個CALL EDI嗎,004059B0就是程式的OEP了,我們F7跟進:
00405996 - FF25 3C114000 JMP DWORD PTR DS:[40113C]
0040599C - FF25 8C104000 JMP DWORD PTR DS:[40108C]
004059A2 - FF25 B0104000 JMP DWORD PTR DS:[4010B0]
004059A8 - FF25 E8114000 JMP DWORD PTR DS:[4011E8]
004059AE 0000 ADD BYTE PTR DS:[EAX], AL
004059B0 68 787D4000 PUSH SoundEdi.00407D78 ,這是OEP了,
004059B5 E8 EEFFFFFF CALL SoundEdi.004059A8
呵,典型的VB程式碼.拿出LOADPE,快快DUMP吧.我們把DUMP的程式儲存為DUMPED.EXE
第二步,引入表的修復
以前總以為它的修復很難,但實際上只要修改程式流程,完全可得到正確的引入表的.
1.可先用importREC試試,有一個指標無效,如果CUT程式退出時會出錯,所以要修復它.透過它我們可看到iat的rva為1000,錯誤指標為1030,(如果很多指標無效,只要記住一個無效的RVA就可以了)
2.重新載入程式,BP VirtualProtect,斷下後f9,注意堆5謀浠,當出現如下資訊時要注意了:
0012DB28 00D0887E /CALL to VirtualProtect from 00D08878
0012DB2C 00401000 |Address = SoundEdi.00401000
0012DB30 000CB000 |Size = CB000 (831488.)
0012DB34 00000004 |NewProtect = PAGE_READWRITE
0012DB38 0012F034 \pOldProtect = 0012F034
它將往401000也就是IAT所在的地方寫入資訊:這是再按一下F9,又停下來,D 401000,我們可看到,IAT所在的位置已經寫入了東西,還不是dll的地址,還記得那個無效指標的地址嗎:401030,我們清掉斷點,然後在在記憶體定位到401030處,"右鍵-->breakpoint-->hardware on write-->dword",然後按F9執行,程式停了下來:
00D0942F 8B85 5CFBFFFF MOV EAX, DWORD PTR SS:[EBP-4A4]
00D09435 8B8D 48F9FFFF MOV ECX, DWORD PTR SS:[EBP-6B8]
00D0943B 8908 MOV DWORD PTR DS:[EAX], ECX
00D0943D 8B85 5CFBFFFF MOV EAX, DWORD PTR SS:[EBP-4A4] 停在這
00D09443 83C0 04 ADD EAX, 4
00D09446 8985 5CFBFFFF MOV DWORD PTR SS:[EBP-4A4], EAX
00D0944C ^ E9 78FEFFFF JMP 00D092C9
看到上述二行:MOV ECX,DWORD PRT [EBP-6B8],我們再往上找幾行可看到這個語句:
00D093E3 E8 F8C0FEFF CALL 00CF54E0
00D093E8 8985 48F9FFFF MOV DWORD PTR SS:[EBP-6B8], EAX
00D093EE 83BD 48F9FFFF 0>CMP DWORD PTR SS:[EBP-6B8], 0
00D093F5 75 38 JNZ SHORT 00D0942F
在第二行也有個[EBP-6B8],注意前面這個CALL,我們去看一看
00CF54E0 55 PUSH EBP
00CF54E1 8BEC MOV EBP, ESP
00CF54E3 53 PUSH EBX
00CF54E4 56 PUSH ESI
00CF54E5 57 PUSH EDI
00CF54E6 33FF XOR EDI, EDI
00CF54E8 33DB XOR EBX, EBX
00CF54EA 66:F745 0E FFFF TEST WORD PTR SS:[EBP+E], 0FFFF
00CF54F0 75 03 JNZ SHORT 00CF54F5
00CF54F2 8B5D 0C MOV EBX, DWORD PTR SS:[EBP+C]
00CF54F5 57 PUSH EDI
00CF54F6 FF15 A430D100 CALL DWORD PTR DS:[D130A4] kernel32.GetModuleHandleA
00CF54FC 3945 08 CMP DWORD PTR SS:[EBP+8], EAX
00CF54FF 75 07 JNZ SHORT 00CF5508
00CF5501 BE C053D100 MOV ESI, 0D153C0
00CF5506 EB 60 JMP SHORT 00CF5568
00CF5508 393D 9859D100 CMP DWORD PTR DS:[D15998], EDI
00CF550E B9 9859D100 MOV ECX, 0D15998
00CF5513 74 3C JE SHORT 00CF5551
00CF5515 8B35 B8B1D100 MOV ESI, DWORD PTR DS:[D1B1B8]
00CF551B A1 CCEED100 MOV EAX, DWORD PTR DS:[D1EECC]
00CF5520 F641 08 01 TEST BYTE PTR DS:[ECX+8], 1
00CF5524 74 0E JE SHORT 00CF5534
00CF5526 8B50 70 MOV EDX, DWORD PTR DS:[EAX+70]
00CF5529 3350 60 XOR EDX, DWORD PTR DS:[EAX+60]
00CF552C 3350 3C XOR EDX, DWORD PTR DS:[EAX+3C]
00CF552F F6C2 80 TEST DL, 80
00CF5532 75 13 JNZ SHORT 00CF5547
00CF5534 8B50 70 MOV EDX, DWORD PTR DS:[EAX+70]
00CF5537 3350 64 XOR EDX, DWORD PTR DS:[EAX+64]
00CF553A 3350 58 XOR EDX, DWORD PTR DS:[EAX+58]
00CF553D 3350 20 XOR EDX, DWORD PTR DS:[EAX+20]
00CF5540 3316 XOR EDX, DWORD PTR DS:[ESI]
00CF5542 3955 08 CMP DWORD PTR SS:[EBP+8], EDX
00CF5545 74 1E JE SHORT 00CF5565
00CF5547 83C1 0C ADD ECX, 0C
00CF554A 83C6 04 ADD ESI, 4
00CF554D 3939 CMP DWORD PTR DS:[ECX], EDI
00CF554F ^ 75 CF JNZ SHORT 00CF5520
00CF5551 FF75 0C PUSH DWORD PTR SS:[EBP+C]
這裡面有幾個跳轉,其中最後一個CF554F是往上跳的.我們看一個就可發現:
00CF5513 74 3C JE SHORT 00CF5551,這個跳正好可跳出這個迴圈.只要改這個跳,就不會破壞引入表了.
再次重新載入,BP VirtualProtect,出現註冊框後OK,程式再斷下來,這時清除斷點(包括硬體斷點),CTRL+F9回程式領空,把CF5513的74 3c改成eb 3c,按F9執行,程式執行後開啟importREC,選中程式,入口填入59b0,-->IAT自動搜尋-->獲得輸入資訊",如果還有無效的大可放心的cut,因為它們本來就不是有用指標了(也可能是importREC把IAT的大小判斷錯了),.然後修復脫殼後的檔案.OK,大功告成.
測試了下脫殼後的程式,執行正常,那個煩人的註冊框沒有,時間限制也註冊了,別說30天,就是30年都沒問題.
相關文章
- iOS逆向學習之五(加殼?脫殼?)2019-10-10iOS
- 淺談被加殼ELF檔案的DUMP修復2020-08-19
- iOS應用程式的脫殼實現原理淺析2019-03-04iOS
- 某殼分析+修復(二)2018-05-14
- upx手動脫殼2020-10-26
- 一次簡單的脫殼2024-08-30
- 十、iOS逆向之《越獄砸殼/ipa脫殼》2021-03-18iOS
- 加殼上碰到的問題2018-04-10
- Android之Apk加殼2018-12-11AndroidAPK
- 脫殼基礎知識以及簡單應用2019-06-17
- 淺談被加殼ELF的除錯2020-08-19除錯
- Od跟進之脫殼(待完善)2018-10-20
- 教你如何寫UPX脫殼指令碼2019-05-11指令碼
- 安卓整體加殼(一代殼)原理及實踐2024-09-15安卓
- Android加殼過程中mprotect呼叫失敗的原因及解決方案2021-03-22Android
- Linux 外殼程式2018-08-05Linux
- Android.Hook框架Cydia篇(脫殼機制作)2020-08-19AndroidHook框架
- 從Android執行時出發,打造我們的脫殼神器2020-08-19Android
- 高顏值——靈刃外殼的“金制”修養2019-08-13
- 腦殼疼的tapable2019-04-18
- 某IOT蠕蟲病毒分析之UPX脫殼實戰2018-04-11
- 逆向基礎——軟體手動脫殼技術入門2020-08-19
- 【開源】BlackDex,無需環境,Android新姿勢脫殼工具2021-05-27Android
- 紙殼CMS列表Grid的配置2018-08-17
- apk加殼加密工具(apk protect) v1.0下載2020-12-15APK加密
- 用HBuilder把web應用套殼成app2018-12-05UIWebAPP
- 金蟬脫殼2百度雲免費線上觀看2018-06-23
- 蝦殼也是寶!2023-11-22
- 高研班直播公開課《JNI函式與脫殼分析實戰》 8月14日下午1點!2022-08-14函式
- 深入瞭解標準流以及脫標元素的特點2021-12-23
- uiapp套殼熱更新實現方案(h5也是uiapp寫的)2024-06-14UIAPPH5
- Dalvik下一代殼通用解決方案2020-12-02
- 騰訊安全ApkPecker上線DEX-VMP自動化脫殼服務2021-07-19APK
- 哎,這讓人摳腦殼的 LFU。2021-01-12
- 助力海外,空殼支援Google Play應用分身2024-11-29Go
- 貝殼研究院:北京買房裝修消費趨勢2023-04-07
- Android熱修復原理(一)熱修復框架對比和程式碼修復2018-03-13Android框架
- 羽夏殼世界——異或加密的實現2022-04-11加密
- Linux的標準輸入、標準輸出和標準錯誤2019-03-02Linux