c-检测调试器是否在运行时使用



我想开发一个;"安全";应用程序,作为一种安全缓解措施,我希望能够发现调试器(GDB、LLDB…(是否正在当前运行的应用程序上使用;如果检测到则中止。

如何检测对静态链接的C应用程序的监视?

  • 遍历/proc树

这只是一个疯狂的想法-加载BPF程序(假设您的二进制文件有能力这样做(来拦截来自进程父级的ptrace系统调用,并检查被跟踪进程的pid是否与进程的pid匹配,然后您可以使系统调用失败,阻止调试,并向用户空间发送和事件以停止进程。

虽然它不适用于附加的进程,所以您需要从所有进程中截取ptrace,但我不确定BPF是否允许,不记得了。

另一个疯狂的想法-tracer在每个断点/步骤上都期望tracee发出SIGTRAPs,所以你可以再次使用BPF从你的流程中捕捉到这个信号,并对此采取措施。但这也是基于tracer不知道的假设。

你不能。软件无法检测它是在完美的模拟中运行还是在现实世界中运行。模拟器可以停止,软件可以分析,变量可以更改,基本上一切都可以在调试器中完成。

假设您希望检测父进程是否是调试器。所以您进行系统调用以获取父PID?调试器可以拦截系统调用并返回任何PID,而不必是真正的PID。你想拦截每个SIGTRAP,这样调试器就不能再使用它了吗?在这种情况下,调试器可以停止并将SIGTRAP也发送到您的进程。您想测量发送SIGTRAP的时间,以了解发送SIGTRAP的调试器是否短时间停止进程,从而了解何时有调试器?调试器可以替换您的调用以获取时间并返回假时间。假设您在一个处理器上运行,该处理器有一条返回时间的指令,因此不需要函数调用来获取时间。现在你可以知道你得到的时间是真实的吗?不可以,调试器可以用SIGTRAP指令替换此指令,并随时返回,或者在不存在此类指令的情况下,在可以以任何方式编程的模拟器中运行软件。你能想到的所有检测调试器或模拟器的东西都可能被环境伪造,你有0个更改来检测它

停止调试的唯一方法是不把软件交给客户,而是把它留在自己手中。创建云服务并在服务器上运行软件。在这种情况下,客户无法调试您的程序,因为他不运行程序,也无法控制程序。除了客户可以以某种方式访问服务器或数据之外,这是另一回事。

最新更新