Как я могу передать аргументы в callvirt в C # с помощью mono.cecil - PullRequest
0 голосов
/ 24 сентября 2019

Я создаю расшифровщик, который будет выполняться во время выполнения.Он отлично кодируется, но во время выполнения выдает ошибку Parameter IndexOutOfBound Exception.Это возможно только тогда, когда правильные аргументы не переданы.Я знаю об Idarg_1, но когда я непосредственно назначаю ему значение, он выдает ошибку, говоря дополнительную информацию.Как я могу присвоить значение этому аргументу?Я использую библиотеку mono.cecil.

Я пытался выполнить такие инструкции, как Instructions.Create (Opcodes.Idarg_1, "abc").И каждый раз выдает ошибку, говоря дополнительную информацию.

  private static MethodDefinition CreateDecrypter(AssemblyDefinition AssemblyDef)
        {
            string key = "FF5KS94PP0927GQ0";
            MethodDefinition Decrypt = new MethodDefinition("Decrypt", MethodAttributes.Public | MethodAttributes.Static, AssemblyDef.MainModule.Import(typeof(string)));
            Decrypt.Parameters.Add(new ParameterDefinition(AssemblyDef.MainModule.Import(typeof(string))));                     
            Console.WriteLine(AssemblyDef.MainModule);

            List<Instruction> Body = new List<Instruction>();
            //Body.Add(Instruction.Create(OpCodes.Call, AssemblyDef.MainModule.Import(typeof(System.Text.Encoding).GetMethod("get_UTF8"))));                        
            Body.Add(Instruction.Create(OpCodes.Ldarg_0));            
            Body.Add(Instruction.Create(OpCodes.Box));
            Body.Add(Instruction.Create(OpCodes.Ldarg_1));            
            Body.Add(Instruction.Create(OpCodes.Box));            
            Body.Add(Instruction.Create(OpCodes.Callvirt,
                AssemblyDef.MainModule.Import(typeof(ClassLibraryDecrypt.Class1).GetMethod("Decode", 
                new Type[] { typeof(object), typeof(object) }))));            

            //Body.Add(Instruction.Create(OpCodes.Arglist));
            foreach (Instruction Instr in Body)
            {                
                Decrypt.Body.Instructions.Add(Instr);

            }            
            return Decrypt;
        }

    }

«Декодирование» - это метод, который принимает две строки в качестве аргументов и возвращает декодированную строку

Может кто-нибудь сказать мне, где я неправ и что мне нужно делать дальше?

...