目標軟體: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處是關鍵比較。
總結
對於這類加殼軟體的脫殼方法,關鍵是加殼程式與脫殼後的程式要注意相互比較,脫殼後的程式如果缺少某些殘留的外殼,可以用以上方法新增。