混淆C ++应用程序代码重要吗?


11

在Java世界中,有时似乎是一个问题,但是C ++呢?有不同的解决方案吗?

我在考虑这样一个事实,即有人可以用同一库的不同版本替换特定操作系统的C ++库,但是充满了调试符号以了解我的代码的作用。使用标准库或流行库是一件好事吗?

在Windows下将某些dll库替换为该库的“调试版本”时,也会发生这种情况。首选静态编译更好吗?在商业应用程序中,我看到针对其应用程序的核心,它们静态地编译了所有内容,并且在大多数情况下,dll(通常是动态库)用于提供一些第三方技术,例如反盗版解决方案(我在许多游戏中都看到了这一点) ),GUI库(如Qt),OS库等。

静态编译是否等效于Java世界中的混淆处理?用更好的术语来说,这是保护代码的最佳,最实惠的解决方案吗?


4
请记住,不管你做什么,有人用太多时间就可以反混淆/反编译它
Zavior

13
许多编译器都带有/O混淆开关。有些甚至具有多层次的混淆,直至/O3;)
MSalters

@MSalters不,g ++有-O3;)
BЈовић2012年

@Zavior或简单地对其进行逆向工程。它甚至不需要二进制本身,只需对软件进行彻底的分析即可。
约翰·魏茨

Answers:


27

不要在失败的战斗上浪费时间

正如在C ++和其他语言的许多其他类似答案中指出的那样,这几乎没有用

进一步阅读

所选主题的相关阅读材料(并非全部都是C ++特有的,但适用一般原则):

StackExchange答案

文件

混淆名言:

最后,还有一个代码隐私问题。这是一个失败的原因。没有任何转换可以使坚定的黑客无法理解您的程序。事实证明,这适用于所有语言的所有程序,而JavaScript显然更是如此,因为它以源代码形式提供。混淆提供的隐私利益是一种幻想。如果您不希望别人看到您的程序,请拔下服务器的电源。- 道格拉斯·克罗克福德


决不?

我并不是说您不应该混淆,也没有任何充分的理由,但是我严重质疑在大多数情况下是否需要它以及其成本效益。

此外,在某些情况下,混淆是事实上的要求。例如,如果您编写病毒,那么混淆(显然是动态混淆)和程序复制能力一样,对于程序的生存是一件好事。但是,这几乎不构成“普通”案件。


我们曾经在需要许可的硬件加密狗中使用,以掩盖所有加密狗功能的调用-他们提供了执行此操作的工具。总是让我对他们的“保护”质量有些怀疑!
马丁·贝克特

@MartinBeckett:确实有点奇怪。
haylem

3

不,这不值得付出努力,我认为这完全没有必要。您提供的功能可能会猜测您调用的功能。

Java存在混淆器的原因是因为Java字节码和Java源代码之间的映射定义得很好,并且所有函数和成员变量的名称都存储在字节码中(无论它们是公共,私有还是受保护的) ),因此Java字节码解释器可以呈现一些通用的Java,对于未混淆的源代码,它可以很好地显示原始源代码的结构。

C ++直接编译为机器语言。它可以反汇编,但是汇编语言要处理起来很繁琐。由于优化程序在编译过程中对代码进行的所有更改,因此反编译非常棘手。


0

考虑到这一点,存在几种不同类型的混淆。让我们开始混淆源代码,这完全是浪费时间。没有它,很难理解!因此,让我们专注于混淆交付包,如何将代码交付给用户。

轻微混淆

存在较小的混淆,以防止临时用户刺入手指并轻易弄碎东西。它并不能排除那些坚定的黑客,但是在确保您被要求支持的东西确实是您真正提供的东西方面确实有价值。这类事情所需的保护级别确实非常低。交付包只需要看起来不可读且不可编辑(无需专业工具),那就足够了。

Java的最小化就是一个例子,尽管它并不是这样销售的。即使您足够坚决/有足够的毅力,即使在技术上完全有可能这样做,也没有人会愿意阅读和编辑缩小的JS文件。

与交付Java应用程序类似。仅将代码打包到可执行的JAR中,即使在城市公园中有礼貌的“ Please Keep Off the Grass”标志,也可以阻止大多数的愚蠢行为。

即使在交付C ++代码时,从可执行文件中剥离不必要的符号也足以视为轻微的混淆。关键在于,以用户身份读取结果很尴尬,但是以计算机的形式执行结果却不成问题。

重大混淆

主要的混淆是将确定的知识渊博的用户拒之门外。这也是一场完全失败的比赛;如果计算机可以执行它,那么一个人可以将其拆开并确定其功能。您可以得到的最接近的结果是使程序不断地对其自身进行解密,从而将它一次执行的操作转换为另一次完全不同的操作。创建这样的东西将是相当困难的,并且仍然不能阻止真正的好黑客(尽管到最后,他们将与您完全交叉,因为解密所有这些自修改代码需要付出很多努力)。

考虑其他解决方案要好得多。例如,您可以将代码的“皇冠上的宝石”保留在您控制的服务器上,并且只允许对其进行服务调用,从而使客户端成为本质上免费的赠品,这是宝贵比特币的前端。或者,您可以采用更多合同/法律途径,仅将可执行文件移交给正式同意不会在您的代码中随意戳戳或在这样做的情况下补偿您的组织(因此这是某种形式的NDA)。目的是为黑客提供一种强有力的诱因,使他们不要黑客,并让用户使代码远离不受协议约束的任何黑客。

但是,您不能以为您的代码永远不会被破解。通过虚拟化,可以检查和跟踪执行的任何程序状态,而任何试图克服它的情况(例如,对外部时间源的时钟跟踪)将比黑客更可能给合法用户造成问题。(请参阅DRM的历史,以了解一旦代码掌握在对手手中,即使是非常有决心的信息发布者也无法保证其系统的安全。)最好集中精力于真正使合法用户满意。与通过适当地满足客户所带来的额外金钱相比,偶尔出现的裂缝所造成的损失将是零。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.