哥比彩砖还炫 发表于 2021-3-7 18:21

32位下如何HOOK高并发函数

#include<NTDDK.H>

/*********************************************************************
******
        “多核环境下,如何保证对一个高并发的内核函数进行HOOK而不会出错?”
******
**********************************************************************/

LONG AddressOfSwapContext = 0x805428e8;// 805428e0 这是SwapContext的地址

/*****************************************************
*******
****                自己的函数需要做的事情
*******
****************************************************/

_declspec(naked)VOID HookSwapContext()
{

        _asm{
                or cl, cl;
                mov byte ptr es : , 2;
                pushfd;
                jmp AddressOfSwapContext;
        }
               
}

LONG OldCode = { 0 };

VOID ULodeDriver(PDRIVER_OBJECT pDriver)
{
        OldCode = 0xC626C90A;
        OldCode = 0x9C022D46;

        _asm{
        pushad;
        pushfd;
        mov esi, 0x805428E0;
        mov edx, ;
        mov eax, ;
        mov ebx, OldCode;
        mov ecx, OldCode;
        lock CMPXCHG8B;
        popfd;
        popad;
        }

        DbgPrint("驱动已经卸载完毕!\n");

}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pReg)
{
        //汇编的情况下可以写地址,但是这个是硬编码
        LONG JmpCode = (LONG)HookSwapContext - 0x805428e0 - 5;
        DbgPrint("HookSwapContext:%X\n", HookSwapContext);
        DbgPrint("JmpCode:%X\n", JmpCode);
        LONG Code = {0};

        Code = (JmpCode << 8) + 0xE9;
        Code = (JmpCode >> 24);
       
        DbgPrint("Code:%X\n", Code);
        DbgPrint("Code:%X\n", Code);


        __asm{       
                pushad;
                pushfd;
                mov esi, 0x805428E0;
                mov eax, ;
                mov edx, ;
                mov ebx, Code;
                mov ecx, Code;
                lock CMPXCHG8B;
        /*       
        CMPXCHG8B的用法
        该指令判断指定内存中的8字节内容和EDX:EAX (edx高32位,eax, 低32位)中的64字节内容是否相同,
        如果相同,就把ECX : EBX(ecx高32位,ebx, 低32位)中的内容替换到指定内存。
        如果不相同,就把指定内存中的值替换到ECX : EBX中。
        */
                popfd;
                popad;
        }
        DbgPrint("OldCode【0】是:%X\n",OldCode);
        DbgPrint("OldCode【1】是:%X\n",OldCode);
        DbgPrint("高并发HOOK成功!\n");


       
        pDriver->DriverUnload = ULodeDriver;

        return STATUS_SUCCESS;
}
/*
为什么会使用CMPXCHG8B这个指令
以往我们在HOOK的时候会使用memcpy这个函数,但是这个只能一个一个替换
如果你还没有替换完成的时候,别的函数在调用,就会出错。
*/


页: [1]
查看完整版本: 32位下如何HOOK高并发函数