IsDebuggerPresent()函数是否是一种安全方法来阻止进程被调试?

时间:2013-08-17 06:51:36

标签: c++ winapi

我不想让我的程序调试过。我有第二个线程,它反复检查是否附加了调试器:

while(1){
    BOOL isDebugged = IsDebuggerPresent();
    if(isDebugged){
          //exit from my app
    }
    //and then check CheckRemoteDebuggerPresent()
}

我想知道这种方法是否安全?即使有这种保护,有人可以调试我的应用吗?还有更好的办法吗?

编辑:
实际上我有一个硬件安全令牌。我想保护我的应用不被复制。但我听说通过调试应用程序

可以打破使用令牌的简单真/假检查

5 个答案:

答案 0 :(得分:12)

总会有办法绕过你实施的任何保护,你唯一能做的就是让任何攻击者都感到非常沮丧,并宣称不值得花时间试图逆转你的软件。这只是一个问题你需要花多少时间/金钱才能让那个额外的人不再尝试

如果只检查IsDebuggerPresent是否安全,请回答?我已经绕过软件中的确切安全措施,我不得不通过使用OllyDbg反编译代码来查找IsDebuggerPresent函数的任何导入并修补exe而只是返回false,它绕过了我的软件。 15分钟左右的保护。在逆向工程中“经验丰富”的人可能会在5年内完成。

你唯一能做的就是“提高标准”以防止你的程序被逆向设计,这里有一些建议:

  • 模糊您的代码
  • 检测当前正在运行的常用调试软件(Visual Studio,OllyDbg,IDA等等)
  • 支付/提高专家顾问的意见,以查看您的代码,并使那些没有源代码的人更难调试。

其中一些解决方案(如检测调试器是否正在运行)可能会使那些使用调试器用于其他软件但又不想在您的软件上使用它的合法用户感到沮丧,因此您需要权衡成本。

答案 1 :(得分:11)

任何人都可以看到你使用这个功能,从Dumpbin.exe / imports中可以看到它。一个简单的api钩子消除了它。所以,不,这完全不值得麻烦。唯一会被它放慢速度的是,当你需要在某天连接调试器来解决问题时,你会被自己的反措施打败。

如果您真的关心这一点,那么就把钱花在反逆向工程软件产品上。像犰狳这样的东西,有很多。他们使用多种方法来检查调试器,技术当然是一个交易秘密。他们也会击败反汇编企图。

不要忽视这个的实际成本。我个人不得不在我每天工作的产品中处理这种软件。媒体编解码器的许可执行方案和视频点播下载的DRM。称他们为PITA与我们不得不处理它们所经历的痛苦和痛苦并不完全相符。特别是反调试技术很痛苦,在尝试调试应用程序时会抛出无法捕获的异常。所以这些东西不会被调试,并且是一个永无止境的错误和破坏的来源。我们得到的第一次机会刚刚消除了更具侵略性的东西,每个人都有机会,完全打败了意图。 DRM软件中的一个崩溃错误由我完全诊断并提供了修复它的具体建议,需要一年半的时间来实际修复。 DRM特别无效,我最近计算出维护它的成本可以通过给每个下载电影的人免费赠送五美元礼券来摊销。这只是行不通。

答案 2 :(得分:3)

假设该功能完美。它始终提供准确的答案,攻击者无法做任何改变。让我们假装是这样的。

那么,好吧。攻击者显然拥有进程的调试权限,这意味着他们可以编辑进程的内存。所以他们只是改变通常调用该指令的指令,调用一个总是返回false的虚函数。

如果我可以将调试器附加到您的进程,那么这意味着我对您的进程内存具有读写权限,这意味着我可以随心所欲地使用它。你无能为力。

如果您想避免人们将调试程序附加到您的进程,那么您必须在您控制的计算机上运行它,用户可以使用具有有限权限的帐户登录。操作系统决定是否允许用户弄乱进程的内存。如果操作系统确定用户具有该权限,则用户具有该权限,并且他能够使用它。

答案 3 :(得分:3)

我个人建议不要使用一般的反调试功能来保护副本,除非你有一个非常有说服力和可证明的理由。

一方面,在实际的复制保护方面,你将获得很少的收益(那些在复制保护方案上花费很多钱的公司,包括反调试技巧,在发布后的几小时内经常在torrent网站上找到他们破解的软件。)

另一方面,您将限制产品的实用性。大多数最好的软件产品都是可扩展的,这意味着用户可以为它们创建插件,或者将它们与其他软件链接起来,以便在原作者的愿景之外以有趣的方式使用。这些用户在执行此操作时能够调试他们的工作是至关重要的,这通常意味着他们需要一个附加到您的流程的调试器,即使他们没有尝试调试您的代码。

现在我并不是说复制保护不值得追求,但是还有许多其他方法可以阻止用户连接调试器。还有其他合理的理由想要防止调试 - 例如保护在线游戏中的反作弊措施,但你应该确保你有充分的理由使用它。在大多数情况下,混淆和自我监控代码将是你最好的选择,任何能够破解它的人都会发现打破大多数反调试技巧也很容易。

话虽如此,回答你的问题 - 不,IsDebuggerPresent不安全。它并不意味着,因为它的目的不是防止调试,它的目的是帮助调试。即,对于释放模式软件,如果存在调试器,则输出调试字符串,但如果不存在则不浪费任何执行时间。

答案 4 :(得分:2)

请注意 - 到目前为止,许多国家/地区的法律都有效 - 直到我自己做的事情,一旦我获得使用许可,我应该决定如何使用。法律明确规定,添加其他条件或限制是不合法的,添加这些条件的许可证无效。

如果我拥有您的许可证和调试器许可证以及操作系统许可证,则您无权禁止我分析您的软件的工作方式。如果我想生产另一种与您互动的软件,我有权这样做,直到我用于销售我的产品的许可证产生您的产品和许可证先决条件。

甚至可以合法地要求删除这些技巧(检查我的计算机上运行的软件以确定您是否可以运行是违反我的隐私的:我有权运行任何我获得许可的软件在法国,意大利和德国,已经有类似案件被判有罪:如果我有你的执照并且你的软件拒绝开始,我有权获得退款,我也可以要求退还“精神损害赔偿金”。您的软件侵入我的系统。有些公司被判处10亿欧元的损失!)。

将这些可能性视为“成本”的一部分,并评估是否存在“业务案例”。

故事的道德:如果您不信任您的用户,您的用户为什么要信任您?如果我公司的IT部门在产品中发现这些技巧,那么只会将该产品从其内部产品组合中删除。这对您来说是潜在的商业损失。这也是需要考虑的另一件事。