static void Init(string processName)
        {
            while (!MemoryEditor.Init(processName))
            {
            }

            Chat.RecordCommandSource();
            DetectLastPuckToucherTeam();
            NoRespawns();
            MinHalves();
            Longergameovertime();
            Longerwarmuptime();
            NoRespawnOnRoundStart();
            WarmupTimeAfterGoals();
            ResetPuckAfterGame();
            Chat.FlushLastCommand();
            Tools.ResumeGame();
            MemoryEditor.WriteInt(28, 0x04130B8);    //server version
            MemoryEditor.WriteInt(60000, 0x79348AC); //warmup
            MemoryEditor.WriteInt(0, 0x7933C9C);
            byte[] warmup_time = new byte[10] {
                0xC7, 0x05, 0x14, 0x3E, 0x89, 0x01, 0xB8, 0x0B, 0x00, 0x00
            };
            int warmup_add = 0x00411EDC;

            MemoryEditor.WriteBytes(warmup_time, warmup_add);
            byte[] twohalves = new byte[7] {
                0x83, 0x3D, 0x10, 0x3E, 0x89, 0x01, 0x02
            };
            int twohalves_add = 0x00407924;

            MemoryEditor.WriteBytes(twohalves, twohalves_add);
        }
 public static void DetectLastPuckToucherTeam()
 {
     MemoryEditor.WriteBytes(new byte[74] {
         0x69, 0xC0, 0x98, 0x00, 0x00, 0x00, 0x8B, 0x88, 0x68, 0x0A, 0x53, 0x00, 0x89, 0x0D, 0x58, 0x49, 0xD3, 0x07, 0x8B, 0x88, 0x64, 0x0A, 0x53, 0x00, 0x89, 0x0D, 0x5C, 0x49, 0xD3, 0x07, 0xA1, 0x20, 0x3E, 0x89, 0x01, 0x8B, 0x0D, 0x20, 0x3E, 0x89, 0x01, 0x83, 0xE9, 0x01, 0x83, 0xE1, 0x03, 0x8B, 0x55, 0xDC, 0x69, 0xD2, 0xD8, 0x0B, 0x00, 0x00, 0x8B, 0x04, 0x8D, 0x24, 0x3E, 0x89, 0x01, 0x3B, 0x82, 0xE8, 0xB6, 0x87, 0x01, 0xE9, 0x18, 0xC7, 0xEC, 0xFF
     }, 0x00540700);
     MemoryEditor.WriteBytes(new byte[6] {
         0xE9, 0x9F, 0x38, 0x13, 0x00, 0x90
     }, 0x0040CE5C);
 }
 public static void MinHalves()
 {
     MemoryEditor.WriteBytes(new byte[25] {
         0xC7, 0x05, 0x08, 0x3E, 0x89, 0x01, 0x60, 0xEA, 0x00, 0x00, 0xC7, 0x05, 0x9C, 0x48, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x44, 0x78, 0xEC, 0xFF
     }, 0x00540100);
     MemoryEditor.WriteBytes(new byte[10] {
         0xE9, 0xA8, 0x87, 0x13, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90
     }, 0x00407953);
 }
 public static void Longergameovertime()
 {
     MemoryEditor.WriteBytes(new byte[25] {
         0xC7, 0x05, 0x14, 0x3E, 0x89, 0x01, 0xB8, 0x0B, 0x00, 0x00, 0xC7, 0x05, 0x9C, 0x48, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x55, 0x77, 0xEC, 0xFF
     }, 0x00540200);
     MemoryEditor.WriteBytes(new byte[10] {
         0xE9, 0x97, 0x88, 0x13, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90
     }, 0x00407964);
 }
 public static void Longerwarmuptime()
 {
     MemoryEditor.WriteBytes(new byte[35] {
         0xC7, 0x05, 0x14, 0x3E, 0x89, 0x01, 0xB8, 0x0B, 0x00, 0x00, 0xC7, 0x05, 0x9C, 0x3C, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xC7, 0x05, 0xA0, 0x48, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x18, 0x34, 0xEC, 0xFF
     }, 0x00540300);
     MemoryEditor.WriteBytes(new byte[10] {
         0xE9, 0xCA, 0xCB, 0x13, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90
     }, 0x00403731);
 }
 public static void NoRespawnOnRoundStart()
 {
     MemoryEditor.WriteBytes(new byte[26] {
         0x90, 0xC7, 0x05, 0x9C, 0x3C, 0xD3, 0x07, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x05, 0xA0, 0x48, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0x48, 0x75, 0xEC, 0xFF
     }, 0x00540400);
     MemoryEditor.WriteBytes(new byte[5] {
         0xE9, 0x9E, 0x8A, 0x13, 0x00
     }, 0x0040795D);
 }
 public static void ResetPuckAfterGame()
 {
     MemoryEditor.WriteBytes(new byte[35] {
         0xC7, 0x05, 0x14, 0x3E, 0x89, 0x01, 0xD0, 0x07, 0x00, 0x00, 0xC7, 0x05, 0x9C, 0x3C, 0xD3, 0x07, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x05, 0xA0, 0x48, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0xE0, 0x73, 0xEC, 0xFF
     }, 0x00540600);
     MemoryEditor.WriteBytes(new byte[10] {
         0xE9, 0x02, 0x8C, 0x13, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90
     }, 0x004079F9);
 }
 public static void WarmupTimeAfterGoals()
 {
     MemoryEditor.WriteBytes(new byte[25] {
         0xC7, 0x05, 0x00, 0x32, 0x89, 0x01, 0xD0, 0x07, 0x00, 0x00, 0xC7, 0x05, 0x9C, 0x3C, 0xD3, 0x07, 0x01, 0x00, 0x00, 0x00, 0xE9, 0xCD, 0x74, 0xEC, 0xFF
     }, 0x00540500);
     MemoryEditor.WriteBytes(new byte[10] {
         0xE9, 0x1F, 0x8B, 0x13, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90
     }, 0x004079DC);
 }
