4

de4dot を使用して .net アセンブリを逆コンパイルしているときに、コンソールに次のメッセージが表示されます。

最大スタック値の計算中にエラーが発生しました。メソッドが難読化されている場合は、CilBody.KeepOldMaxStack または MetadataOptions.Flags (KeepOldMaxStack、グローバル オプション) を設定して、このエラーを無視します。

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 に答える