using AsmResolver.DotNet;
using AsmResolver.DotNet.Code.Cil;
using AsmResolver.IO;
using AsmResolver.PE.DotNet.Cil;
using System.Text;
string input_path = @"C:\CrackMe.exe";
string output_path = @"C:\patched_CrackMe.exe";
string resource_name = @"6C2A4129";
string xor_key = @"YouCan";
string xor_string(string input)
{
StringBuilder sb = new();
for (int i = 0; i < input.Length; i++)
sb.Append((char)(input[i] ^ xor_key[i % xor_key.Length]));
return sb.ToString();
}
List<(int method_token, byte[] cil_bytes)> parse_resource_data(byte[] data)
{
var enc_data = new List<(int, byte[])>();
using var stream = new MemoryStream(data);
using var reader = new BinaryReader(stream);
int count = reader.ReadInt32();
for (int i = 0; i < count; i++)
{
int method_token = reader.ReadInt32();
string encoded_string = xor_string(reader.ReadString());
byte[] cil_body = Convert.FromBase64String(encoded_string);
enc_data.Add((method_token, cil_body));
}
return enc_data;
}
var module = ModuleDefinition.FromFile(input_path);
var resource = module.Resources.FirstOrDefault(r => r.Name == resource_name);
var resource_data = resource.GetData();
var encrypted_methods = parse_resource_data(resource_data);
foreach (var (method_token, cil_body) in encrypted_methods)
{
var method = module.LookupMember(method_token) as MethodDefinition;
var reader = new BinaryStreamReader(cil_body);
var operand_resolver = new PhysicalCilOperandResolver(module, method.CilMethodBody);
var disassembler = new CilDisassembler(reader, operand_resolver);
var instructions = disassembler.ReadInstructions();
method.CilMethodBody.Instructions.Clear();
method.CilMethodBody.Instructions.AddRange(instructions);
}
module.Write(output_path);