史萊姆論壇

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

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

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

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

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-04-02, 09:52 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 金幣
預設 手動脫殼入門掃盲第一篇

【脫文作者】 weiyi75[Dfcg]

【作者信箱】 weiyi75@sohu.com

【作者主頁】 Dfcg官方大本營

【使用工具】 Ollydbg1.10b,ImportREC1.6F

【破解平台】 Win2000/XP

前言,作者寫這篇文章只是舉個例子,希望讀者能夠舉一反三,看清思路.

本論壇中破解高手很多,不會手動脫殼者人數仍然不少。有人會說,我有Unaspack,Caspr,ProcDump等眾多脫殼工具,不會手動脫殼用工具脫就可以了。但有部分殼如Asprotect1.23Rc4,本論壇高手仙劍(將自己有保護殼偽裝成C++),有漏洞,用Peid查殼,Ep區段寫有Xj,用Od載入提示有殼,更有甚一些軟體如大嘴日語加了四層殼,這些都是工具無法脫殼的。隨著有保護殼的不斷出現,基本殼都不會,高版本的有保護殼以後脫殼盲根本無從入手。所以,手動脫殼Crack必修。

手動脫殼的主要步驟是:尋找入口點,轉儲(dump)程序,修復引入函數表(Import Table)

現在的殼分壓縮殼,和有保護殼。壓縮殼目的是使檔案大小變小,便於在網上傳播。並有一定的保護作用,你無法反彙編加殼程序。有保護殼目的是用各種手段保護軟體不被脫殼,跟蹤,檔案大小不是它的目的,有的甚至變大。

判斷有保護殼壓縮殼和普通程序分別很容易,用Ollydbg載入程序。

沒加殼軟體無任何提示。

有保護殼有些Od載入時會提示壓縮,基本上F9執行後,OD提示程序異常。

普通加殼Od載入時一般都會發現,提示軟體被加殼,是否繼續分析。

還有些是脫殼沒有脫乾淨,Od載入時也提示加殼。

更猛的殼用Od載入就異常,如Acprotect。

關於殼的知識不是一兩篇文章就能說清,要經過大量的各種殼的脫殼經驗,參考文章。

好,我們先從一個基本的Upx殼入手。

本地下載

首先必須的工具要準備好,

查殼工具

Peid0.91,Fileinfo,Language2000,File Scanner等。

查入口工具。

Peid0.91首推,衝擊波(9X)系統專用,Asloader,自己的感覺,程序跨段跳躍點。

脫殼工具。

Ollydbg首選,LoadPe,PEditor,ProcDump等,夠用了。

修復引入函數表(Import Table)工具。

Imprec,File Scanner,PEditor,LoadPe,ProcDump,Revirgin等,夠用了。

以上的工具都有當然最好,至少得有。

Peid0.91,Fileinfo,PEditor,LoadPe,Imprec,Asloader。

工具準備好,開始小試驗牛刀。

附件中殼為Fi測殼為Upx1.01,Peid這裡測不出Upx的壓縮版本。

手動脫殼建議大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推薦。

手動脫殼時,用Olldbg載入程序,脫殼程序裡面會有有好多循環。對付循環時,只能讓程序往前執行,基本不能讓它往回跳,要想法跳出循環圈。不要用Peid查入口,單步跟蹤,提高手動找入口能力。

用OD載入程序後。

Od提示程序加殼,選不繼續分析。

