gpt4 book ai didi

c# - 以编程方式反汇编 CIL

转载 作者:可可西里 更新时间:2023-11-01 08:36:09 29 4
gpt4 key购买 nike

我可以将指令编译为字节码,甚至可以轻松执行它们,但我发现提取 CIL 的唯一函数是 GetILAsByteArray,顾名思义,它只返回字节而不是 CIL 指令。

那么如何在 .NET 上以编程方式反汇编 CIL?

请注意,我不希望结果采用人类可读的形式。我想编写元程序来操纵从其他程序生成的 CIL。

最佳答案

您只需使用 GetILAsByteArray 方法中的字节数组就可以走得相当远,但是您需要自己编写字节解析(如果您不想依赖第 3 方库) .

数组的结构是,有一个或两个字节标识指令,后跟指令的操作数(什么都没有,一些 4 字节标记或 8 字节数字)。

要获取代码,您可以查看 System.Reflection.Emit 中的 OpCodes 结构 ( MSDN )。如果枚举所有字段,则可以很容易地构建一个用于读取字节的查找表:

// Iterate over all byte codes to build lookup table
for fld in typeof<OpCodes>.GetFields() do
let code = fld.GetValue(null) :?> OpCode
printfn "%A (%d + %A)" code.Name code.Size code.OperandType

code.Value 属性为您提供代码的 byteint16 值。 code.Size 属性告诉您这是 1 字节代码还是 2 字节代码,OperandType 属性指定代码后面的参数(字节数和含义是 explained on MSDN ).我不记得您究竟需要如何处理诸如引用 MethodInfo 的标记之类的东西,但我想您将能够弄清楚!

关于c# - 以编程方式反汇编 CIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253622/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com