第十四課 壓縮與脫殼

第一節 壓縮工具介紹
第二節 認識脫殼
第三節 PROCDUMP使用
第四節 手動脫殼

Icedump使用介紹
手動脫殼基本知識
手動脫殼的基本技巧
其它手動脫殼實例

Shrinker v3.4加殼軟體的手動脫殼

英文原作: Etenal Bliss
電子郵件: Eternal_Bliss@hotmail.com
作者網址: http://crackmes.cjb.net
          http://surf.to/crackmes
寫作日期: 2000年2月25日
中文翻譯: 冰毒
翻譯日期: 2000年3月14日

目標程式: 用Shrinker v3.4壓縮過的Notepad.exe

******************************************************************
冰毒注:
1. Notepad.exe就是Windows自帶的寫字板程式,相信大家的機器中都會有.
2. Shrinker v3.4可以在http://w3.to/protools下載,這裡您可以找到您
想要的幾乎所有的工具.
******************************************************************

使用工具:
ProcDump
Softice
Symbol Loader (冰毒注:這個是Softice自帶的,用過Softice的應該知道)

破解方法:
手動脫殼

教學目的:
教您手動脫殼的基本技術
__________________________________________________________________________

                        關於這個教學

這是我打算寫的*簡單*的脫殼系列教學的第一篇. 目標程式是notepad.exe,在大多數
的電腦中都有它. 因為我還不能很好地解釋脫殼中的一些問題,我只能盡我所能向您們
展示簡單的方法. 至於高級的方法,您們必須去讀別的教學.
_________________________________________________________________________
 

        使Softice中斷於程式入口處

用Symbol Loader開啟已壓縮的notepad.exe.

點擊Symbol loader任務條上的第二個圖示,當您把滑鼠移到圖示上時,在Symbol Loader
視窗底部提示行您會見到"Load the currently open module"的字樣

您將得到一條出錯訊息並問您是否盡管出錯還是要裝入這個exe文件. 點擊"Yes".

假如Softice已經執行的話, 它應該在程式的入口處中斷.可是它並沒有中斷,壓縮過的
notepad.exe直接就執行了.

該到改變characteristics of the sections的時間了...
通過改變characteristics, 您可以使Softice中斷於程式入口.

用ProcDump裝入壓縮過的notepad.exe (使用PE Editor)
您會看到這個以"PE Structure Editor"作為標題的視窗.
點擊稱作"Sections"的按鈕.

您將得到另一個以"Sections Editor"做標題的視窗.
您會見到壓縮過的notepad.exe的不同sections.

第一個是 .shrink0 它的characteristics是C0000082.
改變characteristics: 滑鼠左鍵點擊.shrink0再點擊右鍵並選擇edit section.

您將得到另一個視窗,它用'Modify section value" 作標題.
把Section Characteristics由C0000082改為E0000020.
一路按OK直到您回到ProcDump的主視窗.
您現在可以把ProcDump放在一邊了.

**我愿意多作解釋為什麼必須這樣做,但我沒這個能力. 8P
  您也許要讀些PE結搆的資料來找到原因.
  別人教我說, E0000020將使section成為可執行的,因此Softice將會中斷於入口處

找到程式真正入口並進行脫殼

現在, 希望您沒有關閉symbol loader. 假如您關掉的話,重新執行它,開啟並裝入已
壓縮的notepad.exe

當您這次點擊"Yes"時, 您會發現您已在進入Softice中了...
我把下面的代碼貼出來並加上注解.

************************* 您在SICE中所見到的 *************************

**Softice中斷時,您會在這儿. 一直按F10走過這部分代碼

0041454F  FFFF                INVALID
00414556  55                  PUSH      EBP
00414557  8BEC                MOV      EBP,ESP
00414559  56                  PUSH      ESI
0041455A  57                  PUSH      EDI
0041455B  756B                JNZ      004145C8                (NO JUMP)
0041455D  6800010000          PUSH      00000100
00414562  E8D60B0000          CALL      0041513D
00414567  83C404              ADD      ESP,04
0041456A  8B7508              MOV      ESI,[EBP+08]
0041456D  A3B4F14000          MOV      [0040F1B4],EAX
00414572  85F6                TEST      ESI,ESI
00414574  7423                JZ        00414599                (JUMP)
00414599  33FF                XOR      EDI,EDI
0041459B  57                  PUSH      EDI
0041459C  893D8C184100        MOV      [0041188C],EDI
004145A2  FF1510224100        CALL      [KERNEL32!GetModuleHandleA]
004145A8  8BF0                MOV      ESI,EAX
004145AA  68FF000000          PUSH      000000FF
004145AF  A1B4F14000          MOV      EAX,[0040F1B4]
004145B4  897D10              MOV      [EBP+10],EDI
004145B7  C7450C01000000      MOV      DWORD PTR [EBP+0C],00000001
004145BE  50                  PUSH      EAX
004145BF  56                  PUSH      ESI
004145C0  FF15F4214100        CALL      [KERNEL32!GetModuleFileNameA]
004145C6  EB03                JMP      004145CB                (JUMP)
004145CB  E830EAFFFF          CALL      00413000
004145D0  FF7510              PUSH      DWORD PTR [EBP+10]
004145D3  FF750C              PUSH      DWORD PTR [EBP+0C]
004145D6  56                  PUSH      ESI
004145D7  E806000000          CALL      004145E2

