OvidiuS icon

MakeVirtualHook

OvidiuS | PRO | 02/02/13 02:08:51 AM UTC | 0 ⭐ | 300 👁️ | Never ⏰ | []
C++ |

3.51 KB

|

None

|

0 👍

/

0 👎

    void MakeVirtualHook()
    {
            edict_t *pEdict = CREATE_ENTITY();
            edict_t *pEntity = CREATE_ENTITY();
     
     
            CALL_GAME_ENTITY(PLID, "player", &pEdict->v);
            CALL_GAME_ENTITY(PLID, "weapon_knife", &pEntity->v);
           
            if (pEdict->pvPrivateData == NULL)
            {
                    REMOVE_ENTITY(pEdict);
                    return;
            }
     
            if (pEntity->pvPrivateData == NULL)
            {
                    REMOVE_ENTITY(pEntity);
                    return;
            }
     
    #ifdef _WIN32
            void **vtable = *((void***)((char*)pEdict->pvPrivateData));
            void **vtable = *((void***)((char*)pEntity->pvPrivateData));
    #elif __linux__
            void **vtable = *((void***)(((char*)pEdict->pvPrivateData) + 0x94));
            void **vtable = *((void***)(((char*)pEntity->pvPrivateData) + 0x94));
    #endif
           
            REMOVE_ENTITY(pEdict);
            REMOVE_ENTITY(pEntity);
           
            if(vtable == NULL)
                    return;
           
            int **ivtable = (int **)vtable;
           
            pOrigFuncSpawn = (void *)ivtable[VirtFuncSpawn];
            pOrigFuncTakeDamage = (void *)ivtable[VirtFuncTakeDamage];
            pOrigFuncTraceAttack = (void *)ivtable[VirtFuncTraceAttack];
            pOrigFuncKilled = (void *)ivtable[VirtFuncKilled];
            pOrigFuncPlayerPostThink = (void *)ivtable[VirtFuncPlayerPostThink];
            pOrigFuncResetMaxSpeed = (void *)ivtable[VirtFuncResetMaxSpeed];
            pOrigFuncDeploy = (void *)ivtable[VirtFuncDeploy];
           
    #ifdef _WIN32
            DWORD OldFlags;
     
            VirtualProtect(&ivtable[VirtFuncSpawn], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncTakeDamage], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncTraceAttack], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncKilled], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncPlayerPostThink], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncResetMaxSpeed], sizeof(int *), PAGE_READWRITE, &OldFlags);
            VirtualProtect(&ivtable[VirtFuncDeploy], sizeof(int *), PAGE_READWRITE, &OldFlags);
    #elif __linux__
            mprotect(&ivtable[VirtFuncSpawn], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncTakeDamage], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncTraceAttack], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncKilled], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncPlayerPostThink], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncResetMaxSpeed], sizeof(int*), PROT_READ | PROT_WRITE);
            mprotect(&ivtable[VirtFuncDeploy], sizeof(int*), PROT_READ | PROT_WRITE);
    #endif
     
            ivtable[VirtFuncSpawn] = (int *)HookSpawn;
            ivtable[VirtFuncTakeDamage] = (int *)HookTakeDamage;
            ivtable[VirtFuncTraceAttack] = (int *)HookTraceAttack;
            ivtable[VirtFuncKilled] = (int *)HookKilled;
            ivtable[VirtFuncPlayerPostThink] = (int *)HookPlayerPostThink;
            ivtable[VirtFuncResetMaxSpeed] = (int *)HookResetMaxSpeed;
            ivtable[VirtFuncDeploy] = (int *)HookDeploy;
    }

Comments