Код 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 способа сделать это:

  1. Откройте свой тип / метод, который у вас будет, вы можете изменить его вверху, нажав наC#->ILили нажмите, чтобы открыть правой кнопкой мыши, вот!
  2. Выберите метод, щелкните правой кнопкой мышиedit method body, сделанный! После этого можно было просто написать такой же IL-код, как и в dnspy ​​через dnlib.

  1. Создайте тот же код (создайте что-то вроде внешних компонентов внутри вашего проекта, где вы используете 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
Другие вопросы по тегам