Перезапись строки в кучах.NET CLR с использованием dnlib

Мне нужно переписать строки в куче #US в файле.NET. Я решил использовать dnlib, который выглядит как мощная библиотека для манипулирования файлами.NET. Это недокументировано, к сожалению.

Я загружаю файл обычным способом. ModuleDefMDLoad() методы, кажется, единственный способ загрузить файл:

ModuleDefMD module = ModuleDefMD.Load("test.dll");

Теперь, dnlib имеет Writer пространство имен, которое предполагает, что оно должно использоваться для записи в структуры.NET. Это содержит USHeap класс, который выглядит многообещающим.

Кажется, что Writer должен создать метаданные, с которыми он может работать:

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, что и оригинал.

Кажется, я не понял, как работает писатель. Изучить исходные коды непросто, так как dnlib состоит из довольно большого количества исходных файлов и строк.

Документация dnlib относится к ConfuserEx - обфускатору, который использует dnlib для манипулирования файлами. Однако, глядя на его источники, кажется, что он вообще не манипулирует кучей #US.

1 ответ

Решение

Перед вызовом module.Write() инициализируйте класс параметров записи. Установите прослушиватель на прослушиватель писателя, а затем передайте параметры Write(). После определенных событий записи вы можете начать манипулировать метаданными до того, как они будут записаны в файл. Затем вы можете добавить произвольные строки в кучу #US или любую другую кучу.

Вот пример, который вы можете посмотреть: https://github.com/0xd4d/dnlib/blob/master/Examples/Example6.cs

Другие вопросы по тегам