关于Hook高频函数

我在Hook一个调用频率极高的函数发生崩溃,于是看了MinHook的解决方案,用的是自旋锁,MH关键代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

static VOID EnterSpinLock(VOID)

{

    SIZE_T spinCount = 0;

    while (InterlockedCompareExchange(&g_isLocked, TRUE, FALSE) != FALSE)

    {

        if (spinCount < 32)

            Sleep(0);

        else

            Sleep(1);

        spinCount++;

    }

}

static VOID LeaveSpinLock(VOID)

{

    InterlockedExchange(&g_isLocked, FALSE);

}

MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal)

{

    EnterSpinLock();

    // ... Hook过程

    LeaveSpinLock();

    // ...

}

于是我照搬自旋锁代码加到我的hook函数前后,问题解决。

我对于Hook多线程问题的理解如下:
在Hook多条指令时,如果环境是多核,有可能有部分指令还没有修改完成,此时有另一条线程来执行不完整或错误的指令,程序崩溃
我的疑惑在于:自旋锁仅仅保护用于Hook的函数同时仅被一个线程执行,但是这与被hook的位置无关,依然有可能发生指令修改了一半被其他线程执行的可能,所以我感觉这个自旋锁没有意义。当然肯定是我理解有问题,还请大家不吝赐教
还有一个疑惑,如果是单核环境,有没有一种可能,指令修改到一半时,线程切换,恰巧切换到另一条线程执行被hook位置,发生崩溃?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值