來源:
備註:如果作者不希望被轉帖到此處,請告知,小弟會馬上刪帖。
-------------------------------------------------------------------------------------
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遊戲就掛掉
儘可能不要改動到原來的程式碼
除非你知道會有什麼後果
能在你掌控之中
不過有時需要錯誤嘗試法
看看會有什麼效果就另當別論
*/
寫累了 先告一個段落
---------------------------------------------------------
狀況二:
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遊戲就掛掉
儘可能不要改動到原來的程式碼
除非你知道會有什麼後果
能在你掌控之中
不過有時需要錯誤嘗試法
看看會有什麼效果就另當別論
*/
寫累了 先告一個段落
---------------------------------------------------------
沒有留言:
張貼留言