能力值:
( LV6,RANK:90 )
|
-
-
2 楼
进场句柄?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
hook
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
跟踪相关寄存器值的来源
|
能力值:
( LV3,RANK:30 )
|
-
-
5 楼
特征码搜索?可以参考下我以前取SOCKET句柄的代码
#define SOCKET_INF "\x8D\x4D\x08\x8D\x55\xEC\x51\x52\x6A\x00\x8D\x8D\x40\xF0\xFF\xFF\x68\xAA\x0F\x00\x00\x51\x50"
#define SOCKET_INF_BYTES sizeof(SOCKET_INF)-1
SOCKET m_GameSocket=0;
void *psocket_filter = NULL;
__declspec(naked)void socket_filter()
{
__asm
{
mov m_GameSocket,eax
jmp psocket_filter
}
}
void InitHook()
{
void *pModBase = (void*)GetModuleHandleA("xxxx.dll");
psocket_filter = FIND_MEMORY(n,SOCKET_INF);
if(psocket_filter)
{
DetourTransactionBegin();
DetourAttach((void**)&psocket_filter,socket_filter);
DetourTransactionCommit();
}
}
|
能力值:
( LV9,RANK:280 )
|
-
-
6 楼
比如一个类成员函数或虚函数,原型是:
void CXXX::FuxkWorld(int world)
那你就先确定函数地址,然后以 void (__fastcall *CXXX_FuxkWorld)(void *pthis, int dummy, int world) 的形式去inline hook该函数。
hook到之后去
void __fastcall NewCXXX_FuxkWorld(void *pthis, int dummy, int world)
{
}
里面取void *pthis就得到this指针了。
|
能力值:
( LV13,RANK:240 )
|
-
-
7 楼
.................
你这种直接使用void*pthis一般是COM口兼容的形式,
COM口写代码的时候是 pcomobject->func(x,y)实际上还是把this做为第一个参数传入。典型 的就是D3D9接口
pcomobject->func(x,y)
==>
func(this,x,y)
而真正的class 调用 是将this放在ecx寄存器内
pclass->func(x,y)
==>
mov ecx,this
call func(x,y)
|
能力值:
( LV9,RANK:280 )
|
-
-
8 楼
具体情况具体分析,D3D那样的COM接口直接__stdcall *fn(void *pthis, 其他参数);
就行了
真正的__thiscall要用__fastcall模拟
|
能力值:
( LV13,RANK:240 )
|
-
-
9 楼
fastcall 是ecx edx传递前两个参数。
C++成员函数X86下就是 ECX=this。其他的参数还是按照原来的压栈方式。fastcall没法模拟
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
你研究的东西是网狐棋牌游戏客户端吗?
如果是的话可以从CGameFrameEngine::m_pGameFrameEngine 入手。
|
能力值:
( LV9,RANK:280 )
|
-
-
11 楼
你看我说的了吗,我说的是第一个参数void *pthis,第二个参数填int dummy,用来占据edx的位置,我用这种参数格式hook很多次了,从来没有boom过一次
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
正解看了半天 ecx就是this
|
能力值:
( LV9,RANK:410 )
|
-
-
13 楼
已经注入进去了,1 直接调用但参数填写要构造好,或者这个函数有依赖,直接调用会有问题。需要仔细看看。
2 间接调用,要么获得这个类实例,你来调用。
3 要么获得对这个类里面这个函数的上层调用(如果有的话),看具体的环境了。
|
|
|