**當您走過這個位於004145D7的CALL, 壓縮過的notepad.exe就自由執行了. 再次用
  symbol loader裝入. 再次來到這個CALL時, 按F8追進去. 您將看到以下代碼. 不
  過記著先BPX 004145D7.

004145E2  64A100000000        MOV      EAX,FS:[00000000]
004145E8  55                  PUSH      EBP
004145E9  8BEC                MOV      EBP,ESP
004145EB  6AFF                PUSH      FF
004145ED  6810E04000          PUSH      0040E010
004145F2  68EC5D4100          PUSH      00415DEC
004145F7  50                  PUSH      EAX
004145F8  64892500000000      MOV      FS:[00000000],ESP
004145FF  83EC14              SUB      ESP,14
00414602  C745E401000000      MOV      DWORD PTR [EBP-1C],00000001
00414609  53                  PUSH      EBX
0041460A  56                  PUSH      ESI
0041460B  57                  PUSH      EDI
0041460C  8965E8              MOV      [EBP-18],ESP
0041460F  C745FC00000000      MOV      DWORD PTR [EBP-04],00000000
00414616  8B450C              MOV      EAX,[EBP+0C]
00414619  83F801              CMP      EAX,01
0041461C  7510                JNZ      0041462E                (NO JUMP)
0041461E  E886030000          CALL      004149A9
00414623  FF05C0F14000        INC      DWORD PTR [0040F1C0]
00414629  E882F6FFFF          CALL      00413CB0
0041462E  8B35C0F14000        MOV      ESI,[0040F1C0]
00414634  85F6                TEST      ESI,ESI
00414636  0F848D000000        JZ        004146C9                (NO JUMP)
0041463C  833DC4F1400000      CMP      DWORD PTR [0040F1C4],00
00414643  7526                JNZ      0041466B                (NO JUMP)
00414645  833D6417410000      CMP      DWORD PTR [00411764],00
0041464C  741D                JZ        0041466B                (NO JUMP)
0041464E  A164174100          MOV      EAX,[00411764]

**EAX現在的值是000010CC

00414653  030588184100        ADD      EAX,[00411888]

**EAX現在的值是004010CC

00414659  8945DC              MOV      [EBP-24],EAX

**[EBP-24]現在含的是004010CC

0041465C  FF7510              PUSH      DWORD PTR [EBP+10]
0041465F  FF750C              PUSH      DWORD PTR [EBP+0C]
00414662  FF7508              PUSH      DWORD PTR [EBP+08]
00414665  FF55DC              CALL      [EBP-24]

**假如您追過最後這個CALL,notepad.exe將再次自由執行.
  由上得知, 既然[EBP-24] = 004010CC, 最後這句代碼就意味著壓縮過的程式在
  CALL 004010CC. 如果您追進這個CALL, 您會發現notepad.exe很快就會執行了.

假如您曾經追過更多shrinker v3.4壓縮的程式, 您總會見到這個"CALL [EBP-24]".
所以, 程式實際上正在進入已脫殼的程式的真正入口.

再次裝入壓縮過的notepad.exe,中斷之後,按F5,您將中斷於004145D7行(這裡您原來
設過斷點). 追進去直到您到達00414665行,這裡程式正要進入已脫殼程式的真正入口.

現在,輸入以下命令:
a eip (然後按Enter)
jmp eip (然後按Enter)
按下F5

這樣將改變00414665行的代碼. 您會注意到在輸入"jmp eip"並按下Enter後,00414665的
指令現在是一個jmp.這將有效地使程式"暫停". 按下F5使您回到window,您就可以dump
已經脫殼的程式到您的硬碟了.

現在又要用ProcDump了,在Task的清單中的第一個list上點擊滑鼠右鍵,然後選擇"Refresh
list". 在Task清單中找到notepad.exe,在它的上面點擊滑鼠右鍵.
然後,選中"Dump (Full)",給脫殼的程式起名儲存.
再在notepad.exe上點擊滑鼠右鍵,然後選中"Kill Task".

_________________________________________________________________________

            改動程式入口值

如果您記得的話, 脫殼的notepad.exe程式入口是004010CC.
再次使用ProcDump的PE Editor功能, 開啟已脫殼的notepad.exe.

在"Header Infos"一項, 您會看見程式入口值是0001454F,這當然是錯誤的. 如果您試著
不改動這個入口值而執行脫殼後的notepad.exe,程式將無法執行.

改變入口值為004010CC,點擊"OK".

現在, 執行脫殼後的notepad.exe您,它應該正常執行了. 8)

__________________________________________________________________________
 

                            最後的說明

這篇教學是為所有和我一樣的newbies而作.

我感謝和感激:

MiZ. 從他那裡我學會了脫殼的基本技巧.

所有破解教學和CrackMe的作者,以及所有一直支持我的網站和論壇的Cracker們.
 
 



回教學