Program.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using BepInEx.Common;
  2. using Mono.Cecil;
  3. using Mono.Cecil.Cil;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Reflection;
  9. using System.Text;
  10. namespace BepInEx.Patcher
  11. {
  12. class Program
  13. {
  14. static void Error(string message)
  15. {
  16. Console.WriteLine($"Error: {message}");
  17. Console.WriteLine("Press any key to continue...");
  18. Console.ReadKey();
  19. Environment.Exit(1);
  20. }
  21. static void Main(string[] args)
  22. {
  23. string assemblyDLL = Path.GetFullPath("Assembly-CSharp.dll");
  24. if (!File.Exists(assemblyDLL))
  25. Error("\"Assembly-CSharp.dll\" not found.");
  26. string assemblyOriginalDLL = Path.GetFullPath("Assembly-CSharp.dll.bak");
  27. if (!File.Exists(assemblyOriginalDLL))
  28. File.Copy(assemblyDLL, assemblyOriginalDLL);
  29. string unityOutputDLL = Path.GetFullPath("UnityEngine.dll");
  30. if (!File.Exists(unityOutputDLL))
  31. Error("\"UnityEngine.dll\" not found.");
  32. string unityOriginalDLL = Path.GetFullPath("UnityEngine.dll.bak");
  33. if (!File.Exists(unityOriginalDLL))
  34. File.Copy(unityOutputDLL, unityOriginalDLL);
  35. string tmOutputDLL = Path.GetFullPath("TextMeshPro-1.0.55.56.0b12.dll");
  36. if (!File.Exists(tmOutputDLL))
  37. Error("\"TextMeshPro-1.0.55.56.0b12.dll\" not found.");
  38. string tmOriginalDLL = Path.GetFullPath("TextMeshPro-1.0.55.56.0b12.dll.bak");
  39. if (!File.Exists(tmOriginalDLL))
  40. File.Copy(tmOutputDLL, tmOriginalDLL);
  41. string injectedDLL = Path.GetFullPath("BepInEx.dll");
  42. if (!File.Exists(unityOutputDLL))
  43. Error("\"BepInEx.dll\" not found.");
  44. string referenceDir = Directory.GetCurrentDirectory();
  45. var defaultResolver = new DefaultAssemblyResolver();
  46. defaultResolver.AddSearchDirectory(referenceDir);
  47. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyOriginalDLL, new ReaderParameters {
  48. AssemblyResolver = defaultResolver
  49. });
  50. AssemblyDefinition unity = AssemblyDefinition.ReadAssembly(unityOriginalDLL, new ReaderParameters
  51. {
  52. AssemblyResolver = defaultResolver
  53. });
  54. AssemblyDefinition tm = AssemblyDefinition.ReadAssembly(tmOriginalDLL, new ReaderParameters
  55. {
  56. AssemblyResolver = defaultResolver
  57. });
  58. AssemblyDefinition injected = AssemblyDefinition.ReadAssembly(injectedDLL, new ReaderParameters
  59. {
  60. AssemblyResolver = defaultResolver
  61. });
  62. InjectAssembly(assembly, unity, tm, injected);
  63. assembly.Write(assemblyDLL);
  64. unity.Write(unityOutputDLL);
  65. tm.Write(tmOutputDLL);
  66. }
  67. static void InjectAssembly(AssemblyDefinition assembly, AssemblyDefinition unity, AssemblyDefinition tm, AssemblyDefinition injected)
  68. {
  69. //Entry point
  70. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Chainloader").Methods.First(x => x.Name == "Initialize");
  71. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  72. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  73. ILProcessor IL;
  74. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  75. {
  76. IL = loadScene.Body.GetILProcessor();
  77. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  78. }
  79. }
  80. }
  81. }