Ejemplo n.º 1
0
        public void Patch()
        {
            HelperClass.SetLogger(null);             //HelperClass.OnError would otherwise show errors if a NetPackage class doesn't override Process,Read or Write
            TypeDefinition[] netPackageTypes = HelperClass.findTypes(module,
                                                                     HelperClass.CombinedComparer <MethodDefinition>(
                                                                         HelperClass.MemberNameComparer <MethodDefinition>("GetPackageType"),
                                                                         HelperClass.MethodReturnTypeComparer("PackageType"),
                                                                         HelperClass.MethodNegAttributeComparer(MethodAttributes.Abstract))
                                                                     );
            if (netPackageTypes == null || netPackageTypes.Length == 0)
            {
                logger.Error("Unable to find any NetPackage classes!");
                return;
            }

            foreach (TypeDefinition curPackageType in netPackageTypes)
            {
                MethodDefinition processMethod = HelperClass.findMember <MethodDefinition>(module, curPackageType, false,
                                                                                           HelperClass.MemberNameComparer <MethodDefinition>("Process"),
                                                                                           HelperClass.MethodReturnTypeComparer("System.Void"),
                                                                                           HelperClass.MethodParametersComparer("World", "INetConnectionCallbacks"));
                if (processMethod != null)
                {
                    MethodBody body = processMethod.Body;
                    if (body != null)
                    {
                        ILProcessor        proc      = body.GetILProcessor();
                        List <Instruction> eventHook = HookHelper.Instance.prepareEventHook(processMethod, "ProcessPacketEvent",
                                                                                            new Instruction[][] {
                            new Instruction[] {
                                proc.Create(OpCodes.Ldarg_0),
                            },
                            new Instruction[] {
                                proc.Create(OpCodes.Ldc_I4_0),
                                proc.Create(OpCodes.Box, module.Import(mscorlibModule.GetType("System.Boolean"))),
                            },
                            new Instruction[] {
                                proc.Create(OpCodes.Ldarg_1),
                            },
                            new Instruction[] {
                                proc.Create(OpCodes.Ldarg_2),
                            },
                        }
                                                                                            );
                        eventHook.Add(proc.Create(OpCodes.Ldc_I4_1));
                        eventHook.Add(proc.Create(OpCodes.Ldelem_Ref));
                        eventHook.Add(proc.Create(OpCodes.Unbox_Any, module.Import(mscorlibModule.GetType("System.Boolean"))));
                        eventHook.Add(proc.Create(OpCodes.Brfalse, body.Instructions[0]));
                        eventHook.Add(proc.Create(OpCodes.Ret));
                        HookHelper.insertAt(body, 0, eventHook.ToArray());
                    }
                }
                MethodDefinition readMethod = HelperClass.findMember <MethodDefinition>(module, curPackageType, false,
                                                                                        HelperClass.MemberNameComparer <MethodDefinition>("Read"),
                                                                                        HelperClass.MethodReturnTypeComparer("System.Void"),
                                                                                        HelperClass.MethodParametersComparer("System.IO.BinaryReader"));
                if (readMethod != null)
                {
                    MethodBody body = readMethod.Body;
                    if (body != null)
                    {
                        ILProcessor        proc      = body.GetILProcessor();
                        List <Instruction> eventHook = HookHelper.Instance.prepareEventHook(readMethod, "ReadPacketFromBufEvent",
                                                                                            new Instruction[][] {
                            new Instruction[] {
                                proc.Create(OpCodes.Ldarg_0),
                            },
                        }
                                                                                            );
                        eventHook.Add(proc.Create(OpCodes.Pop));
                        HookHelper.insertAt(body, body.Instructions.Count - 1, eventHook.ToArray());
                    }
                }
                MethodDefinition writeMethod = HelperClass.findMember <MethodDefinition>(module, curPackageType, false,
                                                                                         HelperClass.MemberNameComparer <MethodDefinition>("Write"),
                                                                                         HelperClass.MethodReturnTypeComparer("System.Void"),
                                                                                         HelperClass.MethodParametersComparer("System.IO.BinaryWriter"));
                if (writeMethod != null)
                {
                    MethodBody body = writeMethod.Body;
                    if (body != null)
                    {
                        ILProcessor        proc      = body.GetILProcessor();
                        List <Instruction> eventHook = HookHelper.Instance.prepareEventHook(writeMethod, "WritePacketToBufEvent",
                                                                                            new Instruction[][] {
                            new Instruction[] {
                                proc.Create(OpCodes.Ldarg_0),
                            },
                            new Instruction[] {
                                proc.Create(OpCodes.Ldc_I4_0),
                                proc.Create(OpCodes.Box, module.Import(mscorlibModule.GetType("System.Boolean"))),
                            },
                        }
                                                                                            );
                        eventHook.Add(proc.Create(OpCodes.Ldc_I4_1));
                        eventHook.Add(proc.Create(OpCodes.Ldelem_Ref));
                        eventHook.Add(proc.Create(OpCodes.Unbox_Any, module.Import(mscorlibModule.GetType("System.Boolean"))));
                        eventHook.Add(proc.Create(OpCodes.Brfalse, body.Instructions[0]));
                        eventHook.Add(proc.Create(OpCodes.Ret));
                        HookHelper.insertAt(body, 0, eventHook.ToArray());
                    }
                }
            }
        }