4

从我的最后一个问题中学习,大多数成员名称似乎都包含在项目输出中。

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

自动删除混淆器注入的字符串加密 ~ Salamander

那么手动的源代码级别的混淆是否比众所周知的(容易被击败的??)混淆程序进行的编译后/中间编译起泡的“表面”混淆更有效?

4

8 回答 8

21

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

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

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

  • 用一种不容易反编译的语言进行编码,例如 C/C++

于 2009-01-05T15:26:27.653 回答
11

也许,有争议,但这样做会破坏可维护性。

这真的值得吗?

实际上,这只是通过默默无闻归结为安全性,即根本不是安全性,这只是一种不便。你应该假设任何足够感兴趣的人都会反编译你的代码,如果他们可以访问它。不值得你给自己造成的痛苦让邪恶的haxxors花费更多的时间。处理真正的访问安全问题。

于 2009-01-05T15:24:05.833 回答
9

正如人们所说,混淆是为了提高标准。如果你混淆你的程序集,你会阻止一个只是好奇但你不会阻止一个稍微有动力的人进行逆向工程的临时开发人员。

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

但是,对于某些人来说,这是有动机的,因此如果您的业务需求需要它,您需要再走一步。但不管你做什么,只要电脑能读懂,总会有人能读懂。目标是减少可以阅读或愿意阅读的人数。

您还可以使用一些技巧来破坏反射器(PreEmptive 的混淆器在某些情况下会破坏反射器,但当然您仍然可以阅读 IL)。我曾经与一个混淆工具的开发人员进行了一次有趣的对话,我无法做到公正,但他有办法通过让代码动态跳转来使反射器完全中断。例如,在你的函数 a 中的某个时刻,你会跳到函数 b 的中间。这样做会导致 PEVerify 引发错误,因此他们从未真正实现它,而是一种巧妙的想法。

于 2009-01-05T15:57:02.333 回答
3

安娜卡塔是正确的。实际上,您所能做的就是让人们对软件进行逆向工程变得更加困难(并且成本更高)。

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

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

从我们很少听说竞争对手试图单独处理我们的机器开始,他们最终用自己的电子设备替换了电子设备以完成工作。大笔钱来做到这一点。

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

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

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

于 2009-01-05T15:43:57.040 回答
2

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

  1. 该项目足够大,以至于可读性的打击会回来咬你的屁股。
  2. 无论如何,想要对其进行逆向工程的人都会这样做。只需要稍微大一点的智能来确定事情的作用(而不是仅仅阅读成员的名字)。
于 2009-01-05T15:22:35.570 回答
2

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

但是考虑一下:-

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

现在这是一些想法。

于 2009-01-05T16:18:19.013 回答
1

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

于 2009-04-18T03:18:33.970 回答
1

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

于 2011-01-04T15:06:44.330 回答