Пример #1
0
        public IEnumerable <Instruction> EmitDecrypt(MethodDef init, REContext ctx, Local block, Local key)
        {
            for (int i = 0; i < 0x10; i++)
            {
                yield return(Instruction.Create(OpCodes.Ldloc, block));

                yield return(Instruction.Create(OpCodes.Ldc_I4, i));

                yield return(Instruction.Create(OpCodes.Ldloc, block));

                yield return(Instruction.Create(OpCodes.Ldc_I4, i));

                yield return(Instruction.Create(OpCodes.Ldelem_U4));

                yield return(Instruction.Create(OpCodes.Ldloc, key));

                yield return(Instruction.Create(OpCodes.Ldc_I4, i));

                yield return(Instruction.Create(OpCodes.Ldelem_U4));

                yield return(Instruction.Create(OpCodes.Xor));

                yield return(Instruction.Create(OpCodes.Stelem_I4));
            }
        }
Пример #2
0
        protected internal override void Execute(DotProtectContext context, ProtectionParameters parameters)
        {
            if (parameters.Targets.Any())
            {
                if (!UTF8String.IsNullOrEmpty(context.CurrentModule.Assembly.Culture))
                {
                    context.Logger.DebugFormat("Skipping resource encryption for satellite assembly '{0}'.",
                                               context.CurrentModule.Assembly.FullName);
                    return;
                }
                var compression = context.Registry.GetService <ICompressionService>();
                var name        = context.Registry.GetService <INameService>();
                var marker      = context.Registry.GetService <IMarkerService>();
                var rt          = context.Registry.GetService <IRuntimeService>();
                var moduleCtx   = new REContext {
                    Random    = context.Registry.GetService <IRandomService>().GetRandomGenerator(Parent.Id),
                    Context   = context,
                    Module    = context.CurrentModule,
                    Marker    = marker,
                    DynCipher = context.Registry.GetService <IDynCipherService>(),
                    Name      = name
                };

                // Extract parameters
                moduleCtx.Mode = parameters.GetParameter(context, context.CurrentModule, "mode", Mode.Normal);

                switch (moduleCtx.Mode)
                {
                case Mode.Normal:
                    moduleCtx.ModeHandler = new NormalMode();
                    break;

                case Mode.Dynamic:
                    moduleCtx.ModeHandler = new DynamicMode();
                    break;

                default:
                    throw new UnreachableException();
                }

                // Inject helpers
                MethodDef decomp = compression.GetRuntimeDecompressor(context.CurrentModule, member => {
                    name.MarkHelper(member, marker, (Protection)Parent);
                    if (member is MethodDef)
                    {
                        ProtectionParameters.GetParameters(context, member).Remove(Parent);
                    }
                });
                InjectHelpers(context, compression, rt, moduleCtx);

                // Mutate codes
                MutateInitializer(moduleCtx, decomp);

                MethodDef cctor = context.CurrentModule.GlobalType.FindStaticConstructor();
                cctor.Body.Instructions.Insert(0, Instruction.Create(OpCodes.Call, moduleCtx.InitMethod));

                new MDPhase(moduleCtx).Hook();
            }
        }
