4

使用 de4dot 反编译 .net 程序集时,我在控制台中收到以下消息:

计算最大堆栈值时出错。如果方法被混淆了,设置 CilBody.KeepOldMaxStack 或 MetadataOptions.Flags (KeepOldMaxStack, global option) 忽略这个错误

如何设置 CilBody.KeepOldMaxStack 或 MetadataOptions.Flags?

4

1 回答 1

1

也许有点晚了,但我今天遇到了同样的问题,在寻找解决方案的同时找到了你的未解决问题,这就是我解决它的方法 - 我希望它也对你有用:

// Working with an assembly definition
var ass = AssemblyDef.Load("filename.dll");

// Do whatever you want to do with dnLib here

// Create global module writer options
var options = new ModuleWriterOptions(ass.Modules[0]);
options.MetadataOptions.Flags |= MetadataFlags.KeepOldMaxStack;

// Write the new assembly using the global writer options
ass.Write("newfilename.dll", options);

如果您只想在编写之前为选择产生问题的方法设置标志,例如:

// Find the type in the first module, then find the method to set the flag for
ass.Modules[0]
    .Types.First((type) => type.Name == nameof(TypeToFind))
    .FindMethod(nameof(MethodToFind))
    .KeepOldMaxStack = true;

CilBody如果您对内部 .NET 程序集结构不太了解,可能会有点混乱:它只是指在编写修改后的程序集时产生问题的方法的主体对象。混淆器经常试图通过产生无效结构来混淆反汇编程序,这可能会在使用 dnLib 编写程序集之前计算 maxstack 值时导致问题。通过保留原始的 maxstack 值,您可以跳过那些无效的方法结构。

在 de4dot 的上下文中,这似乎是一个错误,或者该应用程序根本不是为了解决混淆程序集的无效方法结构而设计的——在这种情况下,如果 de4net 开发人员不修复/实现它,则没有适合您的解决方案,并且您不想使用来自 GitHub 的源代码编写补丁。

于 2020-11-15T17:26:58.723 回答