史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 資訊系統安全備援防護技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-01-28, 12:11 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 淺談DBPE2.33脫殼修復

【前 言】:
以前脫殼從來沒有那麼艱辛過,我虛心請教別人,沒有一個人告訴我有價值的回答,基本上都是不會或是不說!

真搞不明白到底是為什麼,難道就那麼保密嗎?

我學脫殼有這樣的成績多謝jwh51,都塊半年沒有看見他了!

【軟體名稱】:DBPE2.33的殼

【下載頁面】:(我的試煉品是愷撒,請愷撒作者多多原諒)
http://yock.8866.org/down/CS-DBPE.rar

【軟體大小】:加殼後213K 沒有加殼前原文件20K 脫殼後文件18K(我不會最佳化)

【套用平台】:WINXP

【軟體簡介】:一個恐怖的殼

【軟體限制】:多多地方反偵錯,還破壞匯入表,破壞游標

【文章作者】:輝仔Yock

【作者聲明】:本人發表這篇文章只是為了學習和研究!!!請不用於商業用途或是將本文方法製作的註冊機或是修正檔文件任意傳播,讀者看了文章後所做的事情與我無關,我也不會負責,請讀者看了文章後三思而後行!最後希望大家在經濟基礎好的時候,支持共享軟體!(在這裡最此軟體的作者以萬二分的歉意鞠躬...)

【破解工具】:Yock-OD(FLY改的不能載入繁復指令插件,所以自己改了一個,還請OLLYDBG的作者原諒!) LordPE(超級強大的PE編輯工具,感謝作者)

—————————————————————————————————
【過 程】:

這兩個殼加密基本是一樣的,但解碼結構有一些不同,所以DBPE2.33的脫殼機不能吧DBPE2.32的殼脫掉可能就是因為這個!

脫這個殼給我最大激勵的是"飛速"的一句話:""真是又氣(我會還用問嗎?),最後又感激,感謝他!

以下我是以DBPE2.33為例子脫殼!DBPE2.32基本一樣!

由於太多繁復指令了,所以我不複製太多程式碼,讀者自己理會吧.

用OD載入"測試-DBPE2.33.exe"後,要一步一步跟下來,(等以後熟悉了可以直接用記憶體斷點,可以快1個小時有多)

一開始的位址時4XXXXX-5XXXXX位址,當你來到7XXXXXXX位址的時候就真正開始打仗了!

小心的躲過一下地方:
Error (0): Load Dialog Error,Abort!.
//容易
Error (1): Load Dll Error,Abort!.
//容易
Error (2): Debugger detection,Abort! .
//要多多注意
Error (3): Debugger detection,Abort! .
//黑名單,容易
Error (4): File CRC Error,Abort!
//你看就知道是什麼,所以別亂改就不會有問題的了!

躲過上面黑名單後就開始解碼了!
黑名單要注意下面這個跳轉,不能跳,一跳就死!
83F8 FF CMP EAX,-1
0F85 DA000000 JNZ 7FF7E5D9

躲過黑名單後就是CRC效驗了!
//你沒有改什麼的話是不會有問題的!

解碼程序基本是:
...//這裡一個大循環"解密器"
7FF7EA9E 833E 00 CMP DWORD PTR [ESI],0
//是否有解密表
7FF7EAB8 /0F84 2A070000 JE 7FF7F1E8
//有表就不跳
7FF7EAC3 8B9D 32CC4200 MOV EBX,[EBP+42CC32] ; 測試-DBP.00400000
7FF7EACE 031E ADD EBX,[ESI]
7FF7EAD5 8B4E 04 MOV ECX,[ESI+4]
7FF7EAF4 83F9 00 CMP ECX,0
//是否有要解密的大小
7FF7EAF7 75 14 JNZ SHORT 7FF7EB0D
//有就跳走
7FF7EB56 D1E9 SHR ECX,1
7FF7EB85 66:8B85 83CE4200 MOV AX,[EBP+42CE83]
7FF7EBBA 66:C1C8 07 ROR AX,7
7FF7EBC3 66:05 1A00 ADD AX,1A
7FF7EBCC 66:35 9242 XOR AX,4292

