private void ProcessRuntimeModule() { logger.Info("Processing Runtime Module..."); var module = ModuleDefMD.Load(Path.Combine(@"C:\Users\Nybher\Desktop\koiVM\Debug\bin", "KoiVM.Runtime.dll")); module.Assembly.Name += "." + User.LongID; module.Name = string.Format("KoiVM.Runtime.{0}.dll", User.LongID); var renamer = new Renamer(random.Value.Next(), true, '#'); renamer.Process(module); ctx = new RenameContext(); ctx.VMEntry = renamer.GetNewName(ctx.VMEntry); ctx.VMRun = renamer.GetNewName(ctx.VMRun); ctx.VMDispatcher = renamer.GetNewName(ctx.VMDispatcher); ctx.VMDispatcherDothrow = renamer.GetNewName(ctx.VMDispatcherDothrow); ctx.VMDispatcherThrow = renamer.GetNewName(ctx.VMDispatcherThrow); ctx.VMDispatcherGetIP = renamer.GetNewName(ctx.VMDispatcherGetIP); ctx.VMDispatcherStackwalk = renamer.GetNewName(ctx.VMDispatcherStackwalk); ctx.VMConstants = renamer.GetNewName(ctx.VMConstants); using (var reader = new StringReader(ctx.VMConstMapText)) { while (reader.Peek() > 0) { var line = reader.ReadLine().Trim(); if (string.IsNullOrEmpty(line)) { continue; } var entry = line.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); var key = renamer.GetNewName(entry[0]); ctx.VMConstMap.Add(Tuple.Create(key, entry[1])); } } random.Value.Shuffle(ctx.VMConstMap); using (var stream = new MemoryStream()) { module.Write(stream); rtModule = stream.ToArray(); } logger.Info("Finished Runtime Module."); }
private void ProcessVMModule() { logger.Info("Processing VM Module..."); var module = ModuleDefMD.Load(Path.Combine(@"C:\Users\Nybher\Desktop\koiVM\Debug\bin", "KoiVM.dll")); module.LoadPdb(); var ca = module.Assembly.CustomAttributes.Find("System.Reflection.AssemblyInformationalVersionAttribute"); version = (UTF8String)ca.ConstructorArguments[0].Value; foreach (var instr in module.Find("KoiVM.Watermark", true).FindMethod("GenerateWatermark").Body.Instructions) { if (instr.OpCode.Code == Code.Ldc_I4 && (int)instr.Operand == 0x10000) { instr.Operand = (int)(User.Watermark * 0xaeaf10f7); // mod-inverse = 0xa7c0b0c7 } } var initCctor = module.Find("KoiVM.RT.Mutation.RTMap", true).FindStaticConstructor(); var renamer = new Renamer(random.Value.Next(), false, '$'); renamer.Process(module); var sb = new StringBuilder(); foreach (var entry in ctx.VMConstMap) { sb.AppendLine(string.Format("{0}\t{1}", entry.Item1, renamer.GetNewName(entry.Item2))); } ctx.VMConstMapText = sb.ToString(); foreach (var instr in initCctor.Body.Instructions) { var value = instr.Operand as string; if (value == null) { continue; } switch (value) { case "KoiVM.Runtime.VMEntry": instr.Operand = ctx.VMEntry; break; case "Run": instr.Operand = ctx.VMRun; break; case "KoiVM.Runtime.Execution.VMDispatcher": instr.Operand = ctx.VMDispatcher; break; case "DoThrow": instr.Operand = ctx.VMDispatcherDothrow; break; case "Throw": instr.Operand = ctx.VMDispatcherThrow; break; case "GetIP": instr.Operand = ctx.VMDispatcherGetIP; break; case "StackWalk": instr.Operand = ctx.VMDispatcherStackwalk; break; case "KoiVM.Runtime.Dynamic.Constants": instr.Operand = ctx.VMConstants; break; default: instr.Operand = ctx.VMConstMapText; break; } } module.Resources.Add(new EmbeddedResource("KoiVM.Runtime.dll", rtModule)); module.Write(Path.Combine(privPath, "KoiVM.dll"), new ModuleWriterOptions(module) { WritePdb = true }); logger.Info("Finished VM Module."); }