-
-
未解决
[求助]关于Hook高频函数
-
发表于:
2024-4-21 02:24
2018
-
我在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位置,发生崩溃?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课