在使用.net解压缩de4dot程序集时,我在控制台中得到以下消息:
错误计算最大堆栈值。如果方法被混淆,设置CilBody.KeepOldMaxStack或MetadataOptions.Flags (KeepOldMaxStack,全局选项)以忽略此错误
如何设置CilBody.KeepOldMaxStack或MetadataOptions.Flags?
发布于 2020-11-15 17:26:58
也许有点晚了,但我今天遇到了同样的问题,我在寻找解决办法的同时发现了你的问题,我就是这样解决的--我希望它也适用于你:
// 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可能有点混乱:它只是指编写修改后的程序集时,生成问题的方法的body对象。混淆器通常试图通过产生无效的结构来混淆反汇编程序,这可能会导致在用dnLib编写程序集之前计算最大堆栈值时出现问题。通过保留原来的max堆栈值,您可以跳过那些无效的方法结构。
在de4dot上下文中,它似乎是一个bug,或者应用程序的设计根本不是为了解决模糊化程序集的无效方法结构--在这种情况下,如果de4net开发人员不修复/实现它,并且您不希望使用来自GitHub的源代码编写补丁,那么您就没有解决方案。
https://stackoverflow.com/questions/58926381
复制相似问题