對 Authorware 4 中 U32 型別檔案的脫殼測試 -----
告別前的最後一篇脫文
【宣告】
我寫文章以交流為主,希望大家在轉載時能保持文章的完整性。
【前言】
由於Authorware 4中的 U32 型別檔案其實是動態連結庫檔案,因此對這些 U32 檔案的脫殼其實和對 DLL 脫殼的方法相似。
對 Authorware 我實在不熟悉,花了半天時間,才弄清楚怎樣在 Authorware 中載入 U32 型別檔案。
由於上次我已經用PECompact加殼一個DLL脫殼測試過。這次就換另一種加殼程式試試。我選中了Aspack v2.1。
樣例檔案: ODBC.U32 (Authorware v4.0所帶檔案)
加殼方式: Aspack v2.1加殼
除錯工具: SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10
目標: 脫殼
作者: ljttt
寫作日期: 2000-08-16
(簡稱說明:EP: Entry Point,DLL: 動態連結庫檔案)
1、首先當然要分析基本資訊了。用PEditor開啟動態連結庫檔案,得到如下資訊
Entry Point: 0000C001
Image Base: 10000000
Size of Image: 0000F000
Section Virtual Size Virtual
Offset
.idata 00001000 00009000
2、現在我們要在動態連結庫的入口點處中斷,這次我用《對PECompact加殼的DLL脫殼的一點分析》一文中的第二種方法。
一、首先,用PEditor開啟ODBC.U32檔案,然後單擊 FLC 按鈕(這個功能是幫你計算Virtual Address轉換為 Offset的)
輸入 1000C001 ,單擊 DO! 按鈕,得到 Offset[hex] 為 4001。
二、然後,用Hex WorkShop開啟ODBC.U32檔案,定位到 4001,記下此處位元組的值 60。
三、然後,用Hex WorkShop把 4001 處的位元組 60 改為 CC。
四、Ctrl-D中斷進入SoftICE,設斷點 bpint 3。
五、F5回到Windows,執行Authorware 4.exe。(主程式檔案)
這時,程式還沒有載入ODBC.U32檔案,單擊選單 Insert / Load Model,選擇主程式目錄下的 TEMPLATE/CONSUMER子目錄下的QSADCONS.A4D檔案,然後單擊選單
Insert / Paste Model,選擇 QS:Administration - Cons.。程式開始載入ODBC.U32,此時將中斷進入SoftICE。
3、下指令,修改程式入口的指令 CC 為 60。
eb eip 60
修改後程式碼視窗顯示如下:
015F:03C6C001 60
PUSHAD
<--我們中斷在此
015F:03C6C002 E872050000 CALL
03C6C579
015F:03C6C007 EB33
JMP 03C6C03C
015F:03C6C009 87DB
XCHG EBX,EBX
015F:03C6C00B 90
NOP
015F:03C6C00C 0000
ADD [EAX],AL
015F:03C6C00E 0000
ADD [EAX],AL
注意我們中斷時的 IP 為 03C6C001,而不是 10000000+C001=1000C001,這說明Windows載入ODBC.U32的基地址不是
10000000,我們來計算一下實際載入的基地址: 3C6C001-C001=3C60000。(我跟蹤發現每次載入的基地址都不一樣)
4、繼續跟蹤,到如下(也可用 bpm 3C60000+9000 來跟蹤 .idata 的變化情況來快速跟蹤)
015F:03C6C2C9 F3A4
REPZ MOVSB
015F:03C6C2CB 5E
POP ESI
015F:03C6C2CC 6800800000 PUSH
00008000
015F:03C6C2D1 6A00
PUSH 00
015F:03C6C2D3 FFB5E1394400 PUSH
DWORD PTR [EBP+004439E1]
015F:03C6C2D9 FF95ED394400 CALL
[EBP+004439ED]
015F:03C6C2DF 83C608 ADD
ESI,08
015F:03C6C2E2 833E00 CMP
DWORD PTR [ESI],00
015F:03C6C2E5 0F8526FFFFFF JNZ
03C6C211
015F:03C6C2EB 6800800000 PUSH
00008000
015F:03C6C2F0 6A00
PUSH 00
015F:03C6C2F2 FFB5E5394400 PUSH
DWORD PTR [EBP+004439E5]
015F:03C6C2F8 FF95ED394400 CALL
[EBP+004439ED] <---在此處停下來
015F:03C6C2FE 8B9D60394400 MOV
EBX,[EBP+00443960]
015F:03C6C304 0BDB
OR EBX,EBX
015F:03C6C306 7408
JZ 03C6C310
此時 3C69000 (.idata所在的記憶體地址) 處的內容如下
015F:03C69000 00009064 00000000 00000000 000092A2
d...............
015F:03C69010 00009150 00009148 00000000 00000000
P...H...........
015F:03C69020 000092C0 00009234 00009108 00000000
....4...........
5、在此處我們要得到還原好的import table。下指令
/dump 3C69000 1000 c:\temp\dump.bin
6、繼續跟蹤,到如下
015F:03C6C4EA 59
POP ECX
015F:03C6C4EB 0BC9
OR ECX,ECX
015F:03C6C4ED 89852F3E4400 MOV
[EBP+00443E2F],EAX
015F:03C6C4F3 61
POPAD
015F:03C6C4F4 7508
JNZ 03C6C4FE
(JUMP )
015F:03C6C4F6 B801000000 MOV
EAX,00000001
015F:03C6C4FB C20C00 RET
000C
==> 03C6C4FE 68001CC603 PUSH
03C61C00 <---3C61C00
就是我們要找的OEP了
015F:03C6C503 C3
RET
<---在此處停下來
7、這裡到了我們得到整個程式記憶體映象的時候了。
/dump 3C60000 F000 c:\temp\dump.u32
記下此處我們得到 OEP RVA = 3C61C00 - 3C60000 = 1C00。(也就是要減去實際基地址3C60000)
8、F5回到Windows,結束主程式。開始修補dump.u32。用PEditor開啟dump.u32檔案,選擇sections,右鍵開啟選單,選擇dumpfixer。OK!一次完成所有Section的RVA、Size的轉換工作。再修改Entry
Point為 1C00,單擊apply changes儲存,選擇directory,修改其中的Import Table的RVA為 9000,Size為1000。單擊儲存。
9、用Hex WorkShop開啟dump.u32和dump.bin,定位dump.dll位置到 9000,選擇 1000 個位元組。刪除。
選擇dump.bin的 1000 個位元組,複製到dump.dll中。儲存。
10、把dump.u32複製到主程式目錄下,換名為ODBC.U32。重新執行主程式Authorware 4.exe。測試成功。
【後記】
從測試的幾個DLL脫殼情況來看,加殼程式一般沒有對Export table做處理。不知道Export table象import table一樣加密後會怎麼樣。我還不太瞭解Windows對Export
table的載入處理機制。萬一遇到這種情況,我一定死翹翹了。不過還好,實驗測試中沒發現此類事件。不過真正的商業軟體加的殼就不一定了。
但願等我把export table的載入處理機制弄清楚了,再遇到這類軟體。到那時,(俺手拿牛二尖刀,一臉陰笑)嘿嘿...................
【本月小結】
不知不覺,一個月就過去了。算下來俺也寫十餘篇脫文。感覺進步不少,這裡要多謝看雪教學中各位高手精彩的文章給了我很大的幫助,投桃報李,因此俺也把自己的一點點所得寫了出來。無奈俺用隔月上網的方式來減少網費,所以如果哪位朋友給我寫信,可能只有等到我
9 月 20 日再次上網以後才能回覆了。Email:ljtt@yeah.net