Перезапись строки в кучах.NET CLR с использованием dnlib
Мне нужно переписать строки в куче #US в файле.NET. Я решил использовать dnlib, который выглядит как мощная библиотека для манипулирования файлами.NET. Это недокументировано, к сожалению.
Я загружаю файл обычным способом. ModuleDefMD
Load()
методы, кажется, единственный способ загрузить файл:
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