Exemple #9
0
 private void RestoreDefaults()
 {
     pitch        = defaultPitch;
     yaw          = defaultYaw;
     cameraHeight = defaultCameraHeight;
     drawDistance = defaultDrawDistance;
     m.WriteFloat(PitchAddress, defaultPitch);
     m.WriteFloat(YawAddress, defaultYaw);
     m.WriteFloat(CameraHeightAddress, defaultCameraHeight);
     m.WriteFloat(DrawDistanceAddress, defaultDrawDistance);
     m.WriteBytes(CameraModeAddress, BitConverter.GetBytes(defaultCameraMode));
 }
        public static void NoRespawns()
        {
            byte[] code_original = new byte[7] {
                0xE9, 0x6B, 0x86, 0x13, 0x00, 0x90, 0x90
            };
            byte[] code_inject = new byte[22] {
                0x83, 0x3D, 0x0C, 0x3E, 0x89, 0x01, 0x01, 0xC7, 0x05, 0x9C, 0x3C, 0xD3, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x81, 0x79, 0xEC, 0xFF
            };

            int addr_original = 0x00407990;
            int addr_inject   = 0x00540000;

            MemoryEditor.WriteBytes(code_inject, addr_inject);
            MemoryEditor.WriteBytes(code_original, addr_original);
        }
        public static void PuckCollision(bool value)
        {
            byte[] disable1_false = new byte[5] {
                0xE8, 0x90, 0x52, 0x00, 0x00
            };
            byte[] disable1_true = new byte[5] {
                0x90, 0x90, 0x90, 0x90, 0x90
            };

            byte[] disable2_false = new byte[5] {
                0xE8, 0xFB, 0x52, 0x00, 0x00
            };
            byte[] disable2_true = new byte[5] {
                0x90, 0x90, 0x90, 0x90, 0x90
            };

            byte[] disableph_false = new byte[5] {
                0xE8, 0xA5, 0x54, 0x00, 0x00
            };
            byte[] disableph_true = new byte[5] {
                0x90, 0x90, 0x90, 0x90, 0x90
            };

            int disable1  = 0x0040C5AB;
            int disable2  = 0x0040C540;
            int disableph = 0x0040C396;

            if (value && puck_enabled)
            {
                Debug.Print("collision disabled");
                MemoryEditor.WriteBytes(disable1_true, disable1);
                MemoryEditor.WriteBytes(disable2_true, disable2);
                MemoryEditor.WriteBytes(disableph_true, disableph);
                Puck.Position           = new HQMVector(Puck.Position.X, 0.2f, Puck.Position.Z);
                Puck.Velocity           = HQMVector.Zero;
                Puck.RotationalVelocity = HQMVector.Zero;
                puck_enabled            = false;
            }
            if (!value && !puck_enabled)
            {
                Debug.Print("collision enabled");
                MemoryEditor.WriteBytes(disable1_false, disable1);
                MemoryEditor.WriteBytes(disable2_false, disable2);
                MemoryEditor.WriteBytes(disableph_false, disableph);
                puck_enabled = true;
            }
        }
