【问题标题】:What is the C#'s bytecode format?C# 的字节码格式是什么?
【发布时间】:2019-03-17 12:27:38
【问题描述】:

我正在尝试将 IL 反汇编程序集成到我的反汇编程序应用程序 (Android-Disassembler),但我找不到一些可以进行 CIL 反汇编的库。 因此,我正在尝试为 CIL 开发一个简单的反汇编程序。所以我在互联网上搜索(堆栈溢出、谷歌、维基百科等)。但是我不知道 CIL 汇编代码是如何变成字节码的。

我在二进制编辑器中打开了一个 C# 应用程序,(预测我可以找到人类可读的 IL 源代码)但我只能在其中找到一些二进制文件。

C# 字节码是什么样的?

例如X86 指令字节长度可变:

NOP = 0x90,
JMP = 0xEB 0xxx 0xxx 0xxx 0xxx, ...

到目前为止,我只能找到每条指令的操作码 (https://en.wikipedia.org/wiki/List_of_CIL_instructions)。但我也想知道操作数如何应用于操作码。

(比如88 /r 对应mov,不仅仅是88。)

【问题讨论】:

  • 你应该看看ecma 文档。
  • 您发布的 wiki 链接中有 ECMA 文档。而且表格中已经有很多指令字节后面的“目标”可以使用
  • @phuclv 在 x6F callvirt 中应该是字符串还是数字?
  • @phuclv 是的,我可能是个笨蛋没有注意到这一点(并且在表格中,您可以使用的指令字节之后已经有很多“目标”)抱歉..跨度>

标签: c# disassembly cil


【解决方案1】:

我可以推荐这本书:

专家级 .NET 2.0 IL 汇编器,作者:Serge Lidin

https://www.amazon.com/Expert-NET-Assembler-Serge-Lidin/dp/1590596463

另外ILSpy是一个非常流行的开源反编译器:

https://github.com/icsharpcode/ILSpy

环顾该源代码可能会对您有所启发。

ILDasm(Visual Studio 附带的 MSIL 反汇编程序)似乎也是开源的:

https://github.com/dotnet/coreclr/tree/master/src/ildasm

希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多