關於用ASProtect v1.3加殼軟體的脫殼方法體會 (5千字)

看雪資料發表於2001-11-21

目標軟體:CloneCD 3.1.1.0
目標檔案:CloneCD.exe
加殼方式:ASProtect v1.3?
使用工具:trw2000
      Procdump
          peditor
      Imprec 1.3
      SuperBPM

CloneCD加殼有點特別,它將一部分註冊函式放在外殼裡,當你將它dump出來後沒法執行產生非法操作。(另外衝擊波2000也找不到oep)。
論壇精華3裡有很多有關ASProtect 脫殼的文章,我就不詳細介紹每一個步驟了,重點放在重建IAT和脫殼後沒法執行的解決方法上。

一、查詢oep

執行SuperBPM和trw2000載入CloneCD.exe。按照論壇精華3裡的方法:凡有 xor eax,eax;ret;的地方將斷點設在往下不遠的ret處。
但也有例外,這時應在xor eax,eax處停下,檢視eax+b8的內容"dd eax+b8",可得到一個地址,將斷點設在那裡。(其實eax是個_CONTEXT 指標,eax+b8是程式的eip)。
很幸運,oep在401000h處。

二、dump出脫殼後的主程式
在401000h處下指令"suspend"將程式掛起,回到window,執行Procdump,將主程式dump為dump.exe備用。