...//小解密器
7FF7EBE4 66:3103 XOR [EBX],AX
7FF7EBEC 66:48 DEC AX
7FF7EC1B 43 INC EBX ; 測試-DBP.00401001
7FF7EC33 43 INC EBX ; 測試-DBP.00401002
7FF7EC39 49 DEC ECX
7FF7EC51 83F9 00 CMP ECX,0
//解密大小是否以解完
7FF7EC54 ^ 75 89 JNZ SHORT 7FF7EBDF
//沒有就跳回去繼續解密
...\\循環解密

7FF7ECBA 8B46 0C MOV EAX,[ESI+C]
7FF7ECC2 83E0 01 AND EAX,1
7FF7ECF7 80BD 961C4300 01 CMP BYTE PTR [EBP+431C96],1
7FF7ECFE 0F85 A9030000 JNZ 7FF7F0AD
7FF7ED09 83F8 01 CMP EAX,1
7FF7ED0C 0F85 96030000 JNZ 7FF7F0A8
7FF7EDED 60 PUSHAD
7FF7EE0A 8B46 04 MOV EAX,[ESI+4]
7FF7EE12 83F8 00 CMP EAX,0
7FF7EE42 /0F84 50020000 JE 7FF7F098
7FF7EE52 8B46 08 MOV EAX,[ESI+8]
7FF7EE82 05 00100000 ADD EAX,1000
7FF7EEB9 6A 04 PUSH 4
7FF7EEBB 68 00100000 PUSH 1000
7FF7EEC0 50 PUSH EAX
7FF7EEC1 6A 00 PUSH 0
7FF7EEC3 FF95 3FC64200 CALL [EBP+42C63F] ; kernel32.VirtualAlloc
7FF7EEFB 8985 36CC4200 MOV [EBP+42CC36],EAX
7FF7EF0B 56 PUSH ESI
7FF7EF3E 8B1E MOV EBX,[ESI]
7FF7EF45 039D 32CC4200 ADD EBX,[EBP+42CC32] ; 測試-DBP.00400000
7FF7EF50 50 PUSH EAX
7FF7EF51 53 PUSH EBX ; 測試-DBP.00403000
7FF7EF52 E8 1E690000 CALL 7FF85875
//這裡面才是真正的加密器,解密器把解密出來的資料放再3A0000位址段!
7FF7EF5C 83C4 08 ADD ESP,8
7FF7EF91 8BC8 MOV ECX,EAX
7FF7EFAA 8B3E MOV EDI,[ESI]
7FF7EFC3 03BD 32CC4200 ADD EDI,[EBP+42CC32] ; 測試-DBP.00400000
7FF7EFF6 8BB5 36CC4200 MOV ESI,[EBP+42CC36]
7FF7F001 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR >
//這裡是轉換資料,把[ESI]的資料轉換到[EDI]裡面!

7FF7F00D 5E POP ESI ; 7FF86421
7FF7F052 8B85 36CC4200 MOV EAX,[EBP+42CC36]
7FF7F085 68 00800000 PUSH 8000
7FF7F08A 6A 00 PUSH 0
7FF7F08C 50 PUSH EAX
7FF7F08D FF95 43C64200 CALL [EBP+42C643] ; kernel32.VirtualFree
//擦屁股,把3A0000位址段的資料一洗全空!

7FF7F09D 61 POPAD
7FF7F0CE 60 PUSHAD
7FF7F0D4 8B9D 32CC4200 MOV EBX,[EBP+42CC32] ; 測試-DBP.00400000
7FF7F0DF 031E ADD EBX,[ESI]
7FF7F10E 8B4E 04 MOV ECX,[ESI+4]
7FF7F155 B8 02794200 MOV EAX,427902
7FF7F15F 03C5 ADD EAX,EBP
7FF7F166 50 PUSH EAX
7FF7F167 6A 04 PUSH 4
7FF7F169 51 PUSH ECX
7FF7F16A 53 PUSH EBX ; 測試-DBP.00401000
7FF7F16B FF95 53C64200 CALL [EBP+42C653] ; kernel32.VirtualProtect
7FF7F176 61 POPAD
7FF7F1A9 83C6 10 ADD ESI,10
7FF7F1D9 ^\E9 BBF8FFFF JMP 7FF7EA99
//跳回去大循環!
...\\循環解密

上面的就是解密塊的解密器!