Exemple #12
0
        public String fetchRoflDownloadUrl(UInt64 matchId)
        {
            IntPtr funcAddr = _leagueClientMemoryEditor.AllocateMemory(asm.Length);
            //Structs not packed so 0x18 instead of 0x14 and 0xC is skipped
            IntPtr paramsAddr = _leagueClientMemoryEditor.AllocateMemory(0x18);

            //Write our custom function
            _leagueClientMemoryEditor.WriteBytes(funcAddr, asm);
            //Function Address is the address which our custom asm calls
            _leagueClientMemoryEditor.WriteUInt32(paramsAddr, _functionAddress);
            //Class Address is ECX, a class which is initialized which gets passed in to above function
            _leagueClientMemoryEditor.WriteUInt32(paramsAddr + 0x4, _classAddress);
            //Successful call will place a ptr to the download link here
            _leagueClientMemoryEditor.WriteUInt32(paramsAddr + 0x8, 0);
            //+16 (0x10) not +12 (0xC) because it wasnt packed, MatchID is a MatchID
            _leagueClientMemoryEditor.WriteUInt64(paramsAddr + 0x10, matchId);
            //Call Func and wait for completion
            _leagueClientMemoryEditor.WaitForSingleObject(_leagueClientMemoryEditor.CreateRemoteThread(funcAddr, paramsAddr));
            IntPtr downloadUrlIntPtr;

            //Read the download Ptr
            _leagueClientMemoryEditor.ReadIntPtr(paramsAddr + 0x8, out downloadUrlIntPtr);
            String downloadUrl = "";

            //If its null then call failed, Match Might not exist, User might not be logged in etc
            if (downloadUrlIntPtr != IntPtr.Zero)
            {
                _leagueClientMemoryEditor.ReadNullTerminatedString(downloadUrlIntPtr, out downloadUrl);
            }
            //Free Memory of the ones we allocated and also the injected function
            //TODO: Get LeagueClient to free the memory of the download URL though this is minor, though still a memory leak
            //TODO: Potentially just allocated and reuse memory once?
            _leagueClientMemoryEditor.FreeMemory(funcAddr);
            _leagueClientMemoryEditor.FreeMemory(paramsAddr);
            return(downloadUrl);
        }
