我想知道这怎么可能。
我在 TLS 回调函数中发现了调试器检测 - 经过一些检查后有条件跳转。
当我用调试器跳过它并修改 ZF 标志以绕过检测时,一切正常。但是,当我尝试将此跳转修补到相反的(jne 到 je)应用程序时,应用程序冻结并使用 OutputDebugString 轰炸我。
我不将补丁保存到文件中,而是在进程在内存中时修补它。
我对如何检测这个补丁很感兴趣,所以我在我打补丁的字节上设置了硬件访问断点,然后运行它。断点没有命中,但应用程序改变了它的行为,就像我打补丁时一样。
请注意,代码流的差异与此检测无关,因为当我修改 ZF 标志应用程序工作正常。
所以我很困惑,当这个应用程序显然没有访问我修补的内存时,它如何检测该补丁?还是硬件访问断点不完美?我对一般想法感兴趣,您将如何在不击中硬件断点的情况下检测您的代码是否已打补丁。