0046AC00 > 60 PUSHAD 停在這裡,我們先記住UPX殼的加殼入口第一句是PUSHAD
出口暫時不清楚,為的是今後碰到多層殼有準備。
0046AC01 BE 00104400 MOV ESI,ex1.00441000
0046AC06 8DBE 0000FCFF LEA EDI,DWORD PTR DS:[ESI+FFFC0000]
0046AC0C C787 D0940500 D>MOV DWORD PTR DS:[EDI+594D0],10A125D8
0046AC16 57 PUSH EDI
0046AC17 83CD FF OR EBP,FFFFFFFF
0046AC1A EB 0E JMP SHORT ex1.0046AC2A 跳走
0046AC1C 90 NOP
0046AC1D 90 NOP
0046AC1E 90 NOP
0046AC1F 90 NOP
0046AC20 8A06 MOV AL,BYTE PTR DS:[ESI]
0046AC22 46 INC ESI
0046AC23 8807 MOV BYTE PTR DS:[EDI],AL
0046AC25 47 INC EDI
0046AC26 01DB ADD EBX,EBX
0046AC28 75 07 JNZ SHORT ex1.0046AC31
0046AC2A 8B1E MOV EBX,DWORD PTR DS:[ESI] 到這裡。
0046AC2C 83EE FC SUB ESI,-4
0046AC2F 11DB ADC EBX,EBX
0046AC31 ^ 72 ED JB SHORT ex1.0046AC20 這裡注意,往回跳。脫殼時記住只能讓程序往前執行
0046AC33 B8 01000000 MOV EAX,1 在這裡點一下,F4執行到這句繼續。
0046AC38 01DB ADD EBX,EBX
0046AC3A 75 07 JNZ SHORT ex1.0046AC43 跳
0046AC3C 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC3E 83EE FC SUB ESI,-4
0046AC41 11DB ADC EBX,EBX
0046AC43 11C0 ADC EAX,EAX
0046AC45 01DB ADD EBX,EBX
0046AC47 ^ 73 EF JNB SHORT ex1.0046AC38
0046AC49 75 09 JNZ SHORT ex1.0046AC54 跳
0046AC4B 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC4D 83EE FC SUB ESI,-4
0046AC50 11DB ADC EBX,EBX
0046AC52 ^ 73 E4 JNB SHORT ex1.0046AC38
0046AC54 31C9 XOR ECX,ECX
0046AC56 83E8 03 SUB EAX,3
0046AC59 72 0D JB SHORT ex1.0046AC68 跳
0046AC5B C1E0 08 SHL EAX,8
0046AC5E 8A06 MOV AL,BYTE PTR DS:[ESI]
0046AC60 46 INC ESI
0046AC61 83F0 FF XOR EAX,FFFFFFFF
0046AC64 74 74 JE SHORT ex1.0046ACDA
0046AC66 89C5 MOV EBP,EAX
0046AC68 01DB ADD EBX,EBX
0046AC6A 75 07 JNZ SHORT ex1.0046AC73 跳
0046AC6C 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC6E 83EE FC SUB ESI,-4
0046AC71 11DB ADC EBX,EBX
0046AC73 11C9 ADC ECX,ECX
0046AC75 01DB ADD EBX,EBX
0046AC77 75 07 JNZ SHORT ex1.0046AC80 跳
0046AC79 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC7B 83EE FC SUB ESI,-4
0046AC7E 11DB ADC EBX,EBX
0046AC80 11C9 ADC ECX,ECX
0046AC82 75 20 JNZ SHORT ex1.0046ACA4 跳
0046AC84 41 INC ECX
0046AC85 01DB ADD EBX,EBX
0046AC87 75 07 JNZ SHORT ex1.0046AC90
0046AC89 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC8B 83EE FC SUB ESI,-4
0046AC8E 11DB ADC EBX,EBX
0046AC90 11C9 ADC ECX,ECX
0046AC92 01DB ADD EBX,EBX
0046AC94 ^ 73 EF JNB SHORT ex1.0046AC85
0046AC96 75 09 JNZ SHORT ex1.0046ACA1
0046AC98 8B1E MOV EBX,DWORD PTR DS:[ESI]
0046AC9A 83EE FC SUB ESI,-4
0046AC9D 11DB ADC EBX,EBX
0046AC9F ^ 73 E4 JNB SHORT ex1.0046AC85
0046ACA1 83C1 02 ADD ECX,2
0046ACA4 81FD 00F3FFFF CMP EBP,-0D00
0046ACAA 83D1 01 ADC ECX,1
0046ACAD 8D142F LEA EDX,DWORD PTR DS:[EDI+EBP]
0046ACB0 83FD FC CMP EBP,-4
0046ACB3 76 0F JBE SHORT ex1.0046ACC4 這一句可以跳出這個循環。
0046ACB5 8A02 MOV AL,BYTE PTR DS:[EDX]
0046ACB7 42 INC EDX
0046ACB8 8807 MOV BYTE PTR DS:[EDI],AL
0046ACBA 47 INC EDI
0046ACBB 49 DEC ECX
0046ACBC ^ 75 F7 JNZ SHORT ex1.0046ACB5 注意,往回跳。
0046ACBE ^ E9 63FFFFFF JMP ex1.0046AC26 這裡也往回跳。
0046ACC3 90 NOP
0046ACC4 8B02 MOV EAX,DWORD PTR DS:[EDX] 呵,在這裡點一下,F4到這裡。
0046ACC6 83C2 04 ADD EDX,4
0046ACC9 8907 MOV DWORD PTR DS:[EDI],EAX
0046ACCB 83C7 04 ADD EDI,4
0046ACCE 83E9 04 SUB ECX,4
0046ACD1 ^ 77 F1 JA SHORT ex1.0046ACC4 往回跳。
0046ACD3 01CF ADD EDI,ECX
0046ACD5 ^ E9 4CFFFFFF JMP ex1.0046AC26 這裡也往回跳
0046ACDA 5E POP ESI 呵,在這裡點一下,F4到這裡。
0046ACDB 89F7 MOV EDI,ESI
0046ACDD B9 C8230000 MOV ECX,23C8
0046ACE2 8A07 MOV AL,BYTE PTR DS:[EDI]
0046ACE4 47 INC EDI
0046ACE5 2C E8 SUB AL,0E8
0046ACE7 3C 01 CMP AL,1
0046ACE9 ^ 77 F7 JA SHORT ex1.0046ACE2 往回跳。
0046ACEB 803F 0D CMP BYTE PTR DS:[EDI],0D在這裡點一下,F4到這裡。
0046ACEE ^ 75 F2 JNZ SHORT ex1.0046ACE2
0046ACF0 8B07 MOV EAX,DWORD PTR DS:[EDI]
0046ACF2 8A5F 04 MOV BL,BYTE PTR DS:[EDI+4]
0046ACF5 66:C1E8 08 SHR AX,8
0046ACF9 C1C0 10 ROL EAX,10
0046ACFC 86C4 XCHG AH,AL
0046ACFE 29F8 SUB EAX,EDI
0046AD00 80EB E8 SUB BL,0E8
0046AD03 01F0 ADD EAX,ESI
0046AD05 8907 MOV DWORD PTR DS:[EDI],EAX
0046AD07 83C7 05 ADD EDI,5
0046AD0A 89D8 MOV EAX,EBX
0046AD0C ^ E2 D9 LOOPD SHORT ex1.0046ACE7 這是個循環,往回跳。
0046AD0E 8DBE 00700600 LEA EDI,DWORD PTR DS:[ESI+67000]在這裡點一下,F4到這裡。
0046AD14 8B07 MOV EAX,DWORD PTR DS:[EDI]
0046AD16 09C0 OR EAX,EAX
0046AD18 74 3C JE SHORT ex1.0046AD56
0046AD1A 8B5F 04 MOV EBX,DWORD PTR DS:[EDI+4]
0046AD1D 8D8430 BCA90600 LEA EAX,DWORD PTR DS:[EAX+ESI+6A9BC]
0046AD24 01F3 ADD EBX,ESI
0046AD26 50 PUSH EAX
0046AD27 83C7 08 ADD EDI,8
0046AD2A FF96 5CAA0600 CALL DWORD PTR DS:[ESI+6AA5C]

