0

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

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

  • 遍历 /proc 树
  • ...
4

3 回答 3

0

另一个疯狂的想法 - tracerSIGTRAP在每个断点/步骤上都需要来自 tracee 的 s,因此您可以再次使用 BPF 从您的进程中捕获此信号,并对其进行处理。但它再次基于跟踪器不知道它的假设。

于 2020-10-07T14:21:43.557 回答
0

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

假设您想检测父进程是否是调试器。所以你做一个系统调用来获取父PID?调试器可以拦截系统调用并返回任何不必是真实 PID 的 PID。你想拦截每一个SIGTRAP,这样调试器就不能再使用它了吗?那么调试器可以在这种情况下停止并将其SIGTRAP也发送到您的进程。您想测量发送的时间,SIGTRAP以了解进程是否由调试器短暂停止以进行发送SIGTRAP所以你知道什么时候有调试器?调试器可以替换您的调用以获取时间并返回假时间。假设您在具有返回时间的指令的处理器上运行,因此不需要函数调用来获取时间。现在你可以知道你得到的时间是真实的吗?不,调试器可以用一条指令替换这条指令,SIGTRAP并在他想要的任何时候返回,或者如果这样的指令不存在,在可以以任何方式编程的仿真器中运行软件。您可以想出的用于检测调试器或仿真器的所有内容都可能被环境伪造,并且您只需进行 0 次更改即可检测到它。

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

于 2020-10-08T11:43:55.103 回答
0

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

虽然它不适用于附加进程,所以你需要拦截ptrace所有进程,我不确定 BPF 是否允许,不记得了。

于 2020-10-07T10:45:29.633 回答