【问题标题】:How can I obfuscate a test in code to prevent tampering with response processing?如何混淆代码中的测试以防止篡改响应处理?
【发布时间】:2010-12-25 19:43:58
【问题描述】:

我正在寻找一种方法来混淆(在目标代码中)测试 - 类似于检查许可证密钥是否有效的方法。我试图阻止的是有人在图像二进制文件中搜索处理响应的代码。

bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
   // process response
}

这是一个简单的例子,但不是推荐的方法:

int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1

//later (delayed execution of response)
if ( check % 71 )
{
   //process response
}

编辑: 澄清一下,实际测试已经完成,我得到了通过/失败的回报。我的响应处理将是一个基本的 jmp,并且会对如何混淆 jmp 的位置的指针感兴趣。

【问题讨论】:

  • 您当然应该知道,这不是一个小问题。像微软这样的大型软件公司花费数百万美元试图阻止人们绕过他们的保护,但人们仍然设法绕过他们的努力。
  • @Charles Salvia:这是真的。我不只是从这个问题中寻找保护程度。 ;) 然而,这是我第一次尝试这样的方式,我不得不承认我不知道从哪里开始。
  • Macrovision 甚至购买了 InstallShield 以支持复制保护软件。但它并没有真正停止任何事情。硬件加密狗已经变得非常罕见,因为它们也没有做太多事情(一切总是最终归结为软件,此时它变得可破解)。 SlySoft 会定期将泄露的密钥列入黑名单,但其他人会在每次发布时不断发布新密钥。我发现混淆最适合娱乐(比如比赛),而不是真正的版权保护。

标签: c++


【解决方案1】:

Secure Programming Cookbook (O'Reilly) 有一整章是关于防篡改的(实际的书有这一章,不确定网站上有什么)。整洁的东西。

【讨论】:

    【解决方案2】:

    您可能会通过将支票撒在各处导致崩溃:

    T* data = (T*) new char[sizeof(T) * (check() ? 1 : 0)]
    array[i + 1 * (check() ? 0 : 42)].doStuff();
    

    在 Gamasutra 上有一篇关于 crack protection in Spyro 的不错的文章,它做了类似的事情,然后通过使游戏不崩溃而更进一步,只是工作越来越差。 (你从不击中敌人,你走得更慢,某些关键物体随机消失等等)

    适合所有程序员的有趣阅读,也许对您有用。

    【讨论】:

      【解决方案3】:

      一种方法是将执行许可证检查的代码放入单独的 DLL 中。在主应用程序中,在运行时加载 DLL 并计算 DLL 本身的校验和。该应用程序存储使用构建的 DLL 计算的校验和。如果校验和不匹配,您有几个选项,显示错误版本消息 - 有点明显;不要调用许可证检查 - 不太明显,但当攻击者想知道为什么不调用许可证检查时会注意到;调用一个与真正的许可证检查函数名称相似的函数。

      将其视为使用公钥加密。使用公钥作为配置的一部分,并在应用程序中内置私钥。如果他们弄乱了公钥,应用程序的数字签名将以可检测的方式受到损害。

      我同意@camccann 的观点,这将有助于理解您所期望的攻击类型。作为最后的手段,将许可证检查拆分为尽可能多的部分,以通过更改单个分支点使其更难绕过。

      [编辑]

      另一个想法是使用状态机。请参阅this question 的最佳答案中的命令结构示例。将许可证检查的评估以哈希查找的形式进行,并将一组虚拟函数调用与正确的数组一起放入一个数组中。将许可证检查评估为适当函数的表/哈希查找的决策代码看起来不像您的典型

      if(){ pass;} else { fail; } 
      

      构造。

      两个好处,
      1) 没有可绕过的布尔条件和
      2) 他们不能在不知道要传递控制的函数的地址/名称的情况下执行简单的 JMP 指令。

      SO thread on a state machine turorial.
      SO thread on state machine implementations

      【讨论】:

      • 不幸的是,我觉得这错过了 OP 关注的领域。他并不太担心检查许可证的实际过程。相反,他得到了一个表示通过/失败的布尔值,并且需要根据该条件操作特定的代码。然而,这归结为程序集中的一个非常简单的 jmp,如果他们知道它在哪里,一个简单的十六进制编辑器可以相当简单地颠覆条件检查。他想混淆这个 jmp(if 语句)的位置,而不是实际的许可证检查本身。
      • @Kelly French:谢谢!这与我正在寻找的内容一致。 :)
      • 我喜欢使用状态机技术的想法。
      【解决方案4】:

      混淆不会阻止,只会阻止。一个足够熟练和坚定的攻击者总是能够绕过你使用的任何混淆,所以你首先需要知道的是:你想在这里阻挠什么样的人?

      【讨论】:

      • 感谢您做出这样的区分。我应该在我的问题中说“沮丧”。我试图阻止的人可能是新手攻击者,因为更有经验的人很可能会找到一种方法来绕过一些最棘手的方法。
      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多