【问题标题】:Prevent Decompiling [duplicate]防止反编译[重复]
【发布时间】:2018-01-13 18:50:33
【问题描述】:

我在 Visual Studio 2017 .net c# 中制作了一个 PC 应用程序并将其编译为 exe。然后我认为我的代码是安全的,没有人可以看到它,因为它是编译的,但是当我在 .net reflector 之类的程序中打开 exe 时,我可以看到源代码。

有什么办法可以防止这种情况发生吗?还是保护我免受反编译??

【问题讨论】:

  • 保持安全的唯一方法是执行在线验证并在线存储重要资源。没有真正的方法可以保护离线应用程序。如果计算机知道如何运行它,程序员也会。
  • 您的安全要求是什么?你能提供更多细节吗?
  • 我的程序需要生成并存储计算机的指纹。如果用户看不到指纹是如何生成的,那就太好了。另外,当我存储指纹时,我首先对其进行了加密,但如果用户只能查看源代码并获取加密密码,这将不起作用。所以我想我会放弃指纹的加密。
  • 为什么不在服务端做指纹的计算呢?只需加密所有必要的数据并将其发送到托管在安全环境中的服务器。客户端代码根本不需要知道 - 看起来你的设计有点偏离
  • 如果您将它们发送返回,那么客户端程序必须将其存储到某个地方,也许是以加密的方式。您也可以将其存储在服务器上,用户无法访问的地方。在这种情况下,您需要每次将加密的硬件序列发送到服务器,计算并与您存储的内容进行比较。这不是很高效,但更安全。这一切都取决于您的要求

标签: c# .net decompiling decompiler


【解决方案1】:

尝试这样做真的没有意义。

虽然您会被“混淆”所淹没,但这是在浪费时间。

  • 反混淆器一直在变得更好。
  • 如果有人想要你的代码足够糟糕,无论你做什么,他们都会得到它。
  • 坦率地说,如果您问这个问题,那么您编写的代码不值得花时间来保护它。

【讨论】:

  • 残酷的事实,但是 Ngen.exe 和生成本机图像呢? (并为此不遗余力)
  • @ironstone13:有更好的语言来编写原生图像。以及使用它们的好论据。但即使是那些也可以被反编译。我理解代码保护的论点。但工具的当前状态使得保护工作非常昂贵 - 在时间、工作流程的便利性和维护的便利性方面。
  • @ironstone13 不,这无济于事。根据设计,本地系统管理员可以禁用特定密钥的强名称验证。例如,Entity Framework 使用它来使用官方的 Microsoft 公钥构建,不提供私钥来签署程序集,但仍允许在本地使用定制版本。
  • @ironstone13 可能更相关的是,如果它是一个 应用程序 而不仅仅是一个程序集,用户可以将其替换为未签名的版本,或者使用某些签名的版本其他键。
  • @ironstone13 没有什么能阻止人们对原生图像进行逆向工程。黑客、破解者、杀毒软件编写者、操作系统开发人员……无时无刻不在这样做
【解决方案2】:

如果你编译成MSIL(中间语言),你不能阻止反编译。在这种情况下,您需要使用obfuscation

有关该主题的更深入讨论,请查看此帖子.NET obfuscation tools/strategy

你可以在这里找到类似的讨论How can I obfuscate my c# code, so it can't be deobfuscated so easily?

您还可以选择使用 Ngen.exe 为特定平台生成本机映像 - 这将绕过 IL 并生成编译后的处理器特定机器代码,从逆向工程的角度来看,这是非常安全的。

使用 IL 是一种非常常见的设计选择 - 它有其缺点和优点 - 主要是 在一个平台和多个目标平台上更容易支持多种语言,即 跨平台

要了解使用 IL 的一些好处 - 看看这个 - stackoverflow.com/questions/1926386/...

Java 还使用一种中间语言 - java 字节码 - javaworld.com/article/2077233/core-java/bytecode-basics.html

【讨论】:

  • 但是我有一个 c++ 程序,但我无法获得它的源代码。为什么不呢??
  • @KasperTonsgaard,正是这一点 - 如果 C++ 程序没有在 .NET 上运行,那么它不使用 IL 并且不太容易受到逆向工程的影响 -见stackoverflow.com/questions/8710581/…
  • 但是微软为什么不能直接做.net,这样你就看不懂源代码了??
  • 恐怕这是一个很常见的设计选择 - 它有它的缺点和优点 - 主要是更容易在一个平台和多个目标平台上支持多种语言使用 IL 的好处 - 看看 - stackoverflow.com/questions/1926386/… Java 也使用中间语言 - java 字节码 - javaworld.com/article/2077233/core-java/bytecode-basics.html
  • @KasperTonsgaard 谁说你拿不到C++程序的源代码?你没听说过反编译器吗?如果 CPU 可以做某事,逆向工程师也可以做到。它只是比编译为 C# 或 Java 等字节码的语言花费更多时间
猜你喜欢
  • 2011-10-01
  • 2014-02-07
  • 1970-01-01
  • 2010-12-11
  • 2012-01-11
  • 2013-07-28
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多