最近比较无聊,有朋友就喊我去玩玩打枪的小游戏,然后由于我怕麻烦所以把游戏安装到虚拟机中了,然后我虚拟机开了双机调试器,其实是由于我比较懒不想关双机调试,导致游戏弹出窗口要求我关闭调试器。
小样,你叫我关就关岂不是很没有面子,然后我做了下面的事情。
首先看是不是检测了SharedUserData->KdDebuggerEnabled
这里手动在windbg修改KUSER_SHARED_DATA 的KdDebuggerEnabled,如下图
修改的命令是eb 0xFFFFF780`00000000+0x2d4 0
然后继续看有木有变化,发现没有变化,还是一样的弹出来,后来在ntloaddriver下一个断点看看,发现就没有加载驱动,算了,那就直接hook NtQueryInformationThread、NtQuerySystemInformation、NtQueryObject这三个都是反调试的常见函数相信对反调试有了解的都知道,我这里是在内核中hook的,代码是cv的抄的titanhide,也是github上的一个项目。
还真是用的api去做的反调试,之后又用了单步来过反调试,(原理是由于调试器handle了单步异常,就不会发给异常处理函数,异常处理函数接收不到代表有调试器)如下图
这个解决方法也很简单hook KdpTrap在这里面直接过滤异常,代码如下
NTSTATUS HookKdpTrap(
IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PEXCEPTION_RECORD ExceptionRecord,
IN PCONTEXT ContextRecord,
IN KPROCESSOR_MODE PreviousMode,
IN BOOLEAN SecondChanceException){
PEPROCESS hp = PsGetCurrentProcess();
//TASLogin
//这里判单是不是单步异常 0x4000001E
if (!_stricmp((char *)PsGetProcessImageFileName(hp), "hyxd.exe")&& ExceptionRecord->ExceptionCode== 0x4000001E){
return STATUS_SUCCESS;
}
return hdbktrap(TrapFrame, ExceptionFrame, ExceptionRecord, ContextRecord, PreviousMode, SecondChanceException);
}
然后就没有然后了,游戏加载起来了