这种API挂钩法为什么有不可解决的线程同步问题
2.挂钩过程
(1 )在内存中寻址要挂钩的 API 函数。
(2 )保存这个函数的前 8 字节。
(3 )使用上面构建的机器码重写这个函数的前 8 字节。自定义函数必须和挂钩的函数有
完全相同的签名:所有的参数必须相同,返回值必须相同,调用规则必须相同。
(4 )现在,当一个线程调用这个挂钩函数时,JUMP 指令会跳转到自定义的函数。这个
时候可以执行任何代码。
(5 )恢复在第 2 步保存的字节,将它们放回挂钩函数开头,以便取消挂钩。
(6 )调用这个被挂钩的函数(此时挂钩已经取消),此函数正常执行。
(7 )当原来的函数返回时,执行第 2 和第3 步,再次挂钩这个 API,以便自定义的函数
在未来会被调用。
显然,上述过程有着不可解决的线程同步问题,但是这种方法对挂钩单线程使用的API
还是相当有效的。
“上述过程有着不可解决的线程同步问题”这句话不理解,怎么就有这个问题了
[解决办法]
这个不会,改对齐的4字节可以做成原子操作
就算这里不能一次完成也不要紧,因为这个修改只用作一次,你楼顶说的覆盖每次调用都得做