11.4.5 击败“杀手(Killer)”线程
如果这个定时监视器线程在运行的话,我们就很难对Defender实施调试了,因为它一旦感知到有调试器拖延了程序的执行时间,它就会把进程终止掉。为了继续我们的破解过程,你必须使这个线程无效。一种办法是避开调用这个创建函数,另一种更简单的方法是在内存中对线程创建函数进行修补(当然是在函数被解码之后),让函数永远调用不到NtTerminateProcess函数。修补需要对函数作两处修改:第一处是用NOPs替换00403075处的JNZ指令(这里测试了减法运算结果的高32位是不是零);第二处是用JMP替换地址0040307E处的JNZ指令。这样,修改后的代码就变成这样了:
这也就是说,不管两次执行RDTSC指令之间的间隔时间多长,这个函数都不会调用到NtTerminateProcess。将这个修补保存到可执行文件中,这样以后就不必在每次运行程序的时候都重新实施这个修补了。不过需要指出的是,这里可没那么容易让你保存修补,因为这个函数是加了密的——你必须或者直接修改加密数据、或者把所有有关加密的东西都统统清除。这两种方法都不容易,所以,暂时你还是将就着不厌其烦地在每次启动程序的时候在内存中重新实施一次修补吧。