C 在调试器下

C 在调试器下,c,debugging,gdb,posix,C,Debugging,Gdb,Posix,我如何在程序中检测到它正在调试器下运行?我知道这似乎表明我试图做一些我不应该做的事情,这太混乱了。我认为这是一个有趣的问题。具体来说,有没有一种方法可以在POSIX环境中实现这一点?例如,使用sigaction(2)来检测是否安装了某个处理程序?更糟糕的想法;是否有一些内联汇编代码可以在x86体系结构上使用 正如我们所讨论的——是否最终有可能启动一个调试器,如gdb(1),并在执行此可能的攻击的地方中断。感谢您提供的任何不干净的单行线或与此相关的标准参考。是否有帮助 除其他事项外,它还建议:

我如何在程序中检测到它正在调试器下运行?我知道这似乎表明我试图做一些我不应该做的事情,这太混乱了。我认为这是一个有趣的问题。具体来说,有没有一种方法可以在POSIX环境中实现这一点?例如,使用sigaction(2)来检测是否安装了某个处理程序?更糟糕的想法;是否有一些内联汇编代码可以在x86体系结构上使用

正如我们所讨论的——是否最终有可能启动一个调试器,如gdb(1),并在执行此可能的攻击的地方中断。感谢您提供的任何不干净的单行线或与此相关的标准参考。

是否有帮助

除其他事项外,它还建议:

  • 从父进程泄漏的文件描述符
  • 环境变量(美元)
  • 进程状态(
    getsid()
    等)
请注意,其中大多数(如果不是全部的话)依赖于生成被调试进程的调试器。如果将调试器附加到已在运行的进程上,则调试器的效果就不太好。

是否有帮助

除其他事项外,它还建议:

  • 从父进程泄漏的文件描述符
  • 环境变量(美元)
  • 进程状态(
    getsid()
    等)

请注意,其中大多数(如果不是全部的话)依赖于生成被调试进程的调试器。如果调试器附加到已在运行的进程上,那么它们就不会那么有效。

没有可靠的方法检测到您正在调试器下运行。这是因为调试器可以使用任意数量的方法来实际调试代码,其中一些方法几乎肯定不会被您的方法捕获


我的问题是,你为什么会在意?除非您试图隐藏某些内容:-)

没有可靠的方法检测您是否在调试器下运行。这是因为调试器可以使用任意数量的方法来实际调试代码,其中一些方法几乎肯定不会被您的方法捕获


我的问题是,你为什么会在意?除非你试图隐藏一些东西:-)

我知道你提到这不是你应该做的事情,但是出于好奇,你为什么要这样做?我知道你提到这不是你应该做的事情,但是出于好奇,你为什么要这样做?似乎启发式(getsid()!=getppid()&&!getenv(“”)这篇文章所暗示的是错误的。但它给了我一个大致的情况;没有稳定的方法可以做到这一点。到目前为止,我发现最好的方法是检查以“/gdb”结尾的$。谢谢这篇文章暗示的启发式(getsid()!=getppid()&&!getenv(“”))今天似乎是错误的。但它给了我一个大致的情况;没有稳定的方法可以做到这一点。到目前为止,我发现最好的方法是检查以“/gdb”结尾的$。谢谢我没有隐瞒任何事情。有几次,我认为在我的程序中自动设置断点会很好,以防有调试器在我身上。但在困难时期,我更想要的是从我的守护进程中产生一个gdb(1),将它连接到我的守护进程,并作为其stdio连接到某个本地TCP端口。我将在该端口上等待开始会话。假设在这个过程中出现了一个只发生在生产网络中的损坏的不变量。我模糊地记得xdb(我刚才使用的另一个调试器)是可编写脚本的(加载程序、设置断点、运行等等)。这可能是一种自动执行的方法,尽管是通过调试器而不是您的程序。如果您有一个用SIGALRM实现的内置看门狗,并且您想在调试时禁用它,该怎么办?我没有隐藏任何东西。有几次,我认为在我的程序中自动设置断点会很好,以防有调试器在我身上。但在困难时期,我更想要的是从我的守护进程中产生一个gdb(1),将它连接到我的守护进程,并作为其stdio连接到某个本地TCP端口。我将在该端口上等待开始会话。假设在这个过程中出现了一个只发生在生产网络中的损坏的不变量。我模糊地记得xdb(我刚才使用的另一个调试器)是可编写脚本的(加载程序、设置断点、运行等等)。这可能是一种自动执行的方法,尽管是由调试器而不是程序执行。如果您有一个用SIGALRM实现的内置看门狗,并且您希望在调试时禁用它,该怎么办?