Krypton 0.5加殼程式脫殼及輸入表修復記

看雪資料發表於2004-10-06

Krypton 0.5加殼程式脫殼及輸入表修復記

軟體名稱:swift的幻影V2.2序號產生器
使用工具:fly_od v1.10  peid v0.92  winhex v11.5 import v1.6 trw2000
除錯環境:winme
軟體簡介:該軟體為幻影v2.2的序號產生器,現在用的人不多了。
偵殼及OEP:PEID偵測知為Krypton 0.5 -> Yado/Lockless OEP為0a0a6
 記錄人及時間: lpyxt 10-5-2004 22:40

此殼做的較好,尤其花指令令人頭疼,剛接觸稍不留意不是當機就是跟飛。值得一提的是loveboom的Krypton0.5 OEP Finder v1.0脫殼指令碼,可以穩穩的停在入口處(40a0a6),可惜指令碼語言我不會,有誰寫一篇教程教教我等菜鳥吧。
用TRW2000無法除錯。還是用od吧,它是脫殼利劍。

脫殼步驟:
od調入undbpe.exe隱藏od標誌,忽視除記憶體異常外的其他異常。
f9
停在8003e1處
shift+f9
停在8093ec處
ctrl-40a0a6
f2
shift+f9
停在40a0a6處--oep
取消斷點f2
用一脫殼軟體dump之,用import修復輸入表失敗。脫殼後的程式不能執行?????!!!!
調入脫殼後的軟體除錯,發現所呼叫函式處非法。只有跟蹤原程式了。。。。
退出所有程式,執行undbpe.exe
執行trw2000
bpx exitprocess
退出undbpe.exe
斷在exitprocess處,在堆疊框中有40a378
u 40a378並向上找到40a372處的反彙編程式碼
40A372  call near[004230bc]=0070001f

0070001f add ds:[0070003a],7933b2ec
         mov eax,ds:[0070003a]  ;eax=0b5b406c+7933b2ec=848ef358
         sub ds:[0070003a],7933b2ec   ;還原[0070003a]處的值為0b5b406c
         jmp eax   ;eax=848ef358 exitprocess的入口處

原來從70001f開始的地方是解密輸入表的。透過思考我認為應該是這樣的,程式在某處將值1f007000(0070001F)寫入到004230bc處,然後將函式(exitprocess)的地址值58f38e84(84f38e84)透過變換後寫入0070003a處。然後將函式名字作加密處理。程式應該要用到getprocadess函式和loadlibrarya。還有關鍵地址4230bc和70003a應該是監視的重點。後面的跟蹤證明分析正確。

od調入undbpe.exe
f9
斷在8003e1處
在4230bc和70003a處下記憶體訪問斷點
下斷點bpx loadlibraryA和bpx getprocdaess找到後在其後的花指令跳轉處下斷,不然程式會飛。
shift+f9然後f8或f7小心跟蹤找到下面幾處可疑地址。
809d9a popad ;eax=84f38e84
809dbb mov eax,dword ptr ss:[ebp+004117ba] ;eax=0070001f
去掉這行程式碼(以nop填充之),使之將函式地址值直接寫入到4230bc處
809e06 mov dword ptr ds:[edi],eax  ;edi=004230bc
8095b4 nop
8095b5 nop 
8095b6 nop
8095b7 shl byte ptr ds:[ecx],cl ;破壞函式名稱處 
8095b9 xor byte ptr ds:[ecx],al ;繼續破壞函式名稱

8095b4 xor ecx,ecx
       cmp ecx,0
       jmp 809625 ;去掉花指令直接跳轉
清除所有斷點,重新調入undbpe.exe
f9
斷在8003e1處後,
ctrl-809dbb 填入90 90 90 90 90,
ctrl-8095b4 填入33 c9 83 f9 00 eb 6a,
ctrl-40a0a6  下斷f2
shift+f9兩次,程式斷在入口點40a0a6
dump出程式,用impor修復輸入表ok後退出
執行脫殼修復後的程式。。。。。?沒反映
用od調入跟蹤發現在41e8fe處的call near [00423434]當機....
用以上的方法分析此處應該是呼叫USER32.GetCursorPos修復輸入表時根本沒有user32.dll看來輸入表還是有問題。用winhex調入dump_.exe找dll庫檔名字首字元的地址列表如下:
檔案首字地址        名字               輸入表陣列結構表中的地址
02A95C          KERNEL32.DLL           [029BEC]=5CA902
02B110          USER32.DLL             [029C00]=10B102
02B334          GDI32.DLL              [029C14]=34B302
02B34E          COMDIG32.DLL           [029C28]=4EB302
02B392          WINSPOOL.DLL           [029C3C]=92B302
02B3E2          APVAPI32.DLL           [029C50]=E2B302
02B3F0          SHELL.DLL                ×    ;以下是垃圾資料用來迷惑脫殼者
02B3FC          COMCTL32.DLL           [029C64]=FCB302
02B40A          OLEDLG.DLL             [029C78]=0AB402
02B560          OLE32.DLL              [029C8C]=60B502
02B56A          OLEPRO32.DLL           [029CA0]=6AB502
02B578          OLEAUT32.DLL           [029CB4]=78B502
將029BEC-0C(4位元組一段此地址為第四段,前三段長度為3×4=12(0ch))=029BE0反向(e09b02)填入[pe,0,0]=88h+80h(PE檔案頭中輸入表地址)處,將029c50+08h後填入20h位元組的00作為輸入表結構陣列結束。
刪除bb000處到檔案結束的所有位元組(import修復時新增的輸入表).執行dump_.exe成功

後記:
這個殼還算"溫柔"(準確地說應該是OD太強勁了),中間暗樁較多,但都被OD搞定了,跟蹤過程中沒有頻繁的當機,只是花指令太花了搞的人頭暈。輸入表修復也是令人生畏的事,不過透過此次脫殼修復,使我對輸入表的結構有了進一步的瞭解。另外脫殼後的程式在其他環境下沒有測試。
附件中為脫殼前的檔案

相關文章