当我用jmp操作码覆盖函数的第一个操作码时,我实际上写的是5个字节(或者对于jmp short来说是2个)。 但是,如果另一个线程(来自同一个进程)将在我更改它时调用此函数,该怎么办? 这将导致意外行为。 但我没有找到任何解释。挂钩的物品就像它没有问题一样。
也许在win32api中你可以使用带有mov edi,edi的nops这一事实。但我的问题更具理论性
感谢
答案 0 :(得分:1)
很有可能引发问题。您可以在更改代码上创建关键部分,并输入关键部分以确保在更改代码时可以独占访问。
在相互访问的情况下,执行线程可以(理论上)看到第一个字节,并继续在接下来的4个字节上执行跳转(如果是长跳转)。在调用的情况下,下一条指令(IP)在跳转之前被推送,那是当前的+ 5.理论上,ret
可能导致该线程遇到未修改的指令(你可能需要一个nop) ,例如)。
这完全是理论上的,但您应该在更改代码时阻止相互访问。
答案 1 :(得分:1)
如果您注入特定进程,则可以暂停该进程,安装所有挂钩并在此之后继续。