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