到這裡我們看到訊息框中寫有

0046AD2A FF96 5CAA0>call dword ptr ds:[esi+6AA5C] KERNEL32.LoadLibraryA

如果我們直接下斷點Bp LoadLibraryA,F9執行程序,Ctrl+F9返回到這句不就省很多事,這裡大家以後會明白的,脫大量的殼後,我們先有一個概念。

0046AD30 95 XCHG EAX,EBP
0046AD31 8A07 MOV AL,BYTE PTR DS:[EDI]
0046AD33 47 INC EDI
0046AD34 08C0 OR AL,AL
0046AD36 ^ 74 DC JE SHORT ex1.0046AD14
0046AD38 89F9 MOV ECX,EDI
0046AD3A 57 PUSH EDI
0046AD3B 48 DEC EAX
0046AD3C F2:AE REPNE SCAS BYTE PTR ES:[EDI]
0046AD3E 55 PUSH EBP
0046AD3F FF96 60AA0600 CALL DWORD PTR DS:[ESI+6AA60]

到這裡我們看到訊息框中寫有,GetProcAddress這裡也是好斷點啊。

0046AD3F FF96 60AA0>call dword ptr ds:[esi+6AA60] ; KERNEL32.GetProcAddress

0046AD45 09C0 OR EAX,EAX
0046AD47 74 07 JE SHORT ex1.0046AD50
0046AD49 8903 MOV DWORD PTR DS:[EBX],EAX
0046AD4B 83C3 04 ADD EBX,4
0046AD4E ^ EB E1 JMP SHORT ex1.0046AD31 往回跳。
0046AD50 FF96 64AA0600 CALL DWORD PTR DS:[ESI+6AA64]0046AD56 61 POPAD 關鍵點,入口就在附近。 和PUSHAD對應。在這裡點一下,F4到這裡。
0046AD57 ^ E9 98CBFEFF JMP ex1.004578F4 跳到入口。程序跨段跳躍。
0046AD5C ^ 74 AD JE SHORT ex1.0046AD0B
0046AD5E 46 INC ESI
.................................................

