标签: usercall

如何挂钩__usercall,__userpurge(__spoils)函数?

知道任何有关钩子__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)

c hook detours reverse-engineering usercall

2
推荐指数
1
解决办法
4179
查看次数

挂钩用户调用功能?

我有一个虚拟机,它在 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)

c hook detours reverse-engineering usercall

1
推荐指数
1
解决办法
4826
查看次数

标签 统计

c ×2

detours ×2

hook ×2

reverse-engineering ×2

usercall ×2