当我用 jmp opcode 覆盖函数的第一个操作码时,我实际上是在写 5 个字节(或 jmp 短的 2 个字节)。但是如果另一个线程(来自同一个进程)在我更改它时会调用这个函数怎么办?这将导致意外行为。但我没有找到任何解释。上钩的文章就可以了,好像没有问题。
也许在 win32api 中,您使用 mov edi,edi 有 nops 的事实。但我的问题更具理论性
谢谢
当我用 jmp opcode 覆盖函数的第一个操作码时,我实际上是在写 5 个字节(或 jmp 短的 2 个字节)。但是如果另一个线程(来自同一个进程)在我更改它时会调用这个函数怎么办?这将导致意外行为。但我没有找到任何解释。上钩的文章就可以了,好像没有问题。
也许在 win32api 中,您使用 mov edi,edi 有 nops 的事实。但我的问题更具理论性
谢谢
如果您注入特定进程,您可以暂停该进程,安装所有挂钩并在此之后继续。
很有可能引起问题。您可以在要更改的代码上创建一个临界区,并进入临界区以确保在更改代码时独占访问。
在相互访问的情况下,执行线程可以(理论上)看到第一个字节,并将继续在接下来的 4 个字节上执行跳转(在长跳转的情况下)。在调用的情况下,下一条指令 (IP) 在跳转之前被推送,即 current + 5。理论上,aret
可能导致该线程运行到未修改的指令中(例如,您可能需要一个 nop)。
这都是理论上的,但是您应该在更改代码时防止相互访问。