32位下如何HOOK高并发函数

#include<NTDDK.H>
 
/*********************************************************************
******
    “多核环境下,如何保证对一个高并发的内核函数进行HOOK而不会出错?”
******
**********************************************************************/
 
LONG AddressOfSwapContext = 0x805428e8;// 805428e0 这是SwapContext的地址
 
/*****************************************************
*******
****        自己的函数需要做的事情
*******
****************************************************/
 
_declspec(naked)VOID HookSwapContext()
{
 
    _asm{
        or cl, cl;
        mov byte ptr es : [esi + 2Dh], 2;
        pushfd;
        jmp AddressOfSwapContext;
    }
         
}
 
LONG OldCode[2] = { 0 };
 
VOID ULodeDriver(PDRIVER_OBJECT pDriver)
{
    OldCode[0] = 0xC626C90A;
    OldCode[1] = 0x9C022D46;
 
    _asm{
    pushad;
    pushfd;
    mov esi, 0x805428E0;
    mov edx, [esi];
    mov eax, [esi + 4];
    mov ebx, OldCode[0];
    mov ecx, OldCode[4];
    lock CMPXCHG8B[esi];
    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[2] = {0};
 
    Code[0] = (JmpCode << 8) + 0xE9;
    Code[1] = (JmpCode >> 24);
     
    DbgPrint("Code[0]:%X\n", Code[0]);
    DbgPrint("Code[1]:%X\n", Code[1]);
 
 
    __asm{ 
        pushad;
        pushfd;
        mov esi, 0x805428E0;
        mov eax, [esi];
        mov edx, [esi + 4];
        mov ebx, Code[0];
        mov ecx, Code[4];
        lock CMPXCHG8B[esi];
    /* 
    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[0]);
    DbgPrint("OldCode【1】是:%X\n",OldCode[1]);
    DbgPrint("高并发HOOK成功!\n");
 
 
     
    pDriver->DriverUnload = ULodeDriver;
 
    return STATUS_SUCCESS;
}
/*
为什么会使用CMPXCHG8B这个指令
以往我们在HOOK的时候会使用memcpy这个函数,但是这个只能一个一个替换
如果你还没有替换完成的时候,别的函数在调用,就会出错。
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天的大鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值