Exemple #13
0
        /*
         *  Byte[] asm = { 0xE8, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x00, 0xA1, 0xC0, 0x00, 0x00, 0x00 };
         *  X86Disassembler d = new X86Disassembler(new MemoryStreamReader(asm));
         *  X86Instruction i = d.ReadNextInstruction();
         *  i = d.ReadNextInstruction();
         *  i = d.ReadNextInstruction();
         */

        private static void LoadWadFiles(IntPtr function1Address, int funcOffset, IntPtr functionAddress, IntPtr ECDSA)
        {
            uint functionLength;
            uint functionLength1;
            uint ECDSALen;

            MemoryEditor.FindPattern(@"\xC2\x04\x00\xCC", "xxxx", ECDSA, out ECDSALen);
            MemoryEditor.FindPattern(@"\xC2\x08\x00\xCC", "xxxx", functionAddress, out functionLength);
            MemoryEditor.FindPattern(@"\xC3\x57\xE8\x00\x00\x00\x00\xCC", "xxx????x", function1Address, out functionLength1);
            functionLength  = (functionLength - (uint)functionAddress) + 4;
            ECDSALen        = (ECDSALen - (uint)ECDSA) + 4;
            functionLength1 = (functionLength1 - (uint)function1Address) + 8;
            //Steal the function:
            Byte[] asmECDSA;
            MemoryEditor.ReadBytes(ECDSA, (int)ECDSALen, out asmECDSA);
            Byte[] asm1;
            MemoryEditor.ReadBytes(function1Address, (int)functionLength1, out asm1);
            Byte[] asm;
            MemoryEditor.ReadBytes(functionAddress, (int)functionLength, out asm);
            //Allocate and copy the function to our new memory
            IntPtr AllocatedMemory = MemoryEditor.AllocateMemory(0x1000);
            //MemoryEditor.WriteBytes(AllocatedMemory, asm);
            //Fix the bytecode for the new offsets:
            X86Disassembler disassembler = new X86Disassembler(new MemoryStreamReader(asmECDSA));

            while (disassembler.BaseStream.Position != disassembler.BaseStream.Length)
            {
                X86Instruction instruction = disassembler.ReadNextInstruction();
                if (instruction.Mnemonic == X86Mnemonic.Je && instruction.Offset == 0x49)
                {
                    Buffer.BlockCopy(new Byte[] { 0x90, 0x90 }, 0, asmECDSA, (int)instruction.Offset, 2);
                    continue;
                }
                if (instruction.Mnemonic != X86Mnemonic.Call || (instruction.Operand1 != null && instruction.Operand1.OperandUsage == X86OperandUsage.DwordPointer))
                {
                    continue;
                }

                if (instruction.Operand1.Value.ToString() == "Eax")
                {
                    continue;
                }
                //Fix the Call:
                int offset;
                MemoryEditor.ReadInt(ECDSA + (int)instruction.Offset + 1, out offset);
                int callAddress = (5 + (int)instruction.Offset + (int)ECDSA) + offset;
                offset = callAddress - ((int)AllocatedMemory + (int)instruction.Offset + 5);
                Buffer.BlockCopy(BitConverter.GetBytes(offset), 0, asmECDSA, (int)instruction.Offset + 1, 4);
            }

            MemoryEditor.WriteBytes(AllocatedMemory, asmECDSA);
            AllocatedMemory += asmECDSA.Length;

            disassembler = new X86Disassembler(new MemoryStreamReader(asm));
            while (disassembler.BaseStream.Position != disassembler.BaseStream.Length)
            {
                X86Instruction instruction = disassembler.ReadNextInstruction();

                /*if (instruction.Mnemonic == X86Mnemonic.Jne)
                 * {
                 *  Buffer.BlockCopy(new Byte[] { 0xEB }, 0, asm, (int)instruction.Offset, 1);
                 *  continue;
                 * }*/

                if (instruction.Mnemonic != X86Mnemonic.Call || (instruction.Operand1 != null && instruction.Operand1.OperandUsage == X86OperandUsage.DwordPointer))
                {
                    continue;
                }

                if (instruction.Offset == 0x128)
                {
                    Buffer.BlockCopy(BitConverter.GetBytes(((int)AllocatedMemory - asmECDSA.Length) - ((int)AllocatedMemory + (int)instruction.Offset + 5))
                                     , 0, asm, (int)instruction.Offset + 1, 4);
                    continue;
                }
                //Fix the Call:
                int offset;
                MemoryEditor.ReadInt(functionAddress + (int)instruction.Offset + 1, out offset);
                int callAddress = (5 + (int)instruction.Offset + (int)functionAddress) + offset;
                offset = callAddress - ((int)AllocatedMemory + (int)instruction.Offset + 5);
                Buffer.BlockCopy(BitConverter.GetBytes(offset), 0, asm, (int)instruction.Offset + 1, 4);
            }

            MemoryEditor.WriteBytes(AllocatedMemory, asm);
            AllocatedMemory += asm.Length;

            disassembler = new X86Disassembler(new MemoryStreamReader(asm1));
            while (disassembler.BaseStream.Position != disassembler.BaseStream.Length)
            {
                X86Instruction instruction = disassembler.ReadNextInstruction();

                if (instruction.Mnemonic != X86Mnemonic.Call || (instruction.Operand1 != null && instruction.Operand1.OperandUsage == X86OperandUsage.DwordPointer))
                {
                    continue;
                }

                if (instruction.Offset == funcOffset)
                {
                    Buffer.BlockCopy(BitConverter.GetBytes(((int)AllocatedMemory - asm.Length) - ((int)AllocatedMemory + (int)instruction.Offset + 5))
                                     , 0, asm1, (int)instruction.Offset + 1, 4);
                    continue;
                }

                //Fix the Call:
                int offset;
                MemoryEditor.ReadInt(function1Address + (int)instruction.Offset + 1, out offset);
                int callAddress = (5 + (int)instruction.Offset + (int)function1Address) + offset;
                offset = callAddress - ((int)AllocatedMemory + (int)instruction.Offset + 5);
                Buffer.BlockCopy(BitConverter.GetBytes(offset), 0, asm1, (int)instruction.Offset + 1, 4);
            }
            MemoryEditor.WriteBytes(AllocatedMemory, asm1);
            IntPtr LoadWadFunction = AllocatedMemory;

            AllocatedMemory += asm1.Length;
            //Allocate Variables
            IntPtr StringAddress = AllocatedMemory + 0x10;

            //0x38 for failedFunctionCallback
            AllocatedMemory = StringAddress + 0x110;
            byte[] customAsm =
            {
                0x60, //pushad
                0x6A, 0x00,
                0x68, 0x00, 0x00, 0x00, 0x00,
                0xE8, 0x00, 0x00, 0x00, 0x00,
                0x5B,      //pop x2,
                0x5B,
                0x61,      //popad
                0xEB, 0xFE //Endless Loop so we know to correct the EIP
            };
            Buffer.BlockCopy(BitConverter.GetBytes((uint)StringAddress), 0, customAsm, 0x4, 4);
            Buffer.BlockCopy(BitConverter.GetBytes((uint)LoadWadFunction - ((uint)AllocatedMemory + 0xD)), 0, customAsm, 0x9, 4);
            MemoryEditor.WriteBytes(AllocatedMemory, customAsm);

            int lockedEip = (int)AllocatedMemory + customAsm.Length - 2;

            MemoryEditor.Suspend();
            MemoryEditor.Context context = MemoryEditor.GetThreadContext();
            uint originalEip             = context.Eip;

            //Load Each WADFile:
            foreach (String wadFile in WadFiles)
            {
                MemoryEditor.Suspend();
                context.Eip = (uint)AllocatedMemory;
                MemoryEditor.SetThreadContext(context);
                MemoryEditor.WriteNullTerminatedString(StringAddress, wadFile);
                MemoryEditor.Resume();
                //NOTE: THE CODE HAS TO RUN ON MAIN THREAD TO PROPERLY LOAD WADS
                //MemoryEditor.WaitForSingleObject(MemoryEditor.CreateRemoteThread(AllocatedMemory, IntPtr.Zero));
                bool loop = true;
                while (loop)
                {
                    context = MemoryEditor.GetThreadContext();
                    loop    = context.Eip != lockedEip;
                    MemoryEditor.Resume();
                }
            }
            context.Eip = originalEip;
            MemoryEditor.SetThreadContext(context);
            MemoryEditor.FreeMemory(AllocatedMemory);
        }
