源代码级别的混淆比混淆器更有效?

时间:2009-01-05 15:16:58

标签: c# obfuscation

从我的last question学习,大多数会员名称似乎都包含在项目输出中。

看一些反编译器,如9raysSalamanderJungle,许多混淆技术似乎已经被打败了,这是一个特别可怕的声明:

  

自动删除混淆器〜Salamander

注入的字符串加密

手动,源代码级别混淆更有效比后编译/中期编译更加有效,“表面”混淆是众所周知的(容易被击败的)混淆程序吗?

8 个答案:

答案 0 :(得分:21)

在维护方面,混淆源代码将会弄巧成拙。

如果您的项目如此'秘密',我想您有两个选择:

  • 将“秘密”专有代码放在您控制的服务器上的服务后面

  • 用一种语言对它进行编码,因此不易反编译,例如C / C ++

答案 1 :(得分:11)

也许,可辩论,但你会破坏这样做的可维护性。

这真的值得吗?

实际上,这只是通过默默无闻来强调安全性,即它根本不是安全性,这只会给您带来不便。你应该工作,因为他假设任何对此感兴趣的人反编译你的代码,如果他们可以访问它。你为自己造成的痛苦不值得为邪恶的黑客们带来更多的时间。处理访问的真正安全问题。

答案 2 :(得分:9)

正如人们所说,混淆是提高标准。如果你对你的装配进行模糊处理,你就会阻止一个只是好奇的临时开发人员,但你不会阻止一个有动力的人进行逆向工程。

如果您想进一步提高标准,许多混淆工具允许您使用不可打印的字符作为成员名称。使用反射器本身来看看。这将阻止更多的人,我可能会看到混淆代码来理解它,但如果我无法阅读它,我不会经历将其转储到IL的痛苦,并手动重命名所有成员,没有动力让我浪费那么多时间。

然而,对于某些人来说,如果您的业务需求无法保证,那么您需要采取其他措施。但无论你做什么,如果电脑都可以阅读它,那里会有人也可以阅读它。目标是减少能够阅读或有动力阅读的人数。

还有一些技巧可以用来使反射器断裂(PreEmptive的Obfuscator在某些情况下会破坏反射器,但当然你仍然可以读取IL)。我与一个obfusction工具的开发者进行了一次有趣的对话,我无法做到这一点,但他有办法通过让代码动态地跳转来使反射器完全中断。例如,在函数a中的一个时刻,你将跳转到函数b的中间。这样做会导致PEVerify引发错误,所以他们从来没有实际实现它,而是一种干净的想法。

答案 3 :(得分:3)

annakata是正确的。实际上你所能做的就是让这个人对软件进行逆向工程变得更加困难(而且代价高昂)。

我的公司确定了几个我们希望尽可能难以进行逆向工程的领域。例如,我们的文件是二进制格式,我们的层次结构中的每个对象负责保存自己并回读正确的版本。这意味着一个人阅读我们的文件,他们将在他们创建的代码中复制我们的整个层次结构来读取我们的文件。此外,如果没有商店标准文件中的相应位,Job文件中的大部分信息都很有用。所以他们必须做两次工作才能理解作业文件的内容。

Win32DLL中存在几个关键区域(加密狗保护,与我们的金属切割机通信)。这意味着他们必须知道汇编以及如何制作复制其他DLL签名的DLL以便对我们的软件进行逆向工程。此外,我们的CAM软件设计是与切割机高度互动(信息一直在交换)

从我们听到竞争对手试图单独处理我们的机器的那几次开始,他们最终用自己的电子设备替换电子设备以完成工作。主要的雄鹿要做到这一点。

我们采取的部分步骤是基于我们自己在尝试处理竞争机器和软件方面的经验。我们学习了这些经验并学会了如何调整我们的设置。当然,我们有限制,因为我们不会为了击败逆向工程而牺牲可靠性或维护。

对于您的情况,您将不得不问自己,您的软件的哪些部分会让您的竞争对手感兴趣并从那里开始。如果您是垂直市场开发人员(机器控制,专业会计等),我建议使用USB加密狗进行软件控制。

否则使用序列号系统并接受人们将盗版您的软件并将其构建到您的业务模型中。序列号方案的目的是相对不引人注意,并且阻碍了因果复制,并且让您有机会追踪副本的来源。

答案 4 :(得分:2)

问题在于你会牺牲可读性来做到这一点。如果您的项目是神圣的保护,我相信可以安全地假设两件事:

  1. 这个项目足够大,以至于可读性的命中率会回来让你陷入麻烦。
  2. 无论如何,想要进行逆向工程的人都会这样做。只需要稍微大一点的智力来确定一些事情(而不仅仅是阅读成员名称)。

答案 5 :(得分:2)

我很惊讶您甚至在考虑代码级别的混淆。你也不会为自己混淆代码吗?您打算如何再次使用它?为了可维护性,不应该这样做。

但请考虑一下: -

假设您可以运行一个脚本/应用程序,它可以打开您的项目并巧妙地模糊项目中的每个字符串/变量名称,然后在原始代码在一个单独的位置安全地保持原样时编译它。

现在有点想法了。

答案 6 :(得分:1)

实际上,代码级混淆不太安全比混淆器可以做的那样。这主要是因为混淆器可以利用语言编译器不允许的严格CLI实现细节。例如,私有字段都具有相同的名称是完全合法的 - 但是没有可以让你这样做的编译器。

答案 7 :(得分:1)

你可以使用这样的技术:http://g.palem.in/SecureAssembly.html使用你在.net中编写,但是你将.net可执行文件嵌入到c ++可执行文件中,