三、重建IAT
執行Imprec 1.3,選CloneCD.exe,"IAT AutoSearch" 它會提示你如果Search失敗就把rav改為105000,size改為4000加大Search範圍。就按它提示的做吧。"Get Import"後,再按"Auto Trace",還有大概70個指標沒解決。只好手工修改了:(
最後還有6個ptr沒解決:
        RAV                            PTR
    00105628    ?    0000    0213C914
    001055A4    ?    0000    0213C944
    001055A0    ?    0000    0213C93C
    00105598    ?    0000    0213C94C
    0010568C    ?    0000    0213C954
    0010558C    ?    0000    0213C960


前四個都和0213C93C處的程式碼類似:

017F:0213C93C A148361402      MOV      EAX,[02143648]
017F:0213C941 C3              RET   
017F:0213C942 8BC0            MOV      EAX,EAX
017F:0213C944 A150361402      MOV      EAX,[02143650]
017F:0213C949 C3              RET   
017F:0213C94A 8BC0            MOV      EAX,EAX
017F:0213C94C A140361402      MOV      EAX,[02143640]
017F:0213C951 C3              RET   

下命令"bpm 2143648 w" 重新執行CloneCD.exe,數次中斷後來到這裡:

017F:0213C7B9 C3              RET   
017F:0213C7BA 8BC0            MOV      EAX,EAX
017F:0213C7BC 6A00            PUSH    BYTE +00
017F:0213C7BE E8897CFFFF      CALL    `KERNEL32!GetModuleHandleA`
017F:0213C7C3 A34C361402      MOV      [0214364C],EAX
017F:0213C7C8 E8977CFFFF      CALL    `KERNEL32!GetVersion`
017F:0213C7CD A344361402      MOV      [02143644],EAX
017F:0213C7D2 68AC351402      PUSH    DWORD 021435AC
017F:0213C7D7 E8907CFFFF      CALL    `KERNEL32!GetVersionExA`
017F:0213C7DC E83B7CFFFF      CALL    `KERNEL32!GetCurrentProcess`
017F:0213C7E1 A348361402      MOV      [02143648],EAX
017F:0213C7E6 E8397CFFFF      CALL    `KERNEL32!GetCurrentProcessId`
017F:0213C7EB A350361402      MOV      [02143650],EAX
017F:0213C7F0 E81F7CFFFF      CALL    `KERNEL32!GetCommandLineA`
017F:0213C7F5 A340361402      MOV      [02143640],EAX
呵呵……知道是什麼了吧?所以:

00105628是GetVersion
001055A0是GetCurrentProcess
001055A4是GetCurrentProcessId
00105598是GetCommandLineA


再看0213C954的程式碼:

017F:0213C954 55              PUSH    EBP
017F:0213C955 8BEC            MOV      EBP,ESP
017F:0213C957 8B4508          MOV      EAX,[EBP+08]
017F:0213C95A 5D              POP      EBP
017F:0213C95B C20400          RET      04
017F:0213C95E 8BC0            MOV      EAX,EAX

017F:0213C960 55              PUSH    EBP
017F:0213C961 8BEC            MOV      EBP,ESP
017F:0213C963 5D              POP      EBP
017F:0213C964 C20400          RET      04

兩個空函式,暫時不用理它,將0010568C和0010558C改為KERNEL32中的任意一個函式,(我用GetTickCount).
"Fix Dumped"後,將生成dump_.exe檔案.
現在修改0010568C和0010558C的呼叫。對比執行CloneCD.exe,可知道呼叫在4A6929和4A6957處:
017F:004A6925 8B4314          MOV      EAX,[EBX+14]
017F:004A6928 50              PUSH    EAX
017F:004A6929 E8584B0200      CALL    004CB486 <==此call是呼叫0213C954
017F:004A692E 8BD0            MOV      EDX,EAX
017F:004A6930 8BC3            MOV      EAX,EBX

017F:004A6953 8B4614          MOV      EAX,[ESI+14]
017F:004A6956 50              PUSH    EAX
017F:004A6957 E8AA490200      CALL    004CB306 <==此call是呼叫0213C960
017F:004A695C 8BD3            MOV      EDX,EBX

將017F:004A6929改為pop eax;nop;nop;nop;nop;將017F:004A6957也改為pop eax;nop;nop;nop;nop;(注意不要搞亂堆疊)。
到這裡重建IAT完成。

四、修正dump_.exe

執行dump_.exe,還會有非法操作,地址都是213xxxx和215xxxx,而這些地址是程式的外殼部分。看來解決辦法只有把殘留的外殼部分加到dump_.exe中了。
再次載入CloneCD.exe,在oep(401000h)處中斷,然後下命令:"w 2131000,2148000 c:\213.bin" 和 "w 2150000,215a000 c:\215.bin"。將2131000到2148000,2150000到215a000兩處記憶體儲存下來。為什麼不直接把2130000到215a000的內容儲存下來呢?因為在2148000到215000的地方是沒有對映的“空洞”,直接dump會讓window崩潰!

用peditor裝入dump_.exe,可看到Image Base是4000000;點"Scetion",在Scetion列表中點右鍵,選"add a Section"新增一個新section,取名"213";然後修改它,引數如下:
Virtual Size = 1F000;(2148000-2131000)
Virtual Offset = 01D31000;(2130000-400000)
Raw Size = 1F000;(2148000-2131000)

用十六進位制編輯器修改dump_.exe,在檔案最後的地方新增213.bin的全部內容。存檔退出。用peditor繼續新增一個section,取名"215";引數如下:
Virtual Size = A000;(215A000-2150000)
Virtual Offset = 01D50000;(2150000-400000)
Raw Size = A000;(215A000-2150000)

在檔案最後的地方新增215.bin的全部內容
用peditor裝入改好的dump_.exe,點選"rebiulder" 選中"Make PE Header win nt/2k compitable"核取方塊。(注意其他的選項不要選,否則會改變記憶體的對映)。
到這裡dump_.exe已經可以完美執行了!至於爆破為註冊版我就不多說了,註冊演算法很複雜,(據說是橢圓曲線公開密匙演算法)。爆破卻很容易,415aff處是關鍵比較。

總結

對於這類加殼軟體的脫殼方法,關鍵是加殼程式與脫殼後的程式要注意相互比較,脫殼後的程式如果缺少某些殘留的外殼,可以用以上方法新增。

相關文章