Exemple #14
0
        public static void Highlight(int value) //0=disable 1=red 2=blue
        {
            int shape_a      = 0x0043585D;
            int shape_h      = 0x004358EA;
            int shape_b      = 0x004355B9;
            int color        = 0x004355BE;
            int color_change = 0x04600081;
            int y            = 0x07D3490C;

            if (value == 0 && highlighted)
            {
                Debug.Print("disable highlight");
                MemoryEditor.WriteBytes(new byte[2] {
                    0x6A, 0x04
                }, shape_a);
                MemoryEditor.WriteBytes(new byte[7] {
                    0xC7, 0x45, 0xF0, 0x00, 0x00, 0x80, 0x3C
                }, shape_h);
                MemoryEditor.WriteBytes(new byte[5] {
                    0x68, 0x00, 0x00, 0x80, 0x3E
                }, shape_b);
                MemoryEditor.WriteBytes(new byte[6] {
                    0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00
                }, color);
                MemoryEditor.WriteFloat(352f, y);
                System.Threading.Thread.Sleep(1000);
                highlighted = false;
            }

            if (value == 1 && !highlighted)
            {
                highlighted = true;
                Debug.Print("red highlight");
                MemoryEditor.WriteBytes(new byte[2] {
                    0x6A, 0x06
                }, shape_a);
                MemoryEditor.WriteBytes(new byte[7] {
                    0xC7, 0x45, 0xF0, 0x00, 0x00, 0x80, 0x3F
                }, shape_h);
                MemoryEditor.WriteBytes(new byte[5] {
                    0x68, 0x00, 0x00, 0x80, 0x3F
                }, shape_b);
                MemoryEditor.WriteBytes(new byte[6] {
                    0xE9, 0xBE, 0xAA, 0x1C, 0x04, 0x90
                }, color);
                MemoryEditor.WriteBytes(new byte[14] {
                    0x6A, 0x00, 0x6A, 0x00, 0x68, 0x00, 0x00, 0x80, 0x3F, 0xE9, 0x35, 0x55, 0xE3, 0xFB
                }, color_change);
                MemoryEditor.WriteFloat(1352f, y);
            }
            if (value == 2 && !highlighted)
            {
                highlighted = true;
                Debug.Print("blue highlight");
                MemoryEditor.WriteBytes(new byte[2] {
                    0x6A, 0x06
                }, shape_a);
                MemoryEditor.WriteBytes(new byte[7] {
                    0xC7, 0x45, 0xF0, 0x00, 0x00, 0x80, 0x3F
                }, shape_h);
                MemoryEditor.WriteBytes(new byte[5] {
                    0x68, 0x00, 0x00, 0x80, 0x3F
                }, shape_b);
                MemoryEditor.WriteBytes(new byte[6] {
                    0xE9, 0xBE, 0xAA, 0x1C, 0x04, 0x90
                }, color);
                MemoryEditor.WriteBytes(new byte[14] {
                    0x68, 0x00, 0x00, 0x80, 0x3F, 0x6A, 0x00, 0x6A, 0x00, 0xE9, 0x35, 0x55, 0xE3, 0xFB
                }, color_change);
                MemoryEditor.WriteFloat(1352f, y);
            }
        }
