InitMethodDesc GetInitMethod(RPContext ctx, IRPEncoding encoding) { InitMethodDesc[] initDescs; if (!inits.TryGetValue(encoding, out initDescs)) { inits[encoding] = initDescs = new InitMethodDesc[ctx.InitCount]; } int index = ctx.Random.NextInt32(initDescs.Length); if (initDescs[index] == null) { TypeDef rtType = ctx.Context.Registry.GetService <IRuntimeService>().GetRuntimeType("Confuser.Runtime.RefProxyStrong"); MethodDef injectedMethod = InjectHelper.Inject(rtType.FindMethod("Initialize"), ctx.Module); ctx.Module.GlobalType.Methods.Add(injectedMethod); injectedMethod.Access = MethodAttributes.PrivateScope; injectedMethod.Name = ctx.Name.RandomName(); ctx.Name.SetCanRename(injectedMethod, false); ctx.Marker.Mark(injectedMethod, ctx.Protection); var desc = new InitMethodDesc { Method = injectedMethod }; // Field name has five bytes, each bytes has different order & meaning int[] order = Enumerable.Range(0, 5).ToArray(); ctx.Random.Shuffle(order); desc.OpCodeIndex = order[4]; desc.TokenNameOrder = new int[4]; Array.Copy(order, 0, desc.TokenNameOrder, 0, 4); desc.TokenByteOrder = Enumerable.Range(0, 4).Select(x => x * 8).ToArray(); ctx.Random.Shuffle(desc.TokenByteOrder); var keyInjection = new int[9]; Array.Copy(desc.TokenNameOrder, 0, keyInjection, 0, 4); Array.Copy(desc.TokenByteOrder, 0, keyInjection, 4, 4); keyInjection[8] = desc.OpCodeIndex; MutationHelper.InjectKeys(injectedMethod, Enumerable.Range(0, 9).ToArray(), keyInjection); // Encoding MutationHelper.ReplacePlaceholder(injectedMethod, arg => { return(encoding.EmitDecode(injectedMethod, ctx, arg)); }); desc.Encoding = encoding; initDescs[index] = desc; } return(initDescs[index]); }
private InitMethodDesc GetInitMethod(RPContext ctx, IRPEncoding encoding) { InitMethodDesc[] descArray; if (!this.inits.TryGetValue(encoding, out descArray)) { this.inits[encoding] = descArray = new InitMethodDesc[ctx.InitCount]; } int index = ctx.Random.NextInt32(descArray.Length); if (descArray[index] == null) { TypeDef runtimeType = ctx.Context.Registry.GetService <IRuntimeService>().GetRuntimeType("Confuser.Runtime.RefProxyStrong"); MethodDef injectedMethod = InjectHelper.Inject(runtimeType.FindMethod("Initialize"), ctx.Module); ctx.Module.GlobalType.Methods.Add(injectedMethod); injectedMethod.Access = MethodAttributes.CompilerControlled; injectedMethod.Name = ctx.Name.RandomName(); ctx.Name.SetCanRename(injectedMethod, false); ctx.Marker.Mark(injectedMethod, ctx.Protection); InitMethodDesc desc = new InitMethodDesc { Method = injectedMethod }; int[] list = Enumerable.Range(0, 5).ToArray <int>(); ctx.Random.Shuffle <int>(list); desc.OpCodeIndex = list[4]; desc.TokenNameOrder = new int[4]; Array.Copy(list, 0, desc.TokenNameOrder, 0, 4); desc.TokenByteOrder = (from x in Enumerable.Range(0, 4) select x * 8).ToArray <int>(); ctx.Random.Shuffle <int>(desc.TokenByteOrder); int[] destinationArray = new int[9]; Array.Copy(desc.TokenNameOrder, 0, destinationArray, 0, 4); Array.Copy(desc.TokenByteOrder, 0, destinationArray, 4, 4); destinationArray[8] = desc.OpCodeIndex; MutationHelper.InjectKeys(injectedMethod, Enumerable.Range(0, 9).ToArray <int>(), destinationArray); MutationHelper.ReplacePlaceholder(injectedMethod, arg => encoding.EmitDecode(injectedMethod, ctx, arg)); desc.Encoding = encoding; descArray[index] = desc; } return(descArray[index]); }
private InitMethodDesc GetInitMethod(RPContext ctx, IRPEncoding encoding) { InitMethodDesc[] initDescs; if (!inits.TryGetValue(encoding, out initDescs)) inits[encoding] = initDescs = new InitMethodDesc[ctx.InitCount]; int index = ctx.Random.NextInt32(initDescs.Length); if (initDescs[index] == null) { TypeDef rtType = ctx.Context.Registry.GetService<IRuntimeService>().GetRuntimeType("Confuser.Runtime.RefProxyStrong"); MethodDef injectedMethod = InjectHelper.Inject(rtType.FindMethod("Initialize"), ctx.Module); ctx.Module.GlobalType.Methods.Add(injectedMethod); injectedMethod.Access = MethodAttributes.PrivateScope; injectedMethod.Name = ctx.Name.RandomName(); ctx.Name.SetCanRename(injectedMethod, false); ctx.Marker.Mark(injectedMethod); var desc = new InitMethodDesc { Method = injectedMethod }; // Field name has five bytes, each bytes has different order & meaning int[] order = Enumerable.Range(0, 5).ToArray(); ctx.Random.Shuffle(order); desc.OpCodeIndex = order[4]; desc.TokenNameOrder = new int[4]; Array.Copy(order, 0, desc.TokenNameOrder, 0, 4); desc.TokenByteOrder = Enumerable.Range(0, 4).Select(x => x * 8).ToArray(); ctx.Random.Shuffle(desc.TokenByteOrder); var keyInjection = new int[9]; Array.Copy(desc.TokenNameOrder, 0, keyInjection, 0, 4); Array.Copy(desc.TokenByteOrder, 0, keyInjection, 4, 4); keyInjection[8] = desc.OpCodeIndex; MutationHelper.InjectKeys(injectedMethod, Enumerable.Range(0, 9).ToArray(), keyInjection); // Encoding MutationHelper.ReplacePlaceholder(injectedMethod, arg => { return encoding.EmitDecode(injectedMethod, ctx, arg); }); desc.Encoding = encoding; initDescs[index] = desc; } return initDescs[index]; }