Пример #3
0
        void MutateInitializer(REContext moduleCtx, MethodDef decomp)
        {
            moduleCtx.InitMethod.Body.SimplifyMacros(moduleCtx.InitMethod.Parameters);
            List <Instruction> instrs = moduleCtx.InitMethod.Body.Instructions.ToList();

            for (int i = 0; i < instrs.Count; i++)
            {
                Instruction instr  = instrs[i];
                var         method = instr.Operand as IMethod;
                if (instr.OpCode == OpCodes.Call)
                {
                    if (method.DeclaringType.Name == "Mutation" &&
                        method.Name == "Crypt")
                    {
                        Instruction ldBlock = instrs[i - 2];
                        Instruction ldKey   = instrs[i - 1];
                        Debug.Assert(ldBlock.OpCode == OpCodes.Ldloc && ldKey.OpCode == OpCodes.Ldloc);
                        instrs.RemoveAt(i);
                        instrs.RemoveAt(i - 1);
                        instrs.RemoveAt(i - 2);
                        instrs.InsertRange(i - 2, moduleCtx.ModeHandler.EmitDecrypt(moduleCtx.InitMethod, moduleCtx, (Local)ldBlock.Operand, (Local)ldKey.Operand));
                    }
                    else if (method.DeclaringType.Name == "Lzma" &&
                             method.Name == "Decompress")
                    {
                        instr.Operand = decomp;
                    }
                }
            }
            moduleCtx.InitMethod.Body.Instructions.Clear();
            foreach (Instruction instr in instrs)
            {
                moduleCtx.InitMethod.Body.Instructions.Add(instr);
            }

            MutationHelper.ReplacePlaceholder(moduleCtx.InitMethod, arg => {
                var repl = new List <Instruction>();
                repl.AddRange(arg);
                repl.Add(Instruction.Create(OpCodes.Dup));
                repl.Add(Instruction.Create(OpCodes.Ldtoken, moduleCtx.DataField));
                repl.Add(Instruction.Create(OpCodes.Call, moduleCtx.Module.Import(
                                                typeof(RuntimeHelpers).GetMethod("InitializeArray"))));
                return(repl.ToArray());
            });
            moduleCtx.Context.Registry.GetService <IConstantService>().ExcludeMethod(moduleCtx.Context, moduleCtx.InitMethod);
        }
Пример #4
0
        public IEnumerable <Instruction> EmitDecrypt(MethodDef init, REContext ctx, Local block, Local key)
        {
            StatementBlock encrypt, decrypt;

            ctx.DynCipher.GenerateCipherPair(ctx.Random, out encrypt, out decrypt);
            var ret = new List <Instruction>();

            var codeGen = new CodeGen(block, key, init, ret);

            codeGen.GenerateCIL(decrypt);
            codeGen.Commit(init.Body);

            var dmCodeGen = new DMCodeGen(typeof(void), new[] {
                Tuple.Create("{BUFFER}", typeof(uint[])),
                Tuple.Create("{KEY}", typeof(uint[]))
            });

            dmCodeGen.GenerateCIL(encrypt);
            encryptFunc = dmCodeGen.Compile <Action <uint[], uint[]> >();

            return(ret);
        }
Пример #5
0
        void InjectHelpers(DotProtectContext context, ICompressionService compression, IRuntimeService rt, REContext moduleCtx)
        {
            var rtName = context.Packer != null ? "DotProtect.Runtime.Resource_Packer" : "DotProtect.Runtime.Resource";
            IEnumerable <IDnlibDef> members = InjectHelper.Inject(rt.GetRuntimeType(rtName), context.CurrentModule.GlobalType, context.CurrentModule);

            foreach (IDnlibDef member in members)
            {
                if (member.Name == "Initialize")
                {
                    moduleCtx.InitMethod = (MethodDef)member;
                }
                moduleCtx.Name.MarkHelper(member, moduleCtx.Marker, (Protection)Parent);
            }

            var dataType = new TypeDefUser("", moduleCtx.Name.RandomName(), context.CurrentModule.CorLibTypes.GetTypeRef("System", "ValueType"));

            dataType.Layout      = TypeAttributes.ExplicitLayout;
            dataType.Visibility  = TypeAttributes.NestedPrivate;
            dataType.IsSealed    = true;
            dataType.ClassLayout = new ClassLayoutUser(1, 0);
            moduleCtx.DataType   = dataType;
            context.CurrentModule.GlobalType.NestedTypes.Add(dataType);
            moduleCtx.Name.MarkHelper(dataType, moduleCtx.Marker, (Protection)Parent);

            moduleCtx.DataField = new FieldDefUser(moduleCtx.Name.RandomName(), new FieldSig(dataType.ToTypeSig()))
            {
                IsStatic     = true,
                HasFieldRVA  = true,
                InitialValue = new byte[0],
                Access       = FieldAttributes.CompilerControlled
            };
            context.CurrentModule.GlobalType.Fields.Add(moduleCtx.DataField);
            moduleCtx.Name.MarkHelper(moduleCtx.DataField, moduleCtx.Marker, (Protection)Parent);
        }
Пример #6
0
 public MDPhase(REContext ctx)
 {
     this.ctx = ctx;
 }