Код C# dnlib / IL - Создание нового словаря
Я создаю свою собственную программу для изменения кода.exe через dnlib.
Затем я хочу создать словарь с помощью кода IL и Dnlib.
Но есть не так много учебников для обоих, так что это довольно сложно..
Он пишет неправильный код словаря и приводит к краху DnSpy.
Мой код:
MethodDef cctor = Module.GlobalType.FindOrCreateStaticConstructor();
IList<Instruction> inst = cctor.Body.Instructions;
var objectCtor = new MemberRefUser(Module, ".ctor",
MethodSig.CreateInstance(Module.CorLibTypes.Void),
Module.CorLibTypes.Object.TypeDefOrRef);
var Global_Array = new FieldDefUser(
"field_obfuscator_array",
new FieldSig(Module.CorLibTypes.GetCorLibTypeSig(,
FieldAttributes.Public | FieldAttributes.Static);
Module.GlobalType.Fields.Add(Global_Array);
if (inst.Count < 1)
inst.Add(new Instruction(OpCodes.Ret));
inst.Insert(0, new Instruction(OpCodes.Ldc_I4, 100000));
inst.Insert(1, new Instruction(OpCodes.Newobj, "[mscorlib]System.Collections.Generic.Dictionary`2"));
inst.Insert(2, new Instruction(OpCodes.Stsfld, Global_Array));
Любая помощь высоко ценится, спасибо!
1 ответ
Самый простой способ - написать эту реализацию на C#, а затем поместить ее в декомпилятор (например, dnspy в этом или другом случае не имеет значения - просто нужно иметь считыватель кода IL).
Есть 3 способа сделать это:
- Откройте свой тип / метод, который у вас будет, вы можете изменить его вверху, нажав на
C#
->IL
или нажмите, чтобы открыть правой кнопкой мыши, вот! - Выберите метод, щелкните правой кнопкой мыши
edit method body
, сделанный! После этого можно было просто написать такой же IL-код, как и в dnspy через dnlib.
- Создайте тот же код (создайте что-то вроде внешних компонентов внутри вашего проекта, где вы используете dnlib и меняете модуль) - напишите тот же класс - метод - поля и т. д., затем загрузите его через
Importer
(делай свое волшебство - импортируй этот метод, много примеров прямо здесь )
Пример кода для dnlib, как это можно сделать:
var externalComponentsImporter = new Importer(externalComponentsModuleDefMD, ImporterOptions.TryToUseDefs);
var redirectStubMethodDef = externalComponentsImporter.Import(typeof(Hooking).GetMethod(nameof(Hooking.RedirectStub), BindingFlags.Public | BindingFlags.Static)).ResolveMethodDefThrow();
// Play around with ImporterOptions enum