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

问题描述

我希望开发一个“安全”的应用程序,并且为了缓解安全性,我希望能够发现当前正在运行的应用程序是否正在使用调试器(GDB,LLDB ...);如果检测到则中止。

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

  • 步行/ proc树
  • ...

解决方法

一个疯狂的主意-加载BPF程序(假设您的二进制文件具有执行此功能的能力),以拦截来自进程父进程的ptrace系统调用,并检查所跟踪的进程的pid是否与您的进程的pid匹配,那么您可以使系统调用失败,阻止调试,并向用户空间发送和事件以停止进程。

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

,

另一个疯狂的想法-跟踪器期望每个断点/步骤上的跟踪都包含SIGTRAP,因此您可以再次使用BPF从过程中捕获此信号,并对其进行处理。但是同样,它基于跟踪器不知道的假设。

,

不能。软件无法检测它是在完美的仿真环境中运行还是在现实世界中运行。而且可以停止模拟器,可以分析软件,可以更改变量,基本上所有事情都可以在调试器中完成。

让我们说您要检测父进程是否是调试器。因此,您进行系统调用以获取父PID?调试器可以拦截系统调用并返回任何非必须为真实PID的PID。您想拦截每个SIGTRAP,以便调试器不能再使用它了吗?好了,调试器可以在这种情况下停止并将SIGTRAP发送到您的进程。 您想测量发送SIGTRAP的时间,以了解调试器是否在短时间内停止了发送SIGTRAP的过程,以便您知道何时有调试器?调试器可以替换您的调用以获取时间并返回假时间。假设您在具有返回时间的指令的处理器上运行,因此不需要任何函数调用即可获取时间。现在您可以知道自己获得的时间是真实的吗?否,调试器可以将其替换为SIGTRAP指令,并在需要时返回它,或者在不存在该指令的情况下,可以在可以用任何方式编程的仿真器中运行软件。您为检测调试器或仿真器而想出的一切都可能被环境伪造,并且您需要进行0次更改来检测它。

停止调试的唯一方法是不将软件提供给客户,而是将其掌握在手中。进行云服务并在服务器上运行该软件。在这种情况下,客户无法调试您的程序,因为他没有运行该程序并且无法控制它。除了客户可以以某种方式访问​​服务器或数据,但这是另一回事。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...