首页
社区
课程
招聘
[讨论]大家写inline hook都怎么保证被hook处的原子操作?
发表于: 2014-8-11 18:26 9073

[讨论]大家写inline hook都怎么保证被hook处的原子操作?

2014-8-11 18:26
9073
开中断和关中断对多cpu无效..那大家写inline hook都怎么原子化的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 8188
活跃值: (2857)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
interlockexchangeXXX
2014-8-11 19:03
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我要保证我先写一个字节,然后写入4个字节的原子操作,这些函数好像不能保证4个字节以上的?
2014-8-11 19:50
0
雪    币: 138
活跃值: (306)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
可以用InterlockedExchange64 一次原子操作8个字节
2014-8-11 21:32
0
雪    币: 138
活跃值: (306)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
如果是64位系统,还有超级霸气的 cmpxchg16b 可以一次修改16个字节,直接原子操作写一个FF25 14字节大跳没问题.
2014-8-11 21:39
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
按我的理解,interlocked只能跟其它interlocked函数同步吧,如果其它线程跳到这里来执行,还是没法lock住。
2014-8-11 21:59
0
雪    币: 7
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是吧。
intel文档这么写的
Causes the processor’s LOCK# signal to be asserted during execution of the accompanying instruction (turns the
instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal ensures that the
processor has exclusive use of any sharedmemory while the signal is asserted.

应该是cpu级别的原子操作。lock期间这段内存是不能被别的访问的。。
2014-8-11 22:09
0
雪    币: 8188
活跃值: (2857)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
interlockXX是整个系统上所有cpu同步的吧。。。我的理解是。不然怎么叫原子操作?
2014-8-12 01:14
0
雪    币: 38
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
假如没有其他办法这就被采纳为最佳答案了。
2014-8-12 11:12
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
detours好像不是这么做的,觉得detours更好
2014-8-14 09:53
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
刚有时间,查了下资料,x86/64上支持LOCK#,看起来应该是可以保证线程安全的,但我不太确定,至于其它CPU上怎么实现更是不清楚,msdn提到“This function is atomic with respect to calls to other interlocked functions.”,如果别人不调用interlocked函数估计windows也是不能保证原子性的。
参考 http://blogs.msdn.com/b/oldnewthing/archive/2013/09/13/10448736.aspx
2014-8-23 21:19
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
这些interlocked...函数都是封装一条lock ...的指令,保证了原子性

例如interlockedexchange64,封装的是lock cmpxchg8b

具体你看一下手册上
cmpxchg8b和cmpxchg16b的说明就好了
2014-8-23 21:38
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你为什么根本不看我说的话呢……
我说了x86/64上有LOCK前缀,应该问题不大,但是其它CPU上没有,还专门贴出了一个链接,里面有解释了interlocked函数的实现。而且msdn专门点出了那一句话,所以我觉得其它CPU上是无法保证这点的。
2014-8-23 21:50
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
这是msdn的说明:

Itanium-based systems:  For performance-critical applications, use InterlockedExchangeAcquire64 instead.

Note  This function is supported on Windows RT-based systems.

也就是说不仅支持x86/x64,Itanium和arm也是支持的
2014-8-23 21:56
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Remarks

The interlocked functions provide a simple mechanism for synchronizing access to a variable that is shared by multiple threads. This function is atomic with respect to calls to other interlocked functions.
This function is implemented using a compiler intrinsic where possible. For more information, see the WinBase.h header file and _InterlockedExchange.
This function generates a full memory barrier (or fence) to ensure that memory operations are completed in order.
Itanium-based systems:  For performance-critical applications, use InterlockedExchangeAcquire instead.
Note  This function is supported on Windows RT-based systems.
2014-8-23 22:55
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
好吧,我看了一下那个blog,在其他非intel cpu上,是用LL/SC指令来实现interlocked,这个也是可以保证原子性的,即使其他的线程不通过interlocked系列函数来读写内存。

其实LL/SC还可以避免ABA问题
2014-8-23 23:09
0
雪    币: 433
活跃值: (1910)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
你们真牛逼...一般我都是判断下系统 然后配对系统的那五个字节就好了 ...
来装个B:
我看过许多hook保存前五个字节的方法,却依旧过不好这一生。
2014-8-23 23:45
0
雪    币: 75
活跃值: (738)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
interlockxxx会锁地址总线,多cpu只有一个cpu能访问,而且硬件的pollin机制(忘了是不是这个名字了)会自动同步高速缓存,原子操作,放心使用
2014-8-25 18:56
0
游客
登录 | 注册 方可回帖
返回
//