2

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

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

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

编辑:
实际上我有一个硬件安全令牌。我想保护我的应用不被复制。但是我听说使用令牌进行简单的真/假检查会被调试应用程序破坏

4

5 回答 5

13

总会有办法绕过你实施的任何保护措施,你唯一能做的就是让它变得足够困难,以至于任何攻击者都会感到沮丧,并宣称不值得花时间尝试对你的软件进行逆向工程。这只是你值得花多少时间/金钱来阻止那个额外的人尝试的问题

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

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

  • 混淆你的代码
  • 检测当前是否正在运行常用的调试软件(Visual Studio、OllyDbg、IDA 等...)
  • 支付/提高专家顾问的费用来查看您的代码,并使没有源代码的人更难调试。

其中一些解决方案(例如检测调试器是否正在运行)可能会激怒将调试器用于其他软件但没有尝试在您的软件上使用它的合法用户,因此您需要权衡成本。

于 2013-08-17T06:56:44.623 回答
12

任何人都可以看到您使用此功能,从 Dumpbin.exe /imports 中可以轻松看到。一个简单的 api 钩子消除了它。所以,不,这完全不值得麻烦。唯一会被它拖慢的是,当你有一天需要附加调试器来解决问题时,你会被自己的对策打败。

如果您真的关心这一点,那么只需将钱花在反逆向工程软件产品上即可。像犰狳这样的东西,有很多。他们使用不止一种方法来检查调试器,技术当然是商业秘密。他们还将挫败拆卸尝试。

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

于 2013-08-17T08:59:53.333 回答
4

假设函数是完美的。它始终提供准确的答案,攻击者无法改变这一点。让我们假装是这样。

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

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

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

于 2013-08-17T09:07:07.460 回答
3

我个人建议不要出于复制保护的目的使用一般的反调试功能,除非你有一个真正令人信服和可证明的理由这样做。

一方面,您在实际复制保护方面收获甚微(那些在复制保护方案(包括反调试技巧)上花费巨资的公司,通常会在发布后的数小时内在 torrent 网站上找到他们的破解软件。)

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

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

话虽如此,回答您的问题 - 不,IsDebuggerPresent 不安全。这不是故意的,因为它的目的不是阻止调试,它的目的是帮助调试。即,如果存在调试器,则发布模式软件会输出调试字符串,但如果不存在,则不要浪费任何执行时间来尝试这样做。

于 2013-08-17T09:20:32.383 回答
2

请注意,就许多国家/地区的立法而言,在我自己做的事情之前,一旦我获得了使用许可,就由我来决定如何使用。法律明确规定添加其他条件或限制是不合法的,添加这些条件的许可无效。

如果我有你的许可证和调试器许可证以及操作系统许可证,你无权禁止我分析你的软件是如何工作的。如果我想生产另一个与你的软件交互的软件,我完全有权这样做,直到我在销售我的产品时使用的许可证成为你的产品和许可证的先决条件。

甚至可以合法地要求删除这些技巧(检查我的计算机上正在运行的软件以确定您是否可以运行,这侵犯了我的隐私:我有权运行我被许可使用的任何软件。在法国、意大利和德国,已经有类似案件的定罪判决:如果我有你的许可证并且你的软件拒绝启动,我有完全的权利要求退款,我也可以要求退还你的入侵造成的“精神损失”在我的系统上制作的软件。有些公司被判数十亿欧元的损失!)。

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

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

于 2013-08-17T07:54:28.397 回答