現在就差匯入表了!跟下去!
當你來到下面位址,這裡一大段就是解密匯入表的,一定要思考,怎麼才能不讓破壞,怎麼樣才能全部還原
其中一共有三個匯入表加密器:要想要一份完整的匯入表資料而且又不給破壞的就只有打修正檔了!

關於這個修正檔我想了10天才想到的!

7FF806D1 8985 ABC34200 MOV [EBP+42C3AB],EAX ; MFC42.#1340
7FF8071B 33C0 XOR EAX,EAX
7FF8074A 8703 XCHG [EBX],EAX
//EBX就是匯入表的位址!
//要想得到一個完整的匯入表的好辦法就是把這個指令改成"MOV EAX,[EBX]"
//這樣就不會給破壞了!其實這個死多餘的,有下面一條指令就夠了!

7FF80751 53 PUSH EBX
7FF8077F 51 PUSH ECX ; kernel32.77E5D93E
7FF80797 52 PUSH EDX
7FF80798 33D2 XOR EDX,EDX
7FF8079F B9 20000000 MOV ECX,20
7FF807A4 33DB XOR EBX,EBX
7FF807AB D1F8 SAR EAX,1
7FF807B2 0F92C3 SETB BL
7FF807BA D3E3 SHL EBX,CL
7FF807C1 03D3 ADD EDX,EBX
7FF807C3 ^ E2 DF LOOPD SHORT 7FF807A4
//循環解密
7FF807DC 8BC2 MOV EAX,EDX
//注意這裡!EDX是解密後的重要資料!
7FF807F5 5A POP EDX ; 00140608
7FF807FB 59 POP ECX ; 00140608
7FF80801 5B POP EBX ; 00140608
//注意這裡!
//這裡就使EBX=匯入表位址!
//修正檔就打在這裡!
//在這個位址後面加上一個指令"MOV [EBX],EAX"
//你明白這個是什麼意思嗎?結合上面的一起想想!
//那麼我們的第一個修正檔就大好了,下面還有兩個,請用相同道理就可以了!

7FF8082F 8BF0 MOV ESI,EAX

解密匯入表的修正檔大好後就得到了一份完整,沒有給破壞的匯入表,但是,下面還一個加密器(煩...)
我知道這樣跟蹤很麻煩,但我也不想的啊,是D BOY把我們的生活弄得複雜的
...............
..............
............

匯入表加密器:
7FF8098E 8B06 MOV EAX,[ESI]
7FF809BD 83F8 00 CMP EAX,0
7FF809C0 75 3F JNZ SHORT 7FF80A01
7FF80A0B 807E 03 80 CMP BYTE PTR [ESI+3],80
7FF80A0F 75 69 JNZ SHORT 7FF80A7A
7FF80A16 33C0 XOR EAX,EAX
7FF80A2F 66:8706 XCHG [ESI],AX
//注意這裡!當你自己跟蹤的時候就會發現他是幹什麼的!
//這裡就是要再打修正檔的地方,要怎麼打個保護資料不受破壞的修正檔呢?
//這裡就是作業了,自己想辦法,要是這裡不會改的話就表示你從來沒有真正跟蹤過一個殼

7FF80A5F 50 PUSH EAX
7FF80A60 FFB5 ABC34200 PUSH DWORD PTR [EBP+42C3AB] ; MFC42.#1340
7FF80A66 FF95 1E6F4300 CALL [EBP+436F1E] ; kernel32.GetProcAddress
7FF80A71 8BC8 MOV ECX,EAX
7FF80A78 EB 72 JMP SHORT 7FF80AEC
------------------------------------
7FF80A7F 33C0 XOR EAX,EAX
7FF80A98 8706 XCHG [ESI],EAX ; MFC42.#2554
//這裡和上面一樣,你就自己改改吧!
//就當是作業了!要是你這個都不會改就不要學脫殼了!

7FF80A9F 0385 32CC4200 ADD EAX,[EBP+42CC32] ; 測試-DBP.00400000
7FF80AAA 83C0 02 ADD EAX,2
7FF80AB2 50 PUSH EAX ; MFC42.#2554
7FF80AB3 FFB5 ABC34200 PUSH DWORD PTR [EBP+42C3AB] ; MFC42.#1340
7FF80AB9 FF95 1E6F4300 CALL [EBP+436F1E] ; kernel32.GetProcAddress
............
...........
.........
經過這裡以後就再慢慢跟一下就來到

