反调试记录

遇到的反调试就记录一下,有些具体内部原理的话有时间再来补。(感觉多半不会坚持记录下去,hhh

NtQueryInformationProcess函数

1
2
3
4
5
6
7
8
9
10
11
12
typedef NTSTATUS (WINAPI *NtQueryInformationProcessPtr)(

HANDLE processHandle, //进程句柄

PROCESSINFOCLASS processInformationClass, //信息类型

PVOID processInformation, //缓冲区,函数返回值存入的地址空间。

ULONG processInformationLength, //缓冲区的大小

PULONG returnLength);
//当第二个参数为7时可以用来查看进程的调试端口。当进程被调试时返回-1,否则返回其它值。

另外由于这是一个未公开的API,所以我们需要使用LoadLibrary和GetProceAddress的方法获取调用地址。这里贴上遇到的程序中使用这个函数来检测调试的实例:

image-20201105170711386

所以执行完这个函数,可以根据dword_404468的值判断进程是否处于调试。

NtSetInformationThread函数

与上面一个函数类似的用法,也需要使用LoadLibrary和GetProceAddress的方法获取调用地址。

image-20201105171431630

调用这个函数时,如果在第二个参数里指定0x11这个值(意思是ThreadHideFromDebugger),等于告诉操作系统,将所有附加的调试器统统取消掉,即退出调试状态。

IsProcessorFeaturePresent函数

image-20201105172140986

CheckRemoteDebuggerPresent

CheckRemoteDebuggerPresent实际上调用了ntdll里面的ZwQueryInformationProcess来检测,和上面记录的第一个函数一样,其第二个参数是7,被定义为ProcessDebugPort。

它不仅可以探测系统其他进程是否被调试,通过传递自身进程句柄还可以探测自身是否被调试。

1
2
3
4
5
6
7
BOOL CheckDebug()  
{
BOOL ret;
CheckRemoteDebuggerPresent(GetCurrentProcess(), &ret);
return ret;
}
//如果有调试器存在则ret的值为非0

时钟检测(rdtsc)

这个反调试主要就是检查2个指令执行之间相差的时间,如果我们调试单步执行的时间肯定是大于正常时间的。

对抗这种反调试,可以打patch,也可以把断点下在它后面,具体还是情况而定。

一个实例,通过在它后面下断对抗。

image-20201213172904993

-------------本文结束感谢您的阅读-------------