首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置CilBody.KeepOldMaxStack或MetadataOptions.Flags

设置CilBody.KeepOldMaxStack或MetadataOptions.Flags
EN

Stack Overflow用户
提问于 2019-11-19 03:51:51
回答 1查看 3K关注 0票数 4

在使用.net解压缩de4dot程序集时,我在控制台中得到以下消息:

错误计算最大堆栈值。如果方法被混淆,设置CilBody.KeepOldMaxStack或MetadataOptions.Flags (KeepOldMaxStack,全局选项)以忽略此错误

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

EN

回答 1

Stack Overflow用户

发布于 2020-11-15 17:26:58

也许有点晚了,但我今天遇到了同样的问题,我在寻找解决办法的同时发现了你的问题,我就是这样解决的--我希望它也适用于你:

代码语言:javascript
复制
// 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);

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

代码语言:javascript
复制
// 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的源代码编写补丁,那么您就没有解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58926381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档