淺談DBPE2.33脫殼修復

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

標 題:淺談DBPE2.33脫殼修復

發信人:輝仔Yock

時 間:2003年12月26日 08:56

詳細資訊: 


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

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

我學脫殼有這樣的成績多謝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
2003.12.26

相關文章