.net下有一款强大的反调试利器:dnspy
可以直接调试编译出来的.exe程序,查看内存中的值,甚至直接修改源代码;
那么我们的程序如何检测到自己正在被调试呢?
在windows中,用户进程全部由任务管理程序“explorer”启动:即 无论双击快捷方式还是cmd/bat命令启动,该进程的父进程都是
“explorer”
所以,一个简单的反调试方法是检测当前进程的父进程是否是“explorer”,如果不是,则退出程序,或 执行其他脑洞大开的操作!
//main方法或者单独使用一个线程
//保险起见,同时检测explorer的父进程是否为null
Process Parent= GetParentProcess();
Process Grandpa= ParentProcessUtilities.GetParentProcess(Parent.Handle);
if (Grandpa!= null || !Parent.ProcessName.ToLower().Contains("explorer"))
Environment.Exit(0);//直接退出
效果:在dnspy调试时直接退出!
如果传入null参数,则调试时抛异常
Environment.Exit(null);//抛异常