Beispiel #1
0
        public void Init()
        {
            while (true)
            {
                UnityExecutables = GetUnityExecutablePath().Select(p => new UnityBinary(p));
                bool quitRequested = false;
                var  choices       = UnityExecutables.Select(e => new ConsoleChoice {
                    ChoiceDescription = e.ExecutableVersionString, ChoiceAction = () => UnityExecutable = e
                }).ToList();
                ConsoleHelpers.MultipleChoice(choices, () => quitRequested = true);
                if (quitRequested)
                {
                    break;
                }


                //replace with FindRegion here
                UnityVersionContainer currentVersion = FindRegionBytesByVersion(UnityExecutable.ExecutableVersion);

                //RegionBytes = UnityExecutable.ExecutableVersion >= UnityBinaryVersion.UNITY_2018_3_0 ? RegionBytes_2018_3 : RegionBytes_Pre2018_3;
                //JumpInstructionOffset = UnityExecutable.ExecutableVersion >= UnityBinaryVersion.UNITY_2018_3_0 ? JumpInstructionOffsetVersionB : JumpInstructionOffsetVersionA;
                PatchableByteAddress = BinaryHelpers.FindJumpInstructionAddress(UnityExecutable.ExecutablePath, currentVersion.RegionByteArray, currentVersion.InstructionOffset);
                PatchableByteValue   = GetPatchableByteValue(currentVersion);
                if (PatchableByteValue == currentVersion.DarkSkinIndicator)
                {
                    ConsoleHelpers.YesNoChoice("Revert to light skin?", () => PatchExecutable(currentVersion.LightSkinIndicator));
                }
                else
                {
                    ConsoleHelpers.YesNoChoice("Apply dark skin patch?", () => PatchExecutable(currentVersion.DarkSkinIndicator));
                }
            }
        }
        private UnityVersionContainer FindRegionBytesByVersion(UnityBinaryVersion version)
        {
            var versionContainer = new UnityVersionContainer();

            if (version < UnityBinaryVersion.UNITY_2018_3_0)
            {
                versionContainer.RegionByteArray   = RegionBytes_Pre2018_3;
                versionContainer.InstructionOffset = JumpInstructionOffset_Pre2018_3;
                return(versionContainer);
            }

            if (version < UnityBinaryVersion.UNITY_2019_1_0)
            {
                versionContainer.RegionByteArray   = RegionBytes_2018_3;
                versionContainer.InstructionOffset = JumpInstructionOffset_2018_3;
                return(versionContainer);
            }

            if (version < UnityBinaryVersion.UNITY_2019_2_0)
            {
                versionContainer.RegionByteArray   = RegionBytes_2019_0;
                versionContainer.InstructionOffset = JumpInstructionOffset_2019_0;
                return(versionContainer);
            }

            //must be newer, will break as unity adds new versions, needs to be added to sequentially as the AOB changes
            versionContainer.RegionByteArray   = RegionBytes_2019_2;
            versionContainer.InstructionOffset = JumpInstructionOffset_2019_2;
            return(versionContainer);
        }
Beispiel #3
0
        /// <summary>
        /// Gets the value of the patch byte in the Unity executable.
        /// </summary>
        /// <param name="currentVersion"></param>
        /// <returns>The value of the patch byte.</returns>
        private byte GetPatchableByteValue(UnityVersionContainer currentVersion)
        {
            ConsoleHelpers.Write("Patch status: ");
            var jumpInstructionByte = BinaryHelpers.ReadByteAtAddress(UnityExecutable.ExecutablePath, PatchableByteAddress);

            if (jumpInstructionByte == currentVersion.LightSkinIndicator)
            {
                ConsoleHelpers.WriteLine($"Light skin (unpatched) [0x{jumpInstructionByte:X} @ 0x{PatchableByteAddress:X}]", ConsoleColor.Blue);
            }
            else if (jumpInstructionByte == currentVersion.DarkSkinIndicator)
            {
                ConsoleHelpers.WriteLine($"Dark skin (patched) [0x{jumpInstructionByte:X} @ 0x{PatchableByteAddress:X}]", ConsoleColor.Green);
            }
            else
            {
                ConsoleHelpers.WriteLine($"Unknown status [0x{jumpInstructionByte:X} @ 0x{PatchableByteAddress:X}]", ConsoleColor.Red);
                ConsoleHelpers.ExitOnInput();
            }
            return(jumpInstructionByte);
        }