史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 程式 & 網頁設計技術文件
忘記密碼?
論壇說明

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

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

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

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-12-11, 08:04 PM   #1 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 如何進行asprotect 1.2?的手工脫殼

這是很早寫的,可能對於asprotect 1.23不適用。
手工Asprotect 1.2?脫殼

0. 特徵
裝載程序,在GetProcAddress上設定斷點,中斷後,第一次看到程序進行Import的處理(但實際不是)。
處理完成後,會執行到以下程式碼:

00E6B5C1 61 POPAD
00E6B5C2 75 08 JNZ SHORT 00E6B5CC
00E6B5C4 B8 01000000 MOV EAX, 1
00E6B5C9 C2 0C00 RETN 0C
00E6B5CC 68 00000000 PUSH 0
00E6B5D1 C3 RETN

從這段程式碼返回後,到達如下程式碼:
00E64574 55 PUSH EBP ; ElAnyCal.005193E1
00E64575 8BEC MOV EBP, ESP
00E64577 83C4 B4 ADD ESP, -4C
00E6457A B8 5C44E600 MOV EAX, 0E6445C
00E6457F E8 940AFFFF CALL 00E55018 ; Next
00E64584 E8 87EDFEFF CALL 00E53310 ; Step進去
00E64589 8D40 00 LEA EAX, DWORD PTR [EAX]

看到上面有連續的兩個Call,第一個可以用Next走過,第二個用Step進去,裡面會有27個SEH,在不同的
SEH中會處理程式碼的解密,IAT的獲取和加密。執行程式碼,到每個SEH處理程序如下:
77FA0338 > 8B4C24 04 MOV ECX, DWORD PTR [ESP+4]
77FA033C 8B1C24 MOV EBX, DWORD PTR [ESP]
77FA033F 51 PUSH ECX
77FA0340 53 PUSH EBX
77FA0341 E8 4BF0FEFF CALL 77F8F391
77FA0346 0AC0 OR AL, AL
77FA0348 74 0C JE SHORT 77FA0356
77FA034A 5B POP EBX
77FA034B 59 POP ECX
77FA034C 6A 00 PUSH 0
77FA034E 51 PUSH ECX
77FA034F E8 1E25FEFF CALL ZwContinue ; 可設斷點
77FA0354 EB 0B JMP SHORT 77FA0361
77FA0356 5B POP EBX
77FA0357 59 POP ECX
77FA0358 6A 00 PUSH 0
77FA035A 51 PUSH ECX
77FA035B 53 PUSH EBX
77FA035C E8 F8F2FEFF CALL ZwRaiseException
77FA0361 83C4 EC ADD ESP, -14
77FA0364 890424 MOV DWORD PTR [ESP], EAX
77FA0367 C74424 04 01000>MOV DWORD PTR [ESP+4], 1
77FA036F 895C24 08 MOV DWORD PTR [ESP+8], EBX
77FA0373 C74424 10 00000>MOV DWORD PTR [ESP+10], 0
77FA037B 54 PUSH ESP
77FA037C E8 970B0100 CALL RtlRaiseException
77FA0381 C2 0800 RETN 8
這段程式碼將被執行27次。可以在Call ZwContinue一行上設定斷點,以便觀察。到最後一次,用Ollydbg可以
在CPU視窗中的暫存器視窗看到浮點暫存器ST7右邊變紅值為32.000000000000000000。在每次SEH處理的時候,
程序會把Dr0-Dr3清掉,所以設定硬中斷是沒有用的,只能設定軟中斷,除非用SuperBPM。

註:在程序執行到 77FA034F ZwContinue的時候,這時在Ring3狀態下不能進行繼續往下跟蹤,但是可以檢視
當前的堆棧,從當前的ESP往下數,第五個長整數(即[ESP+14H])就是產生例外的EIP,可以在該位址的後一
條指令下斷點。

1. OEP
使用loader.exe、Getoep搜尋EOP。對Delphi程序,可以Dump,找「runtime」,往回找「55 8B EC」即可。

2. 在OEP上設定斷點,並Dump
在NT下,由於無法使用SuperBPM,所以只能在最後一次SEH的時候,在OEP上設定軟中斷,程序能中斷。中斷
後,使用LordPe或者ProcDump匯出程序的映像。

