7

我可以使用反编译器看到原始源代码,但是如何修改源代码并在之后重新编译 .DLL?

4

2 回答 2

15

首先,你看不到原始源代码;你会看到逆向工程的源代码。

如果您对以编程方式修改程序集感兴趣,请查看以下项目: * CodePlex 上的通用编译器基础结构 (CCI) 元数据CCI AST项目。这正是他们的目的。

[CCI] 允许应用程序有效地分析或修改 .NET 程序集、模块和调试 (PDB) 文件。” ——来自项目的网站

IIRC,CCI 元数据在相当低的抽象级别上工作。如果要使用它修改或插入代码,则必须处理中间语言 (IL)。CCI AST 提供更高级别的抽象(抽象语法树)。

(顺便说一句。我想 CCI 不会允许你篡改强命名(签名)程序集,因为这会破坏他们的目的。)

  • 单声道塞西尔。它是为 Mono 开发的,但也适用于 .NET:

    “用简单的英语,使用 Cecil,您可以加载现有的托管程序集,浏览所有包含的类型,即时修改它们并将修改后的程序集保存回磁盘。” ——来自项目的网站

顺便说一句,Stack Overflow 上有一个问题,要求对两者进行比较

其他相关库/框架:

  • 罗斯林。该项目的重点是将源代码表示为抽象语法/解析树,并允许您进行例如源代码分析和操作。它还应该能够为您编译源代码。但是,Roslyn并不擅长装配操作。(总而言之,您可以将 Roslyn 视为 System.CodeDom 和 System.Linq.Expressions 的混合体,但比其中任何一个都强大得多。)

  • Kevin Montrose编写了一个名为Sigil的 IL 发射库,它是“DynamicMethod 和 ILGenerator 的快速失败、验证助手”。

  • 您可以使用ildasm(IL disassembler) 和ilasm(IL assembler) 来做一些称为“往返”的事情(例如阅读Mike Stall 的博客):

    往返是您反编译应用程序(可能通过 ILDasm),可能编辑 IL,然后重新编译它(可能通过 ILAsm)的地方。这是重写程序集的主干[...]。

  • 最后一个选项是.NET 基类库 (BCL) 中的System.ReflectionSystem.Reflection.Emit功能。前者允许您检查程序集。后者提供了生成新程序集并将其保存到磁盘的功能。与 CCI 一样,您必须处理原始 IL。另外,我认为它们不允许您轻松修改现有程序集。

于 2012-06-23T20:20:57.920 回答
2

JustDecompile的插件允许您编辑程序集。转到程序集编辑器插件部分。

于 2012-06-27T08:52:11.013 回答