• 某游戏的反调试


    最近比较无聊,有朋友就喊我去玩玩打枪的小游戏,然后由于我怕麻烦所以把游戏安装到虚拟机中了,然后我虚拟机开了双机调试器,其实是由于我比较懒不想关双机调试,导致游戏弹出窗口要求我关闭调试器。

    小样,你叫我关就关岂不是很没有面子,然后我做了下面的事情。

    首先看是不是检测了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);
    }

    然后就没有然后了,游戏加载起来了

  • 相关阅读:
    Cocos2dx-Android屏幕适配方案
    Cocos2dx-Mac下的环境配置
    Cocos2dx-C++和Lua数据通讯
    Cocos2dx-Lua与C++混合使用
    安装宝塔面板
    nginx配置ssl安全证书
    在nginx上运行spring
    spring在服务器上的启动和关闭jar包
    idea常用插件
    maven打包war
  • 原文地址:https://www.cnblogs.com/csnd/p/16675607.html
Copyright © 2020-2023  润新知