遇到的反调试就记录一下,有些具体内部原理的话有时间再来补。(感觉多半不会坚持记录下去,hhh
NtQueryInformationProcess函数
1 | typedef NTSTATUS (WINAPI *NtQueryInformationProcessPtr)( |
另外由于这是一个未公开的API,所以我们需要使用LoadLibrary和GetProceAddress的方法获取调用地址。这里贴上遇到的程序中使用这个函数来检测调试的实例:
所以执行完这个函数,可以根据dword_404468的值判断进程是否处于调试。
NtSetInformationThread函数
与上面一个函数类似的用法,也需要使用LoadLibrary和GetProceAddress的方法获取调用地址。
调用这个函数时,如果在第二个参数里指定0x11这个值(意思是ThreadHideFromDebugger),等于告诉操作系统,将所有附加的调试器统统取消掉,即退出调试状态。
IsProcessorFeaturePresent函数
CheckRemoteDebuggerPresent
CheckRemoteDebuggerPresent实际上调用了ntdll里面的ZwQueryInformationProcess来检测,和上面记录的第一个函数一样,其第二个参数是7,被定义为ProcessDebugPort。
它不仅可以探测系统其他进程是否被调试,通过传递自身进程句柄还可以探测自身是否被调试。
1 | BOOL CheckDebug() |
时钟检测(rdtsc)
这个反调试主要就是检查2个指令执行之间相差的时间,如果我们调试单步执行的时间肯定是大于正常时间的。
对抗这种反调试,可以打patch,也可以把断点下在它后面,具体还是情况而定。
一个实例,通过在它后面下断对抗。