7FF7F5A6 8B1B MOV EBX,[EBX] ; MSVCRT.fread
7FF7F5D5 891E MOV [ESI],EBX ; MSVCRT.fread
7FF7F5DC 8937 MOV [EDI],ESI
//這個地方,這裡是對游標位址加密的,所以也要打個修正檔
//我是學yahoo007的方法
//把 MOV EBX,[EBX] 給NOP掉!
//再把 MOV [EDI],ESI 改成 MOV [EDI],EBX

//這樣就沒有破壞我要的東西了!

7FF7F856 8B1B MOV EBX,[EBX] ; MFC42.#4673
7FF7F885 891E MOV [ESI],EBX
7FF7F89E 8937 MOV [EDI],ESI
//這裡是第二處,改法一樣!

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


最後來到這裡!
7FF7FDF9 5B POP EBX ; 7FFDF000
7FF7FDFA 59 POP ECX ; 7FFDF000
7FF7FDFB 5A POP EDX ; 7FFDF000
7FF7FDFC 5E POP ESI ; 7FFDF000
7FF7FDFD 5F POP EDI ; 7FFDF000
7FF7FDFE 5D POP EBP ; 7FFDF000
7FF7FE16 9D POPFD
7FF7FE21 FFB0 91CE4200 PUSH DWORD PTR [EAX+42CE91]
7FF7FE3E C780 91CE4200 00000000 MOV DWORD PTR [EAX+42CE91],0
7FF7FE4D E9 2D6D0000 JMP 7FF86B7F
7FF86B84 56 PUSH ESI
7FF86B8A 51 PUSH ECX
7FF86BA2 BE 19684000 MOV ESI,406819 ; ASCII "_p__fmode"
7FF86BAC 03F0 ADD ESI,EAX
7FF86BDB B9 7F6B0200 MOV ECX,26B7F
7FF86C51 C606 00 MOV BYTE PTR [ESI],0
7FF86C59 46 INC ESI
7FF86C87 49 DEC ECX
7FF86C8D 83F9 00 CMP ECX,0
7FF86C90 ^ 75 A8 JNZ SHORT 7FF86C3A
//一個小小小循環(擦屁股)比我去廁所擦得乾淨多了!

7FF86CD6 59 POP ECX ; 00405230
7FF86CDC 5E POP ESI ; 00405230
7FF86D0A /E9 A23D0000 JMP 7FF8AAB1

7FF8AAB1 60 PUSHAD
7FF8AAB2 8BF0 MOV ESI,EAX
7FF8AAB4 B8 A2474300 MOV EAX,4347A2
7FF8AAB9 03C6 ADD EAX,ESI
7FF8AABB BB EE664300 MOV EBX,4366EE
7FF8AAC0 03DE ADD EBX,ESI
7FF8AAC2 803B 00 CMP BYTE PTR [EBX],0
7FF8AAC5 74 0C JE SHORT 7FF8AAD3
7FF8AAC7 6A 00 PUSH 0
7FF8AAC9 50 PUSH EAX
7FF8AACA 53 PUSH EBX
7FF8AACB 6A 00 PUSH 0
7FF8AACD FF96 EA664300 CALL [ESI+4366EA]
7FF8AAD3 61 POPAD
7FF8AAD4 58 POP EAX ; 00405230
7FF8AAD5 83F8 FF CMP EAX,-1
7FF8AAD8 75 05 JNZ SHORT 7FF8AADF
7FF8AADA 33C0 XOR EAX,EAX
7FF8AADC C2 0C00 RETN 0C
7FF8AADF - FFE0 JMP EAX
//飛向OEP

------------------------------------------------------------------
【總 結】:

最後再OEP處用LordPE把記憶體鏡像給Dump出後,接著再用LordPE把OEP和匯入表位址改好儲存,最後用LordPE重建,這樣就脫好了!

黑名單沒有什麼可怕的,而且他的禁品不多,不過DBPE這個殼會在%SystemRoot%\System32目錄下產生一個cdcd.sys文件,這個文件就是存放3A0000資料的地方(偶懷疑)

以上就是我15天失眠的成績,希望你可以學會!我也不打算多說了!希望所有的朋友可以把自己的技術共享出來給我們新人學習,我為了脫這個殼問了那麼多高人都沒有一個告訴我要怎麼做!(心寒...)

輝仔Yock
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:32 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1