예제 #1
0
        TypeDef GetKeyAttr(RPContext ctx)
        {
            if (keyAttrs == null)
            {
                keyAttrs = new Tuple <TypeDef, Func <int, int> > [0x10];
            }

            int index = ctx.Random.NextInt32(keyAttrs.Length);

            if (keyAttrs[index] == null)
            {
                TypeDef rtType       = ctx.Context.Registry.GetService <IRuntimeService>().GetRuntimeType("Confuser.Runtime.RefProxyKey");
                TypeDef injectedAttr = InjectHelper.Inject(rtType, ctx.Module);
                injectedAttr.Name      = ctx.Name.RandomName();
                injectedAttr.Namespace = string.Empty;

                Expression expression, inverse;
                var        var    = new Variable("{VAR}");
                var        result = new Variable("{RESULT}");

                ctx.DynCipher.GenerateExpressionPair(
                    ctx.Random,
                    new VariableExpression {
                    Variable = var
                }, new VariableExpression {
                    Variable = result
                },
                    ctx.Depth, out expression, out inverse);

                var expCompiled = new DMCodeGen(typeof(int), new[] { Tuple.Create("{VAR}", typeof(int)) })
                                  .GenerateCIL(expression)
                                  .Compile <Func <int, int> >();

                MethodDef ctor = injectedAttr.FindMethod(".ctor");
                MutationHelper.ReplacePlaceholder(ctor, arg =>
                {
                    var invCompiled = new List <Instruction>();
                    new CodeGen(arg, ctor, invCompiled).GenerateCIL(inverse);
                    return(invCompiled.ToArray());
                });
                keyAttrs[index] = Tuple.Create(injectedAttr, expCompiled);

                ctx.Module.AddAsNonNestedType(injectedAttr);

                foreach (IDnlibDef def in injectedAttr.FindDefinitions())
                {
                    if (def.Name == "GetHashCode")
                    {
                        ctx.Name.MarkHelper(def, ctx.Marker, ctx.Protection);
                        ((MethodDef)def).Access = MethodAttributes.Public;
                    }
                    else
                    {
                        ctx.Name.MarkHelper(def, ctx.Marker, ctx.Protection);
                    }
                }
            }
            return(keyAttrs[index].Item1);
        }
예제 #2
0
            protected override void Execute(ConfuserContext context, ProtectionParameters parameters)
            {
                var rt     = context.Registry.GetService <IRuntimeService>();
                var marker = context.Registry.GetService <IMarkerService>();
                var name   = context.Registry.GetService <INameService>();

                foreach (var module in parameters.Targets.OfType <ModuleDef>())
                {
                    var mode = parameters.GetParameter(context, module, "mode", AntiMode.Safe);

                    TypeDef      rtType;
                    TypeDef      attr     = null;
                    const string attrName = "System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute";
                    switch (mode)
                    {
                    case AntiMode.Safe:
                        rtType = rt.GetRuntimeType("Confuser.Runtime.AntiDebugSafe");
                        break;

                    case AntiMode.Win32:
                        rtType = rt.GetRuntimeType("Confuser.Runtime.AntiDebugWin32");
                        break;

                    case AntiMode.Antinet:
                        rtType = rt.GetRuntimeType("Confuser.Runtime.AntiDebugAntinet");

                        attr = rt.GetRuntimeType(attrName);
                        module.Types.Add(attr = InjectHelper.Inject(attr, module));
                        foreach (var member in attr.FindDefinitions())
                        {
                            marker.Mark(member, (Protection)Parent);
                            name.Analyze(member);
                        }
                        name.SetCanRename(attr, false);
                        break;

                    default:
                        throw new UnreachableException();
                    }

                    var members = InjectHelper.Inject(rtType, module.GlobalType, module);

                    var cctor = module.GlobalType.FindStaticConstructor();
                    var init  = (MethodDef)members.Single(method => method.Name == "Initialize");
                    cctor.Body.Instructions.Insert(0, Instruction.Create(OpCodes.Call, init));

                    foreach (var member in members)
                    {
                        marker.Mark(member, (Protection)Parent);
                        name.Analyze(member);

                        var ren = true;
                        if (member is MethodDef)
                        {
                            var method = (MethodDef)member;
                            if (method.Access == MethodAttributes.Public)
                            {
                                method.Access = MethodAttributes.Assembly;
                            }

                            if (!method.IsConstructor)
                            {
                                method.IsSpecialName = false;
                            }
                            else
                            {
                                ren = false;
                            }

                            var ca = method.CustomAttributes.Find(attrName);
                            if (ca != null)
                            {
                                ca.Constructor = attr.FindMethod(".ctor");
                            }
                        }
                        else if (member is FieldDef)
                        {
                            var field = (FieldDef)member;
                            if (field.Access == FieldAttributes.Public)
                            {
                                field.Access = FieldAttributes.Assembly;
                            }

                            if (field.IsLiteral)
                            {
                                field.DeclaringType.Fields.Remove(field);
                                continue;
                            }
                        }
                        if (ren)
                        {
                            member.Name = name.ObfuscateName(member.Name, RenameMode.Unicode);
                            name.SetCanRename(member, false);
                        }
                    }
                }
            }