Операция замены строки 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)