【问题标题】:C# - Executables decompilable (can be reverse engineered)?C# - 可执行文件可反编译(可以逆向工程)?
【发布时间】:2010-12-02 22:32:17
【问题描述】:

C# 可以逆向工程,对吗?怎么容易做到这一点? 我们可以说 C# 在安全方面不够好吗?反编译方面,C++ 与 C# 相比又如何呢?

【问题讨论】:

  • 你可以说,但你错了。

标签: c# c++ reverse-engineering


【解决方案1】:

这是真的!

使用Reflector 查看您自己的一个可执行文件。

这是否意味着 C#“在安全方面不够好”?不,不是那个意思。

C# 的安全性没有任何问题。如果您不想让全世界知道它们,您只需要确保不会在已发布的可执行文件中放入任何秘密。 (这几乎适用于任何语言,而不仅仅是 C#。所有可执行代码都可以进行逆向工程,只是某些语言/框架比其他语言/框架更容易。)

【讨论】:

  • 那个是免费的,对我来说是迄今为止最好的:)
  • 现实与其说是“不要把秘密放在......”不如说是“没有必要如此偏执和防御,以至于你从不发布或获利”。任何事情都有风险——包括早上起床和一直待在床上。前者通常支付更好。
【解决方案2】:

亲爱的。

即使您使用 C 或任何语言编写程序,您也始终可以从可执行文件中提取机器代码(即使它是一些奇怪的自修改代码),然后您始终可以获得汇编表示。这是必要的,因为 CPU 只能执行机器代码。对于为任何图灵机编写的任何程序,这本质上都是正确的。

无论开发人员如何努力混淆代码,任何游戏或应用程序在发布几天后都会出现裂缝,这很好地说明了这一事实。有一些混淆技术,但最终,总是可以对机器代码(或 .NET 的 IL 代码)进行逆向工程。还有非常好的汇编 -> C 反编译器。

只要接受这样一个事实,即您的代码可以进行逆向工程,并且如果有人足够需要源代码并且愿意在其中投入一些时间,那么就可以进行逆向工程。请牢记这一点来设计您的软件。

【讨论】:

  • 确实,原则上任何程序都可以进行逆向工程。例如,在 C# 和 Java 中,它比使用像 C 这样的语言更容易,因为有反编译器可以将字节码翻译回(或多或少可读的)源代码——这对于机器码到 C 或C++。
  • 我已经看到许可证密钥系统的“秘密”代码以字符串文字形式出现。不止一次:-('任何知道字符串命令的人,不需要反编译......)
【解决方案3】:

您显然可以使用 Reflactor 来查看其源代码。但是你可以通过使用像Dotfuscator这样的混淆器来让它变得有点困难

但正如大家所说,你不能让它不可能逆向工程。

【讨论】:

    【解决方案4】:

    是的,C# 可以进行逆向工程。事实上,这很容易做到。看看反射器。为了使它更难,但并非不可能使用混淆器。

    请记住,使用 C/C++ 或任何其他语言编写的应用程序也可以进行逆向工程,尽管不像非混淆 C# 或 Java 那样容易。

    【讨论】:

    • 我不会说这很容易做到;可能对 Reflector 进行了一些思考和工作,但是是的,CIL 的元数据繁重的性质确实使获得几乎原始代码的工作比使用 JVM 或本机代码更容易。
    • 我并不是说 Reflector 很容易实现,但使用它来检查 .NET 代码肯定是 imo。从二进制文件中对未混淆的 .NET 代码进行逆向工程要比 C 代码容易得多。
    【解决方案5】:

    每个新版本的 C# 都更难进行逆向工程。确实,当 C# 在 1.0 时,Reflector 实际上会显示您的源代码,但是现在我们在 3.0 并且如果您使用匿名委托、LINQ、匿名类等。所有高级语法都被编译为“哑” MSIL,并且将它们逆向工程回其原始来源并不容易。

    【讨论】:

      【解决方案6】:

      使用 .NET 框架编写的任何代码都可以轻松进行逆向工程。这就是混淆的概念出现的地方。

      混淆是一些工具使用的一种技术,它采用基于 .NET 的程序集输出并尝试加密字符串、更改方法主体的流控制、重命名变量、参数和方法名称,从而使因果黑客更难跟踪和“反编译”代码。

      混淆不能保证完全保护您的“专有”代码。为了保持代码的最佳安全性,只需将代码保存在您的私人服务器上。请务必记住,如果准“黑客”有足够的时间和毅力,所有代码都可以进行逆向工程。

      C# 安全方面
      如果您觉得您的“敏感”代码不想让其他用户看到和“解码”,您应该研究在本机 Win32 环境(C++ 或 Delphi)中开发这些代码部分,并继续享受 . NET 框架。

      【讨论】:

        【解决方案7】:

        “红门反射器”的谷歌 - http://www.red-gate.com/products/reflector/

        如果你想防止这种情况发生,那么你需要一个混淆器,或者其他更高级的保护形式。

        【讨论】:

        • 混淆器不会阻止它被逆向工程,但会使其更难。
        【解决方案8】:

        将 Reflector 与 File Disassembler 插件 http://www.denisbauer.com/NETTools/FileDisassembler 一起使用 - 它会为您从 dll 生成所有代码。

        【讨论】:

          猜你喜欢
          • 2018-10-13
          • 2019-10-20
          • 2022-07-01
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-15
          • 2010-10-23
          相关资源
          最近更新 更多