.NET ファイルの #US ヒープの文字列を書き換える必要があります。.NET ファイルを操作するための強力なライブラリのように見えるdnlibを使用することにしました。残念ながら、それは十分に文書化されていません。
通常の方法でファイルをロードします。メソッドは、ファイルをロードする唯一のModuleDefMD
Load()
方法のようです:
ModuleDefMD module = ModuleDefMD.Load("test.dll");
現在、dnlib にはWriter
、.NET 構造への書き込みに使用する必要があることを示唆する名前空間があります。有望に見えるUSHeap
クラスが含まれています。
ライターは、作業できるメタデータを作成する必要があるようです。
dnlib.DotNet.Writer.MetaData metadata = dnlib.DotNet.Writer.MetaData.Create(module, null, null, null);
USHeap クラスには、「ヒープに書き込む値をオーバーライドする」という説明のSetRawData()
メソッドがあります。残りは不明ですが、とにかくそれを使用して、生の任意の 3 バイトを書き込みましょう。CLI 標準によると、最初の有効なオフセットは 1 です。
byte[] raw_data = { 0x61, 0x62, 0x63 }; // "abc"
uint offset = 1; // the least valid offset in #US heap
metadata.USHeap.SetRawData(offset, raw_data);
dnlib 例は、ファイルの書き込み方法を示しています。
module.Write("test-out.dll");
このコードは、エラーなしでコンパイルおよび実行されます。残念ながら、新しいファイルには元のファイルと同じ #US ストリーム コンテンツが含まれています。
Writer がどのように機能するのか、私にはわからなかったようです。dnlib は非常に多くのソース ファイルと行で構成されているため、ソースを調べるのは簡単ではありません。
dnlib のドキュメントでは、ConfuserEx ( dnlibを使用してファイルを操作する難読化ツール) について言及しています。しかし、そのソースを見ると、#US ヒープをまったく操作していないようです。