能力值:
( LV3,RANK:20 )
|
-
-
2 楼
EB FE
|
能力值:
( LV12,RANK:400 )
|
-
-
3 楼
可以在应用层自己写一个ExInterlockedCompareExchange64实现8字节原子操作
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
0环就提升irql
3环的话.将其他线程暂停
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
恩这个我等下来试试,如果能实现,算是最好的了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
暂停其它线程.........这种方法在有些特点的环境下是不行的,我说的是3环,不考虑0环
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
HOOK是瞬时操作.如果通过汇编修改的话
如果那瞬间都会出问题.只能考虑暂停其他操作
除非是非常频繁的连续hook.
不过任何商业软件都不会这么干吧
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
#include "stdafx.h"
#include <windows.h>
void SafeChange8Bit(PUCHAR puDst,PUCHAR puSrc)
{
DWORD dwDst1 = *(DWORD*)puDst;
DWORD dwDst2 = *(DWORD*)((DWORD*)puDst+1);
DWORD dwSrc1 = *(DWORD*)puSrc;
DWORD dwSrc2 = *(DWORD*)((DWORD*)puSrc+1);
_asm
{
mov edx,dwDst1
mov eax,dwDst2
mov ecx,dwSrc1
mov ebx,dwSrc2
cmpxchg8b puDst ;这里不会成功,不知道原因了,都是同一块同存
}
}
int main(int argc, char* argv[])
{
unsigned char szBuffer[8] = {0};
szBuffer[0] = 1;
szBuffer[4] = 1;
unsigned char szSrcBuffer[8] = {1,2,3,4,5,6,7,8};
DWORD dwDst1 = *(DWORD*)szBuffer;
DWORD dwDst2 = *(DWORD*)((DWORD*)szBuffer+1);
DWORD dwSrc1 = *(DWORD*)szSrcBuffer;
DWORD dwSrc2 = *(DWORD*)((DWORD*)szSrcBuffer+1);
_asm
{
mov edx,dwDst1
mov eax,dwDst2
mov ecx,dwSrc1
mov ebx,dwSrc2
lock cmpxchg8b szBuffer
}
//SafeChange8Bit(szBuffer,szSrcBuffer);
}
这样实现了8字节的原子操作
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
恩,也有一定的道理,
|
能力值:
(RANK:400 )
|
-
-
10 楼
你可以看一下MHOOK的代码,它hook的时候会暂时把其他线程挂起。
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
参考detours
|
能力值:
( LV3,RANK:30 )
|
-
-
12 楼
暂停其他线程
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
MHOOK的代码看了一下,考虑的是很详細的,连暂停时线程上下文中EIP的指针停留位置都给予了处理,还是不错的,
|
能力值:
(RANK:400 )
|
-
-
14 楼
是的,还支持x64,普通用户足矣。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
如果用来挂钩CsrCreateProcess之类的api立马蛋碎……
|
|
|