Операция замены строки dnlib иногда завершается с ошибкой

Я пытаюсь сделать метод, который заменяет каждый string в исполняемом файле с его зашифрованной версией. Оно использует AESDecrypt метод, который уже существует в исполняемом файле, который я изменяю.

Пример: он должен заменить "Hello World" с AESDecrypt("encryptedversionofhelloworld", "encryptionpassword"), Код работает, но случайно не работает.

public static bool ApplyStringEncryption(string path)
{
    try
    {
        MethodDef _decryptName = null;

        using (ModuleDefMD mod = ModuleDefMD.Load(path))
        {
            foreach (TypeDef type in mod.GetTypes())
            {
                if (type.IsGlobalModuleType)
                    continue;

                foreach (MethodDef method in type.Methods)
                {
                    if (!method.HasBody || method.IsConstructor)
                        continue;

                    if (method.Name == "AESDecrypt")
                        _decryptName = method;

                    IList<Instruction> instructions = method.Body.Instructions;
                    string key = GetRandomString(18, 36, false);

                    for (int i = 0; i < instructions.Count; i++)
                    {
                        if (instructions[i].OpCode == OpCodes.Ldstr)
                        {
                            instructions[i].Operand = Methods.XorString((string)instructions[i].Operand, key);
                            instructions.Insert(i + 1, Instruction.Create(OpCodes.Ldstr, key));
                            instructions.Insert(i + 2, Instruction.Create(OpCodes.Call, _decryptName));
                            i++;
                        }
                    }
                }
            }

            mod.Write("obf.exe");
        }
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        return false;
    }
}

Это ошибка, когда она терпит неудачу:

dnlib.DotNet.Writer.ModuleWriterException: Target instruction is too far away for a short branch. Use the long branch or call CilBody.SimplifyBranches() and CilBody.OptimizeBranches()
   at dnlib.DotNet.DummyLogger.Log(Object sender, LoggerEvent loggerEvent, String format, Object[] args)
   at dnlib.DotNet.Writer.ModuleWriterBase.dnlib.DotNet.ILogger.Log(Object sender, LoggerEvent loggerEvent, String format, Object[] args)
   at dnlib.DotNet.Writer.MetaData.Error(String message, Object[] args)
   at dnlib.DotNet.Writer.MetaData.dnlib.DotNet.Writer.IWriterError.Error(String message)
   at dnlib.DotNet.Writer.MethodBodyWriter.ErrorImpl(String message)
   at dnlib.DotNet.Writer.MethodBodyWriterBase.Error(String message)
   at dnlib.DotNet.Writer.MethodBodyWriterBase.WriteShortInlineBrTarget(BinaryWriter writer, Instruction instr)
   at dnlib.DotNet.Writer.MethodBodyWriterBase.WriteOperand(BinaryWriter writer, Instruction instr)
   at dnlib.DotNet.Writer.MethodBodyWriterBase.WriteInstruction(BinaryWriter writer, Instruction instr)
   at dnlib.DotNet.Writer.MethodBodyWriterBase.WriteInstructions(BinaryWriter writer)
   at dnlib.DotNet.Writer.MethodBodyWriter.WriteFatHeader()
   at dnlib.DotNet.Writer.MethodBodyWriter.Write()
   at dnlib.DotNet.Writer.MetaData.WriteMethodBodies()
   at dnlib.DotNet.Writer.MetaData.Create()
   at dnlib.DotNet.Writer.MetaData.CreateTables()
   at dnlib.DotNet.Writer.ModuleWriter.WriteImpl()
   at dnlib.DotNet.Writer.ModuleWriterBase.Write(Stream dest)
   at dnlib.DotNet.Writer.ModuleWriterBase.Write(String fileName)
   at dnlib.DotNet.ModuleDef.Write(String filename, ModuleWriterOptions options)
   at dnlib.DotNet.ModuleDef.Write(String filename)

0 ответов

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