對 Authorware 4 中 U32 型別檔案的脫殼測試 ----- 告別前的最後一篇脫文 (5千字)

看雪資料發表於2000-08-17

對 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

相關文章