protected override void Execute(ConfuserContext context, ProtectionParameters parameters)
            {
                if (!parameters.Targets.Any())
                {
                    return;
                }

                Mode         mode = parameters.GetParameter(context, context.CurrentModule, "mode", Mode.Normal);
                IModeHandler modeHandler;

                switch (mode)
                {
                case Mode.Normal:
                    modeHandler = new NormalMode();
                    break;

                case Mode.Anti:
                    modeHandler = new AntiMode();
                    break;

                case Mode.JIT:
                    modeHandler = new JITMode();
                    break;

                default:
                    throw new UnreachableException();
                }
                modeHandler.HandleInject((AntiTamperProtection)Parent, context, parameters);
                context.Annotations.Set(context.CurrentModule, HandlerKey, modeHandler);
            }
Beispiel #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 (ModuleDef module in parameters.Targets.OfType <ModuleDef>())
                {
                    AntiMode 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 (IDnlibDef member in attr.FindDefinitions())
                        {
                            marker.Mark(member, (Protection)Parent);
                            name.Analyze(member);
                        }
                        name.SetCanRename(attr, false);
                        break;

                    default:
                        throw new UnreachableException();
                    }

                    IEnumerable <IDnlibDef> members = InjectHelper.Inject(rtType, module.GlobalType, module);

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

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

                        bool 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;
                            }

                            CustomAttribute 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);
                        }
                    }
                }
            }