知道任何有关钩子__usercall函数类型的知识吗?我成功挂机__thiscall,__stdcall并__cdecl打电话,但这对我来说已经足够。
知道任何人的的钩子库,__usercall或如何使用翻译为__stdcall或钩住此类函数__cdecl?
我首先必须挂钩的功能是:
int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);
Run Code Online (Sandbox Code Playgroud) 我有一个虚拟机,它在 VM_Create 上将函数(systemCalls)的地址传递给虚拟机。
所以我hook VM_Create 并窃取syscalls 地址,将其放入备份函数指针中,我修改后的systemCalls 函数的地址传递给原始VM_Create,从中我可以更改参数,添加或删除调用,然后调用支持的- up syscalls 函数。这运作良好,直到游戏的新版本。
我相信已经发现了问题:
这是未修改的 systemCalls 函数的开头:
intptr_t CL_CgameSystemCalls(intptr_t *args) {
switch (args[0]) {
case CG_PRINT:
Com_Printf( "%s", (const char*)VMA(1));
return 0;
case CG_ERROR:
Com_Error(ERR_DROP, "%s", (const char*)VMA(1));
return 0;
Run Code Online (Sandbox Code Playgroud)
这是我修改后的系统调用函数:
intptr_t modified_CL_CgameSystemCalls (intptr_t *args)
{
switch (*args)
{
case CG_GETSNAPSHOT:
mysnap = mysnap ;
mynextSnap = (snapshot_t*) (CG_QVM2NATIVE(args[2]));
mysnap = mynextSnap;
retval = original_CL_CgameSystemCalls(args);
break ;
Run Code Online (Sandbox Code Playgroud)
问题是从修改后的函数中调用原始函数:
intptr_t modified_CL_CgameSystemCalls(intptr_t *args)
{
retval = original_CL_CgameSystemCalls(args);
return retval;
}
Run Code Online (Sandbox Code Playgroud)
已经失败了。
从反汇编的伪代码可以看出,CL_CgameSystemCalls的新定义似乎是:
char __usercall …Run Code Online (Sandbox Code Playgroud)