public static void Execute(ModuleDefMD loadedMod) { obfMethods = CreateMethods(loadedMod); foreach (TypeDef type in loadedMod.Types) { foreach (MethodDef method in type.Methods) { if (!method.HasBody || !method.Body.HasInstructions || method.IsNative) { continue; } MethodDefMD methodd = method as MethodDefMD; var body = method.Body; body.SimplifyBranches(); body.MaxStack++; List <Instruction> instructions = body.Instructions.ToList(); List <HBlock> Hblocks = new List <HBlock>(); List <HBlock> obfHBlocks = new List <HBlock>(); /*if (body.HasExceptionHandlers) * { * foreach (ExceptionHandler eh in body.ExceptionHandlers) * { * ExceptionHandlerType HType = eh.HandlerType; * List<Instruction> HInstr = new List<Instruction>(); * int HTStart = Array.IndexOf(instructions.ToArray(), eh.TryStart); * int HTEnd = Array.IndexOf(instructions.ToArray(), eh.TryEnd); * if (eh.TryEnd == null) HTEnd = instructions.Count - 1; * for (int i = HTStart; i < HTEnd; i++) * HInstr.Add(instructions[i]); * Hblocks.Add(new HBlock() { instructions = HInstr }); * HInstr.Clear(); * int HCStart = Array.IndexOf(instructions.ToArray(), eh.HandlerStart); * int HCEnd = Array.IndexOf(instructions.ToArray(), eh.HandlerEnd); * if (eh.HandlerEnd == null) HCEnd = instructions.Count - 1; * for (int i = HCStart; i < HCEnd; i++) * HInstr.Add(instructions[i]); * Hblocks.Add(new HBlock() { instructions = HInstr }); * } * foreach (HBlock Hblock in Hblocks) * obfHBlocks.Add(ObfuscateHBlock(Hblock, true)); * } * else*/ obfHBlocks.Add(ObfuscateHBlock(new HBlock() { instructions = instructions }, false)); body.Instructions.Clear(); foreach (HBlock hBlock in obfHBlocks) { foreach (Instruction instr in hBlock.instructions) { body.Instructions.Add(instr); } } body.UpdateInstructionOffsets(); body.SimplifyBranches(); } } }
/// <summary> /// Reads a method body /// </summary> /// <param name="method">Method</param> /// <param name="rva">Method RVA</param> /// <param name="implAttrs">Method impl attrs</param> /// <param name="gpContext">Generic parameter context</param> /// <returns>A <see cref="MethodBody"/> or <c>null</c> if none</returns> internal MethodBody ReadMethodBody(MethodDefMD method, RVA rva, MethodImplAttributes implAttrs, GenericParamContext gpContext) { MethodBody mb; var mDec = methodDecrypter; if (mDec != null && mDec.GetMethodBody(method.OrigRid, rva, method.Parameters, gpContext, out mb)) { var cilBody = mb as CilBody; if (cilBody != null) return InitializeBodyFromPdb(cilBody, method.OrigRid); return mb; } if (rva == 0) return null; var codeType = implAttrs & MethodImplAttributes.CodeTypeMask; if (codeType == MethodImplAttributes.IL) return InitializeBodyFromPdb(ReadCilBody(method.Parameters, rva, gpContext), method.OrigRid); if (codeType == MethodImplAttributes.Native) return new NativeMethodBody(rva); return null; }
/// <summary> /// Returns the owner type of a method /// </summary> /// <param name="method">The method</param> /// <returns>The owner type or <c>null</c> if none</returns> internal TypeDef GetOwnerType(MethodDefMD method) { return ResolveTypeDef(MetaData.GetOwnerTypeOfMethod(method.OrigRid)); }
/// <summary> /// Reads a method body /// </summary> /// <param name="method">Method</param> /// <param name="row">Method's row</param> /// <returns>A <see cref="MethodBody"/> or <c>null</c> if none</returns> internal MethodBody ReadMethodBody(MethodDefMD method, RawMethodRow row) { MethodBody mb; var mDec = methodDecrypter; if (mDec != null && mDec.GetMethodBody(method.Rid, (RVA)row.RVA, method.Parameters, out mb)) return mb; if (row.RVA == 0) return null; var codeType = (MethodImplAttributes)row.ImplFlags & MethodImplAttributes.CodeTypeMask; if (codeType == MethodImplAttributes.IL) return ReadCilBody(method.Parameters, (RVA)row.RVA); if (codeType == MethodImplAttributes.Native) return new NativeMethodBody((RVA)row.RVA); return null; }
/// <summary> /// Reads a method body /// </summary> /// <param name="method">Method</param> /// <param name="row">Method's row</param> /// <returns>A <see cref="MethodBody"/> or <c>null</c> if none</returns> internal MethodBody ReadMethodBody(MethodDefMD method, RawMethodRow row) { if (methodDecrypter != null && methodDecrypter.HasMethodBody(method.Rid)) return methodDecrypter.GetMethodBody(method.Rid, (RVA)row.RVA, method.Parameters); if (row.RVA == 0) return null; var codeType = ((MethodImplAttributes)row.ImplFlags & MethodImplAttributes.CodeTypeMask); if (codeType == MethodImplAttributes.IL) return ReadCilBody(method.Parameters, (RVA)row.RVA); if (codeType == MethodImplAttributes.Native) return new NativeMethodBody((RVA)row.RVA); return null; }