Conster[] CreateConsters(_Context txt, Random rand, string injectName, FieldDefinition constTbl, FieldDefinition constBuffer) { AssemblyDefinition injection = AssemblyDefinition.ReadAssembly(typeof(Iid).Assembly.Location); injection.MainModule.ReadSymbols(); MethodDefinition method = injection.MainModule.GetType("Encryptions").Methods.FirstOrDefault(mtd => mtd.Name == "Constants"); List<Conster> ret = new List<Conster>(); TypeDefinition lzma = mod.GetType("Lzma" + mod.GetHashCode()); if (lzma == null) { lzma = CecilHelper.Inject(mod, injection.MainModule.GetType("Lzma")); lzma.IsNotPublic = true; lzma.Name = "Lzma" + mod.GetHashCode(); mod.Types.Add(lzma); } rand.NextBytes(txt.keyBuff); for (int i = 0; i < txt.keyBuff.Length; i++) txt.keyBuff[i] &= 0x7f; txt.keyBuff[0] = 7; txt.keyBuff[1] = 0; txt.resKey = (rand.Next(0x20, 0x80) << 24) | (rand.Next(0x20, 0x80) << 32) | (rand.Next(0x20, 0x80) << 16) | (rand.Next(0x20, 0x80) << 0 ); txt.resId = Encoding.UTF8.GetString(BitConverter.GetBytes(txt.resKey)); txt.key = (uint)rand.Next(); Database.AddEntry("Const", "KeyBuff", txt.keyBuff); Database.AddEntry("Const", "ResKey", txt.resKey); Database.AddEntry("Const", "ResId", txt.resId); Database.AddEntry("Const", "Key", txt.key); Mutator mutator = new Mutator(); MethodDefinition init = injection.MainModule.GetType("Encryptions").Methods.FirstOrDefault(mtd => mtd.Name == injectName); { MethodDefinition cctor = mod.GetType("<Module>").GetStaticConstructor(); MethodDefinition m = CecilHelper.Inject(mod, init); Instruction placeholder = null; mutator.IntKeys = new int[] { txt.resKey }; mutator.Mutate(Random, m.Body); txt.keyInst = mutator.Delayed0; placeholder = mutator.Placeholder; foreach (Instruction inst in m.Body.Instructions) { if (inst.Operand is FieldReference) { if ((inst.Operand as FieldReference).Name == "constTbl") inst.Operand = constTbl; else if ((inst.Operand as FieldReference).Name == "constBuffer") inst.Operand = constBuffer; } else if (inst.Operand is MethodReference && (inst.Operand as MethodReference).DeclaringType.Name == "LzmaDecoder") inst.Operand = lzma.NestedTypes .Single(_ => _.Name == "LzmaDecoder").Methods .Single(_ => _.Name == (inst.Operand as MethodReference).Name); } foreach (var i in m.Body.Variables) if (i.VariableType.Name == "LzmaDecoder") i.VariableType = lzma.NestedTypes.Single(_ => _.Name == "LzmaDecoder"); if (txt.isNative) CecilHelper.Replace(m.Body, placeholder, new Instruction[] { Instruction.Create(OpCodes.Call, txt.nativeDecr) }); else if (txt.isDyn) { Instruction ldloc = placeholder.Previous; m.Body.Instructions.Remove(placeholder.Previous); //ldloc CecilHelper.Replace(m.Body, placeholder, new CecilVisitor(txt.invExp, new Instruction[] { ldloc }).GetInstructions()); } ILProcessor psr = cctor.Body.GetILProcessor(); Instruction begin = cctor.Body.Instructions[0]; for (int i = m.Body.Instructions.Count - 1; i >= 0; i--) { if (m.Body.Instructions[i].OpCode != OpCodes.Ret) psr.InsertBefore(0, m.Body.Instructions[i]); } cctor.Body.InitLocals = true; foreach (var i in m.Body.Variables) cctor.Body.Variables.Add(i); } byte[] n = new byte[0x10]; int typeDefCount = rand.Next(1, 10); for (int i = 0; i < typeDefCount; i++) { TypeDefinition typeDef = new TypeDefinition( "", ObfuscationHelper.GetRandomName(), TypeAttributes.Class | TypeAttributes.Abstract | TypeAttributes.NotPublic | TypeAttributes.Sealed, mod.TypeSystem.Object); mod.Types.Add(typeDef); int methodCount = rand.Next(1, 5); Database.AddEntry("Const", "ConsterTypes", typeDef.FullName); for (int j = 0; j < methodCount; j++) { MethodDefinition mtd = CecilHelper.Inject(mod, method); mtd.Name = ObfuscationHelper.GetRandomName(); mtd.IsCompilerControlled = true; AddHelper(mtd, HelperAttribute.NoInjection); typeDef.Methods.Add(mtd); Database.AddEntry("Const", "ConsterMethods", mtd.FullName); Conster conster = new Conster(); conster.key0 = (long)rand.Next() * rand.Next(); conster.key1 = (long)rand.Next() * rand.Next(); conster.key2 = (long)rand.Next() * rand.Next(); conster.key3 = rand.Next(); conster.conster = mtd; Database.AddEntry("Const", mtd.FullName, string.Format("{0:X}, {1:X}, {2:X}, {3:X}", conster.key0, conster.key1, conster.key2, conster.key3)); mutator = new Mutator(); mutator.LongKeys = new long[] { conster.key0, conster.key1, conster.key2 }; mutator.IntKeys = new int[] { conster.key3 }; mutator.Mutate(Random, mtd.Body); foreach (Instruction inst in mtd.Body.Instructions) if (inst.Operand is FieldReference) { if ((inst.Operand as FieldReference).Name == "constTbl") inst.Operand = constTbl; else if ((inst.Operand as FieldReference).Name == "constBuffer") inst.Operand = constBuffer; } conster.keyInst = mutator.Delayed0; ret.Add(conster); } } return ret.ToArray(); }
Conster[] CreateConsters(_Context txt, Random rand, string injectName, FieldDefinition constTbl, FieldDefinition constBuffer) { AssemblyDefinition injection = AssemblyDefinition.ReadAssembly(typeof(Iid).Assembly.Location); injection.MainModule.ReadSymbols(); MethodDefinition method = injection.MainModule.GetType("Encryptions").Methods.FirstOrDefault(mtd => mtd.Name == "Constants"); List <Conster> ret = new List <Conster>(); TypeDefinition lzma = mod.GetType("Lzma" + mod.GetHashCode()); if (lzma == null) { lzma = CecilHelper.Inject(mod, injection.MainModule.GetType("Lzma")); lzma.IsNotPublic = true; lzma.Name = "Lzma" + mod.GetHashCode(); mod.Types.Add(lzma); } rand.NextBytes(txt.keyBuff); for (int i = 0; i < txt.keyBuff.Length; i++) { txt.keyBuff[i] &= 0x7f; } txt.keyBuff[0] = 7; txt.keyBuff[1] = 0; txt.resKey = (rand.Next(0x20, 0x80) << 24) | (rand.Next(0x20, 0x80) << 32) | (rand.Next(0x20, 0x80) << 16) | (rand.Next(0x20, 0x80) << 0); txt.resId = Encoding.UTF8.GetString(BitConverter.GetBytes(txt.resKey)); txt.key = (uint)rand.Next(); Database.AddEntry("Const", "KeyBuff", txt.keyBuff); Database.AddEntry("Const", "ResKey", txt.resKey); Database.AddEntry("Const", "ResId", txt.resId); Database.AddEntry("Const", "Key", txt.key); Mutator mutator = new Mutator(); MethodDefinition init = injection.MainModule.GetType("Encryptions").Methods.FirstOrDefault(mtd => mtd.Name == injectName); { MethodDefinition cctor = mod.GetType("<Module>").GetStaticConstructor(); MethodDefinition m = CecilHelper.Inject(mod, init); Instruction placeholder = null; mutator.IntKeys = new int[] { txt.resKey }; mutator.Mutate(Random, m.Body); txt.keyInst = mutator.Delayed0; placeholder = mutator.Placeholder; foreach (Instruction inst in m.Body.Instructions) { if (inst.Operand is FieldReference) { if ((inst.Operand as FieldReference).Name == "constTbl") { inst.Operand = constTbl; } else if ((inst.Operand as FieldReference).Name == "constBuffer") { inst.Operand = constBuffer; } } else if (inst.Operand is MethodReference && (inst.Operand as MethodReference).DeclaringType.Name == "LzmaDecoder") { inst.Operand = lzma.NestedTypes .Single(_ => _.Name == "LzmaDecoder").Methods .Single(_ => _.Name == (inst.Operand as MethodReference).Name); } } foreach (var i in m.Body.Variables) { if (i.VariableType.Name == "LzmaDecoder") { i.VariableType = lzma.NestedTypes.Single(_ => _.Name == "LzmaDecoder"); } } if (txt.isNative) { CecilHelper.Replace(m.Body, placeholder, new Instruction[] { Instruction.Create(OpCodes.Call, txt.nativeDecr) }); } else if (txt.isDyn) { Instruction ldloc = placeholder.Previous; m.Body.Instructions.Remove(placeholder.Previous); //ldloc CecilHelper.Replace(m.Body, placeholder, new CecilVisitor(txt.invExp, new Instruction[] { ldloc }).GetInstructions()); } ILProcessor psr = cctor.Body.GetILProcessor(); Instruction begin = cctor.Body.Instructions[0]; for (int i = m.Body.Instructions.Count - 1; i >= 0; i--) { if (m.Body.Instructions[i].OpCode != OpCodes.Ret) { psr.InsertBefore(0, m.Body.Instructions[i]); } } cctor.Body.InitLocals = true; foreach (var i in m.Body.Variables) { cctor.Body.Variables.Add(i); } } byte[] n = new byte[0x10]; int typeDefCount = rand.Next(1, 10); for (int i = 0; i < typeDefCount; i++) { TypeDefinition typeDef = new TypeDefinition( "", ObfuscationHelper.GetRandomName(), TypeAttributes.Class | TypeAttributes.Abstract | TypeAttributes.NotPublic | TypeAttributes.Sealed, mod.TypeSystem.Object); mod.Types.Add(typeDef); int methodCount = rand.Next(1, 5); Database.AddEntry("Const", "ConsterTypes", typeDef.FullName); for (int j = 0; j < methodCount; j++) { MethodDefinition mtd = CecilHelper.Inject(mod, method); mtd.Name = ObfuscationHelper.GetRandomName(); mtd.IsCompilerControlled = true; AddHelper(mtd, HelperAttribute.NoInjection); typeDef.Methods.Add(mtd); Database.AddEntry("Const", "ConsterMethods", mtd.FullName); Conster conster = new Conster(); conster.key0 = (long)rand.Next() * rand.Next(); conster.key1 = (long)rand.Next() * rand.Next(); conster.key2 = (long)rand.Next() * rand.Next(); conster.key3 = rand.Next(); conster.conster = mtd; Database.AddEntry("Const", mtd.FullName, string.Format("{0:X}, {1:X}, {2:X}, {3:X}", conster.key0, conster.key1, conster.key2, conster.key3)); mutator = new Mutator(); mutator.LongKeys = new long[] { conster.key0, conster.key1, conster.key2 }; mutator.IntKeys = new int[] { conster.key3 }; mutator.Mutate(Random, mtd.Body); foreach (Instruction inst in mtd.Body.Instructions) { if (inst.Operand is FieldReference) { if ((inst.Operand as FieldReference).Name == "constTbl") { inst.Operand = constTbl; } else if ((inst.Operand as FieldReference).Name == "constBuffer") { inst.Operand = constBuffer; } } } conster.keyInst = mutator.Delayed0; ret.Add(conster); } } return(ret.ToArray()); }