2015年1月23日 星期五

CRC轉ICS(一)

作者:kkmomo
來源:
備註:如果作者不希望被轉帖到此處,請告知,小弟會馬上刪帖。
-------------------------------------------------------------------------------------

CRC轉ICS(一)

TMS_v150.2
接觸這塊領域也才短短一個月,僅能提供一些小小的心得供大家參考

排版方面我不太在行,可能會寫得有些亂,請見諒^^"

我自己覺得需要的能力:
★★★★★ 邏輯
★★★★    程式語法的了解
★★★★    耐心、毅力
★★★      查找資料
★★★      經驗
★            組合語言



所需工具:UCE、有CRCbypass佳
--------------------------------------------------------
一、要先有CRC代碼
--------------------------------------------------------
首先就從 物理無敵CRC 開始說起吧,這應該是數據界的HelloWorld!!!

最簡短的CRC版
[Enable]
00615994:
DB 75 //短程jne跳躍
[Disable]
00615994:
DB 74 //短程je跳躍

常見版本2
[Enable]
00615994:
jne 006159A2 // DB 75 0E 83 4D FC FF
[Disable]
00615994:
je 006159A2 // DB 74 0E 83 4D FC FF
從aob可以看出以上兩個數據是等價的

--------------------------------------------------------
二、找call dword ptr
--------------------------------------------------------
而要如何從CRC轉成ICS
基本上需要有3個地址
(1) ptr基址
(2) 被hook函數地址
(3) call的反回地址

基本形式如:
Addr_0 call dword ptr [Addr_1] : [Addr_2]
Addr_3 ***any code***

(1)=Addr_1
(2)=Addr_2
(3)=Addr_3

一般來說只要"往前"找到call dword ptr,(3)便可知
至於(1)、(2)通常都要用一些手段來得到

這數據往前多看兩行,就發現了!!
0061598C - FF 15 8C5EE200        - call dword ptr [00E25E8C] : [IsRectEmpty]
00615992 - 85 C0                 - test eax,eax
00615994 - 74 0E                 - je 006159A4

感謝Inndy大大指點,winapi還是用函數名比較好XD
ps.758D0903 = IsRectEmpty,函數名本身即代表起始地址,用哪個都可以

這是最幸運的情況,3個願望一次滿足
(1)=Addr_1=00E25E8C
(2)=Addr_2=IsRectEmpty
(3)=Addr_3=00615992

--------------------------------------------------------
三、改寫
--------------------------------------------------------
3個地址都有了,那麼該如何改寫成ICS呢?

基本形如下:

CheckEsp:自定函數名
Size:大小
FunName:自定標籤名

[Enable]
Alloc(CheckEsp,Size)
Label(FunName)

CheckEsp:
cmp [esp],Addr_3  //看返回地點是不是我們要的
jne Addr_2        //不是則跳回原函數
mov [esp],FunName //將反迴值改成自己的函數
jmp Addr_2        //改變反迴值後一樣跳回原函數

FunName:
***copy code***   //把 [call dword ptr 下一行] 到 [je 006159A4] 之間的code複製過來
jne 006159A2      //從crc [enable]中copy過來

Addr_1:
DD CheckEsp

[Disable]
Addr_1:
DD Addr_2
DeAlloc(CheckEsp)
--------------------------------------------------------
成果如下
[Enable]
Alloc(CheckEsp,32)
Label(PGod)

CheckEsp:
cmp [esp],00615992
jne IsRectEmpty
mov [esp],PGod
jmp IsRectEmpty

PGod:
test eax,eax
jne 006159A2

00E25E8C:
DD CheckEsp

[Disable]
00E25E8C:
DD IsRectEmpty

DeAlloc(CheckEsp)

理解程式碼後可再自行縮減精簡代碼

沒有留言:

張貼留言