挂钩Windows API和线程安全

时间:2015-12-10 14:10:08

标签: windows thread-safety hook patch

有许多方法可以挂钩Windows API。内联钩是其中之一 他们。也就是说,用a替换函数的前5个字节 跳远教学。有谈判和实施,到 确保程序的线程安全,通常他们会 修补时暂停所有线程。也就是说,做点什么 像这样:

threads = get_threads();
for (thread in threads) {
    suspend(thread);
}

我很困惑,我不认为这是安全的。因为线程可以 当你在循环中时,你可以在飞行中开始或停止 事情变了。不是吗(Q1)?

自Windows SP2以来,Windows API是热补丁。你也可以 通过传递/hotpatch来启用您自己的图像上的热补丁 flag(自VS2008起)。也就是说,编译器首先确保 函数的指令至少是两个字节。并放5或6 函数前的字节填充。填充字节可以是 用长跳转指令替换为重定向到新的 这个函数的版本,以及两个字节的指令都可以 用短跳转指令替换为重定向到long 在它之前跳转指令。

第二季:似乎我不需要暂停所有线程 替换前两个字节的指令(虽然我不知道 如何暂停所有线程的热补丁 功能,是吗?

问题3:我是否需要任何原子操作或内存栅栏或易失性或 确保更换是线程安全的东西?如果是的话,那样做 编译器确保每个函数的地址是aligned

0 个答案:

没有答案