【问题标题】:Detect if debugger is in use during runtime检测运行时是否正在使用调试器
【发布时间】:2020-10-07 10:16:12
【问题描述】:

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

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

  • 遍历 /proc 树
  • ...

【问题讨论】:

  • FWIW,你只会阻止那些不知道自己在做什么的人。当您让某人在他们的计算机上运行某些东西时,他们能够准确地弄清楚您的代码在做什么。这是他们的内核、他们的库和他们的硬件。你可以让它变得更难,但你无法阻止它。
  • 一个软件在数学上不可能检测它是否在一个完美的仿真器中运行,无论是否在调试器中。你想要的都是不可能的。
  • 使程序更难调试并不会提高安全性,反之亦然。越难调试,就越不容易发现安全漏洞。我建议您在开发安全敏感的应用程序之前学习更多基础知识。
  • 安全关乎层级,很难阻止一个坚定的人,但这本身并不是没有任何限制的借口。很有可能确定一个进程是否已被调试器分叉,并在这种情况下关闭应用程序......这是一层防御,一个权宜之计,而不是治愈。
  • @BenCrowhurst 不,这是不可能的。调试器可以告诉您的软件任何事情,而软件无法检测到这是否是伪造的。这不仅困难,而且是不可能的。试图限制所有者对您的软件做某事是不可能的。看来您正试图通过默默无闻来实现安全性。请停止你正在尝试做的事情。你不明白你在做什么。

标签: c linux debugging secure-coding piracy-prevention


【解决方案1】:

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

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

【讨论】:

  • 不错的思路,我会深入研究一下。
  • 你如何确保子进程没有被调试器替换,当子进程调用pid()时,调试器拦截调用并返回它自己的pid?你试图解决一个数学上无法解决的“问题”。
  • @12431234123412341234123 标准调试器,如 gdb,不会这样做。
  • @qrdl 您可以使用 GDB 拦截调用并更改变量,还可以使用 GDB 更改二进制文件并替换函数,这样您就可以在 GDB 中完成这项工作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2011-06-12
      • 1970-01-01
      • 2017-11-06
      • 2019-11-22
      • 1970-01-01
      • 2014-09-01
      • 2011-05-04
      • 2012-01-20
      相关资源
      最近更新 更多