程序加殼段地址一直在0046XXXX突然跳轉到0045XXXX段,跨段跳躍時,一般都是在記憶體中脫殼完畢,準備執行程序,手動脫殼就是要在入口將程序Dump出來。轉到入口時一般都有Popad語句和開始的PUSHAD對應。
.................................................

004578F4 55 PUSH EBP 我們再這裡用Od的Dump插件直接脫殼。
004578F5 8BEC MOV EBP,ESP004578F7 83C4 F4 ADD ESP,-0C
004578FA B8 AC774500 MOV EAX,ex1.004577AC
004578FF E8 2CE6FAFF CALL ex1.00405F30
00457904 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
00457909 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045790B E8 78A1FEFF CALL ex1.00441A88
00457910 8B0D 10964500 MOV ECX,DWORD PTR DS:[459610] ; ex1.0045A820
00457916 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
0045791B 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045791D 8B15 24744500 MOV EDX,DWORD PTR DS:[457424] ; ex1.00457470
00457923 E8 78A1FEFF CALL ex1.00441AA0
00457928 A1 40954500 MOV EAX,DWORD PTR DS:[459540]
0045792D 8B00 MOV EAX,DWORD PTR DS:[EAX]
0045792F E8 ECA1FEFF CALL ex1.00441B20
00457934 E8 8BBEFAFF CALL ex1.004037C4
00457939 8D40 00 LEA EAX,DWORD PTR DS:[EAX]

總結:

Upx殼直接Ctrl+F找Popad,向下一個jmp跳到入口,

命令行下斷點 bp GetProcAddress

F9執行,Ctrl+F9返回到程序,向下到Popad處的jmp跳到入口.

在入口處Dump程序.


UPX脫殼斷點

bp LoadLibraryA

bp GetProcAddress

UPX加殼入口第一句是PUSHAD

出口關鍵字

POPAD

一般經過JMP跨段跳躍到入口處.

我們以後每手動脫一個殼就總結一次.

脫殼後發現程序不能執行,這時需要用Imprec修復引入函數表(Import Table)

在Oep處填000578F4,點IT自動搜索,然後點獲輸入訊息,看到輸入表全部有效,點修復抓取檔案按鈕,選擇Dump的檔案,修復它,正常執行,這裡不用備份,Imprec自動幫你做了.見抓圖.



期待這是引你初學者入脫殼大門的第一步.
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



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

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


所有時間均為台北時間。現在的時間是 01:28 PM


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


SEO by vBSEO 3.6.1