Exemple #15
0
        static void Init(string processName)
        {
            while (!MemoryEditor.Init(processName))
            {
            }

            MemoryEditor.WriteInt(28, 0x045B290); //server version
            MemoryEditor.WriteInt(1, 0x4476164);  //hide rink
            MemoryEditor.WriteInt(1, 0x813AF88);  //show names on minimap

            byte[] stick_drawing = new byte[5] {
                0x90, 0x90, 0x90, 0x90, 0x90
            };
            int stick_drawing_add = 0x0043410A;

            MemoryEditor.WriteBytes(stick_drawing, stick_drawing_add);

            byte[] code_original = new byte[9] {
                0xE9, 0x0C, 0xBA, 0x1C, 0x04, 0x90, 0x90, 0x90, 0x90
            };
            byte[] code_inject = new byte[20] {
                0x68, 0x33, 0x33, 0x73, 0x3F, 0x68, 0x33, 0x33, 0x73, 0x3F, 0x68, 0x33, 0x33, 0x73, 0x3F, 0xE9, 0xE4, 0x45, 0xE3, 0xFB
            };

            int addr_original = 0x004345EF;
            int addr_inject   = 0x04600000;

            MemoryEditor.WriteBytes(code_inject, addr_inject);
            MemoryEditor.WriteBytes(code_original, addr_original);

            byte[] cbluegoal_original = new byte[9] {
                0xE9, 0x3D, 0xBA, 0x1C, 0x04, 0x90, 0x90, 0x90, 0x90
            };
            byte[] cbluegoal_inj = new byte[20] {
                0x68, 0x33, 0x33, 0x73, 0x3F, 0x68, 0x33, 0x33, 0x73, 0x3F, 0x68, 0x33, 0x33, 0x73, 0x3F, 0xE9, 0xB3, 0x45, 0xE3, 0xFB
            };

            int bluegoal_original = 0x004345DE;
            int bluegoal_inject   = 0x04600020;

            MemoryEditor.WriteBytes(cbluegoal_inj, bluegoal_inject);
            MemoryEditor.WriteBytes(cbluegoal_original, bluegoal_original);

            byte[] spacecolor_o = new byte[6] {
                0xE9, 0x36, 0x86, 0x1C, 0x04, 0x90
            };
            byte[] spacecolor_i = new byte[20] {
                0x68, 0x14, 0xAE, 0x47, 0x3F, 0x68, 0xA8, 0xC6, 0x2B, 0x3F, 0x68, 0x12, 0x83, 0x20, 0x3F, 0xE9, 0xB7, 0x79, 0xE3, 0xFB
            };

            int spacolor_a      = 0x00437A05;
            int spacecolor_ainj = 0x04600040;

            MemoryEditor.WriteBytes(spacecolor_i, spacecolor_ainj);
            MemoryEditor.WriteBytes(spacecolor_o, spacolor_a);

            byte[] warmupovrr_o = new byte[6] {
                0xE9, 0x29, 0xD6, 0x1C, 0x04, 0x90
            };
            byte[] warmupovrr_i = new byte[27] {
                0x0F, 0x8E, 0x72, 0x2B, 0xE3, 0xFB, 0x81, 0x3D, 0xA0, 0x3D, 0xD3, 0x07, 0xD0, 0x07, 0x00, 0x00, 0x0F, 0x8D, 0x62, 0x2B, 0xE3, 0xFB, 0xE9, 0xBD, 0x29, 0xE3, 0xFB
            };

            int warmupovrr_a    = 0x00432A32;
            int warmupovrr_ainj = 0x04600060;

            MemoryEditor.WriteBytes(warmupovrr_i, warmupovrr_ainj);
            MemoryEditor.WriteBytes(warmupovrr_o, warmupovrr_a);
            //score bg
            MemoryEditor.WriteBytes(new byte[5] {
                0xE9, 0xF6, 0xD6, 0x1C, 0x04
            }, 0x004329C6);
            MemoryEditor.WriteBytes(new byte[50] {
                0x68, 0xCD, 0xCC, 0x4C, 0x3E, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x68, 0x00, 0x00, 0xF0, 0x41, 0x68, 0x00, 0x00, 0x16, 0x43, 0x68, 0x00, 0x00, 0xE0, 0x40, 0x68, 0x00, 0x00, 0x57, 0x44, 0x6A, 0xFF, 0xE8, 0xA8, 0x0B, 0xE5, 0xFB, 0xA1, 0x98, 0x3D, 0xD3, 0x07, 0xE9, 0xD8, 0x28, 0xE3, 0xFB
            }, 0x046000C1);
            //puck color in minimap
            MemoryEditor.WriteBytes(new byte[6] {
                0xE9, 0xD5, 0xDA, 0x1C, 0x04, 0x90
            }, 0x00432621);
            MemoryEditor.WriteBytes(new byte[20] {
                0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0xE9, 0x18, 0x25, 0xE3, 0xFB
            }, 0x046000FB);
            //intermission message and short
            MemoryEditor.WriteBytes(new byte[5] {
                0x68, 0x68, 0x49, 0xD3, 0x07
            }, 0x00432C4C);
            MemoryEditor.WriteBytes(new byte[5] {
                0x68, 0xE0, 0x48, 0xD3, 0x07
            }, 0x00432E7D);
            //show timers
            MemoryEditor.WriteBytes(new byte[5] {
                0xE9, 0x20, 0xD7, 0x1C, 0x04
            }, 0x004329F0);
            //07D3490C
            MemoryEditor.WriteBytes(new byte[158] {
                0xE8, 0x66, 0xFF, 0xE4, 0xFB, 0x83, 0xC4, 0x24, 0x83, 0x3D, 0xB4, 0x49, 0xD3, 0x07, 0x00, 0x74, 0x3D, 0xA1, 0xB4, 0x49, 0xD3, 0x07, 0x99, 0xB9, 0x64, 0x00, 0x00, 0x00, 0xF7, 0xF9, 0x50, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x6A, 0x21, 0x68, 0x00, 0x00, 0x20, 0x42, 0x68, 0x00, 0x00, 0xB0, 0x43, 0x68, 0x00, 0x00, 0x00, 0x44, 0x68, 0x50, 0x75, 0x46, 0x00, 0xE8, 0x1D, 0xFF, 0xE4, 0xFB, 0x83, 0x3D, 0xA0, 0x3D, 0xD3, 0x07, 0x00, 0x0F, 0x84, 0x85, 0x28, 0xE3, 0xFB, 0xA1, 0xA0, 0x3D, 0xD3, 0x07, 0x99, 0xB9, 0x64, 0x00, 0x00, 0x00, 0xF7, 0xF9, 0x50, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x68, 0x00, 0x00, 0x80, 0x3F, 0x6A, 0x21, 0x68, 0x00, 0x00, 0x20, 0x42, 0xFF, 0x35, 0x0C, 0x49, 0xD3, 0x07, 0x68, 0x00, 0x00, 0x00, 0x44, 0x68, 0x50, 0x75, 0x46, 0x00, 0xE8, 0xD2, 0xFE, 0xE4, 0xFB, 0xE9, 0x42, 0x28, 0xE3, 0xFB
            }, 0x04600115);
        }