3. IAT
如果不對Import進行處理,在第二步的時候用ImportREC重建IAT,程序有時可用,但總會出錯。因為Asprotect
對Import進行了另外的處理。不過可以手工進行調整一下。方法是,在第一次到達SEH的時候,設定GetProcAddress
的斷點(注意,需要在GetProcAddress的實際處理程式碼中,而不是開始的7各字元上,對其他的函數也有同樣
的問題,因為Asprotect是跳過這些程式碼的前序程式碼,直接跳轉到程式碼中間的)。等到被中斷後(大致在第20
個SEH上),可以看到以下程式碼:
00E624C3 50 PUSH EAX ; kernel32.GetCurrentThreadId
00E624C4 E8 47FCFFFF CALL 00E62110 ; 使用GetProcAddress
00E624C9 E8 7EFEFFFF CALL 00E6234C *** ; 對返回值進行加密處理
00E624CE 8B17 MOV EDX, DWORD PTR [EDI] ; ElAnyCal.004E117C
00E624D0 8902 MOV DWORD PTR [EDX], EAX ; kernel32.GetCurrentThreadId
00E624D2 EB 7E JMP SHORT 00E62552
00E624D4 83FB 01 CMP EBX, 1
00E624D7 74 05 JE SHORT 00E624DE
00E624D9 83FB 04 CMP EBX, 4
00E624DC 75 37 JNZ SHORT 00E62515
00E624DE 8A06 MOV AL, BYTE PTR [ESI]
00E624E0 8845 FF MOV BYTE PTR [EBP-1], AL
00E624E3 46 INC ESI
00E624E4 33C9 XOR ECX, ECX
00E624E6 8A4D FF MOV CL, BYTE PTR [EBP-1]
00E624E9 8D85 FFFEFFFF LEA EAX, DWORD PTR [EBP-101]
00E624EF 8BD6 MOV EDX, ESI
00E624F1 E8 DA2CFFFF CALL 00E551D0
00E624F6 6A 0A PUSH 0A
00E624F8 B9 446DE600 MOV ECX, 0E66D44
00E624FD 33D2 XOR EDX, EDX
00E624FF 8A55 FF MOV DL, BYTE PTR [EBP-1]
00E62502 8D85 FFFEFFFF LEA EAX, DWORD PTR [EBP-101]
00E62508 E8 13E8FFFF CALL 00E60D20
00E6250D 8DB5 FFFEFFFF LEA ESI, DWORD PTR [EBP-101]
00E62513 EB 02 JMP SHORT 00E62517
00E62515 8B36 MOV ESI, DWORD PTR [ESI]
00E62517 83FB 04 CMP EBX, 4
00E6251A 75 1D JNZ SHORT 00E62539
00E6251C 56 PUSH ESI
00E6251D 8B45 0C MOV EAX, DWORD PTR [EBP+C]
00E62520 50 PUSH EAX ; kernel32.GetCurrentThreadId
00E62521 E8 EAFBFFFF CALL 00E62110 ; 使用GetProcAddress
00E62526 8B15 3855E600 MOV EDX, DWORD PTR [E65538] ; ***************************
00E6252C 8902 MOV DWORD PTR [EDX], EAX ; kernel32.GetCurrentThreadId
00E6252E B8 E80DE600 MOV EAX, 0E60DE8
00E62533 8B17 MOV EDX, DWORD PTR [EDI] ; ElAnyCal.004E117C
00E62535 8902 MOV DWORD PTR [EDX], EAX ; kernel32.GetCurrentThreadId
00E62537 EB 19 JMP SHORT 00E62552

程式碼有可能停在E62526或者E624C9上。其中Call E6234C這條指令將對返回的位址進行額外的處理,因此在此將
該指令全部換成NOP。EDX指的是IAT的位址。程式碼返回後,到達:
00E62728 0FB60E MOVZX ECX, BYTE PTR [ESI]
00E6272B 41 INC ECX
00E6272C EB 05 JMP SHORT 00E62733
00E6272E B9 04000000 MOV ECX, 4
00E62733 01CE ADD ESI, ECX
00E62735 E8 0EFDFFFF CALL 00E62448 ; 從這裡使用上述指令
00E6273A 5B POP EBX
00E6273B ^ EB CE JMP SHORT 00E6270B
00E6273D 61 POPAD

可以在POPAD上設斷點,中斷後,就可以使用ImportREC重建IAT,其中會有一個函數ImportREC不能識別,
是GetProcAddress。確定所有輸入函數後,用Fix Dump即可。

4. 重建IAT後,程序一般還是不能用,因為重建後的程序將需要使用另外的一些程式碼(我不知Asprotect是如何實現)。
一般會有兩段程式碼,第一段一般長度為1D000,第二段為8000或者C000。行簡單,在第二步的時候,順便使用LordPE
中的Dump Region匯出這兩段程式碼。然後使用LordPE將這兩段貼到重建後的執行文件中(首先新增一個Section填補
到新程式碼的虛擬位址空間,然後使用Load Section From Disk,如果發現Section個數太多而不能增加新的Section,
可以檢視前面有沒有實際長度為0的段,可以並到該段的上面一個段,只需將前一個段的虛長度增加這個短的虛長度
即可)。
5. 如果在第三步重建IAT後的程序執行還有問題,可以在第三步使用ImportREC的Save Tree目錄首先將IAT匯出到一個
文件,然後重現執行程序,再運用ImportREC將IAT並入到可執行文件中即可。
6. Asprotect用到的若干函數:
GetVersion 在Win2000上返回 0x08390005
GetCurrentProcess 返回0xFFFFFFFF
GetCurrentThread 返回0xFFFFFFFE
LockResource 返回自己
FreeResource 去除一個使用參數,功能返回版本號
GetCommandLineA 返回可執行檔案名
GetVersionEx 用MOVSD將結果移動
GetCurrentProcessId
GetCurrentThreadId
GetModuleHandleA
GetProcAddress
DialogBoxIndirectParamA
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



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

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


所有時間均為台北時間。現在的時間是 09:02 PM


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


SEO by vBSEO 3.6.1