2015年1月23日 星期五

CRC轉ICS(二)

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

CRC轉ICS(二)

TMS_v150.2

狀況二:
call dword ptr [reg]
call dword ptr [reg+offset]
諸如此類

---------------------------------------------------------
這次以黑暗無敵為例



CRC
[enable]
008EF8FD:
DB 84

[disable]
008EF8FD:
DB 85

寫法2
[enable]
008EF8FC:
je 008F1EB9 //DB 0F 84 B7 25 00 00

[disable]
008EF8FC:
jne 008F1EB9 //DB 0F 85 B7 25 00 00

這也是等價的寫法
當然也不是只有這兩種表示表
---------------------------------------------------------
008EF8F3 - 8B 06                 - mov eax,[esi]
008EF8F5 - 8B CE                 - mov ecx,esi
008EF8F7 - FF 50 18              - call dword ptr [eax+18]
008EF8FA - 85 C0                 - test eax,eax
008EF8FC - 0F85 B7250000         - jne 008F1EB9
008EF902 - 8B 86 18450000        - mov eax,[esi+00004518]

也是往前兩行就發現call dword ptr
但括號裡卻是"eax+18"!!
這該死的"eax+18"值要如何得知呢!
方法也不少種

方法一:
可以利用CE內建的功能查找(我是用CE6.2)
008EF8F7行,右鍵→"Find out what addresses this instruction accesses"
跳出個小視窗,CE會列出這行所訪問到的地址
在這個例子中剛好只找到一個,找到後就可以點Stop
如圖



 




Address
00C8A16C=eax+18
Value  
00931AC9=[00C8A16C]=[eax+18]
針對每個找到的地址可以更進一步查看各reg的值及stack的狀態
這下關鍵的3個地址又都有了,接下來做如同前,不再多作說明
---------------------------------------------------------
方法二:
如果沒有如方法一這類強大的功能,只好自己人工設斷點來查看
call dword ptr前後找合適的地方jmp
寫法很多種,要看你想得到哪些資訊
以單純得到eax值的話,舉個例:

//get eax value at 008EF8F7
[enable]
RegisterSymbol(GetEAX) //
1
Alloc(GetEAX,4)
Alloc(MyBreak,32)

008EF8F7:
jmp MyBreak //
在想要知道eax的地方,強制轉跳到自己的函數

MyBreak:
mov [GetEAX],eax //
eax值保存到自定的位置
call dword ptr [eax+18] //
2
test eax,eax
jmp 008EF8FC

[disable]
008EF8F7:
call dword ptr [eax+18]
test eax,eax

UnRegisterSymbol(GetEAX)
DeAlloc(GetEAX,4)
DeAlloc(MyBreak)
/*
1:
註冊GetEAX是方便用"goto address"
只要輸入GetEAX就能轉跳到保存位置查看
*/

/*
2:
不要忘了,做完自己想做的事後
把原本沒執行到的程式碼補上
再轉跳回原程式
不然99%會一enable遊戲就掛掉
儘可能不要改動到原來的程式碼
除非你知道會有什麼後果
能在你掌控之中
不過有時需要錯誤嘗試法
看看會有什麼效果就另當別論
*/

寫累了 先告一個段落
---------------------------------------------------------

沒有留言:

張貼留言