private static void CreateModsDirectory() { try { string currentPath = Directory.GetCurrentDirectory(); DirectoryInfo dataDir = new DirectoryInfo(currentPath); ModLogger.WriteLine(ConsoleColor.Green, "OSVersion: {0}", Environment.OSVersion.ToString()); ModLogger.WriteLine(ConsoleColor.Green, "PlatformID: {0}", Environment.OSVersion.Platform.ToString()); DirectoryInfo oniBaseDirectory; PlatformID pid = Environment.OSVersion.Platform; if (pid == PlatformID.MacOSX) { oniBaseDirectory = dataDir.Parent?.Parent; } else if (pid == PlatformID.Unix) { oniBaseDirectory = dataDir.Parent?.Parent; } else { oniBaseDirectory = dataDir.Parent?.Parent.Parent; } string modsDir = Path.Combine(oniBaseDirectory?.FullName, "Mods"); ModLogger.WriteLine(ConsoleColor.Green, "Creating mods folder is: " + modsDir); if (!Directory.Exists(modsDir)) { Directory.CreateDirectory(modsDir); } } catch (Exception ex) { ModLogger.WriteLine(ConsoleColor.Red, "Creating mods folder failed! " + ex); } }
public static AssemblyDefinition GetAssembly(string assemblyName, string directoryPath) { ReaderParameters parameters = new ReaderParameters(); DefaultAssemblyResolver assemblyResolver = new DefaultAssemblyResolver(); FileStream assemblyStream = new FileStream(directoryPath + assemblyName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); assemblyResolver.AddSearchDirectory(Path.GetDirectoryName(directoryPath)); parameters.AssemblyResolver = assemblyResolver; try { AssemblyDefinition assemblyDef = AssemblyDefinition.ReadAssembly(assemblyStream, parameters); assemblyStream.Flush(); assemblyStream.Close(); return(assemblyDef); } catch (Exception ex) { ModLogger.WriteLine(ConsoleColor.Red, "Could not read assembly: " + ex); throw; } }
private static void Main(string[] args) { ModLogger.Init(); string currentPath = Directory.GetCurrentDirectory(); // Paths return garbage for Mac //try //{ // FindCorrectPaths(); //} //catch //{ // Console.Error.WriteLine("Could not find your game files. Please make sure Injector.exe is at least inside the Managed folder."); //} // if (!string.IsNullOrEmpty(Program._modsFolderPath) && !string.IsNullOrEmpty(Program._managedFolderPath)) { try { ModLogger.WriteLine(ConsoleColor.Green, "Reading modules: \n"); new InjectionManager(FileManager).InjectDefaultAndBackup(); // new InjectionManager(FileManager, Program._managedFolderPath).InjectDefaultAndBackup(); ModLogger.WriteLine(ConsoleColor.Green, "\nDone! Patch Sucessful."); } catch (Exception exc) { ModLogger.WriteLine(ConsoleColor.Red, "Encountered errors: " + exc); } } CreateModsDirectory(); ModLogger.WriteLine(ConsoleColor.Green, "\nPress any key to continue . . . "); Console.ReadKey(); }
public static void Inject(AssemblyDefinition game, string outputPath) { TypeDefinition launchInitializer = game.MainModule.GetType(string.Empty, "LaunchInitializer"); if (launchInitializer == null) { ModLogger.WriteLine(ConsoleColor.Red, "LaunchInitializer not found"); Console.Read(); return; } MethodDefinition launchInitializerAwake = launchInitializer.Methods.FirstOrDefault(method => method.Name == "Awake"); if (launchInitializerAwake == null) { ModLogger.WriteLine(ConsoleColor.Red, "LaunchInitializer.Awake not found"); Console.Read(); return; } ILProcessor p = launchInitializerAwake.Body.GetILProcessor(); Collection <Instruction> i = p.Body.Instructions; /* * i.Insert(0, p.Create(OpCodes.Nop)); * i.Insert(1, p.Create(OpCodes.Nop)); * i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<Assembly>(game, "GetExecutingAssembly"))); * i.Insert(3, p.Create(OpCodes.Callvirt, Util.ImportMethod<Assembly>(game, "get_Location", typeof(string)))); * i.Insert(4, p.Create(OpCodes.Call, Util.ImportMethod<System.IO.Path>(game, "GetDirectoryName"))); */ int index = 0; // Assembly.LoadFrom(Application.dataPath + "/Mods/ModLoader.dll") // i.Insert(0, p.Create(OpCodes.Call, Util.ImportMethod<Application>(game, "get_dataPath"))); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <Assembly>(game, "GetExecutingAssembly"))); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Assembly>(game, "get_Location"))); // i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<Path>(game, "GetDirectoryName", typeof(string)))); Type[] types = { typeof(string) }; i.Insert( index++, p.Create( OpCodes.Call, game.MainModule.ImportReference(typeof(Path).GetMethod("GetDirectoryName", types)))); // i.Insert(3, p.Create(OpCodes.Stloc_0)); i.Insert(index++, p.Create(OpCodes.Ldstr, "/ModLoader.dll")); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <string>( game, "Concat", typeof(string), typeof(string)))); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <Assembly>(game, "LoadFrom", typeof(string)))); // .GetType("spaar.ModLoader.Internal.Activator() i.Insert(index++, p.Create(OpCodes.Ldstr, "ModLoader.Activator")); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Assembly>(game, "GetType", typeof(string)))); // .GetMethod("Activate") i.Insert(index++, p.Create(OpCodes.Ldstr, "Activate")); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Type>(game, "GetMethod", typeof(string)))); // .Invoke(null, null); i.Insert(index++, p.Create(OpCodes.Ldnull)); i.Insert(index++, p.Create(OpCodes.Ldnull)); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <MethodBase>( game, "Invoke", typeof(object), typeof(object[])))); i.Insert(index++, p.Create(OpCodes.Pop)); /* * // Assembly.LoadFrom(Application.dataPath + "/Mods/SpaarModLoader.dll") * i.Insert(0, p.Create(OpCodes.Call, Util.ImportMethod<Application>(game, "get_dataPath"))); * i.Insert(1, p.Create(OpCodes.Ldstr, "/Mods/SpaarModLoader.dll")); * i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<string>(game, "Concat", typeof(string), typeof(string)))); * i.Insert(3, p.Create(OpCodes.Call, Util.ImportMethod<Assembly>(game, "LoadFrom", typeof(string)))); * // .GetType("spaar.ModLoader.Internal.Activator() * i.Insert(4, p.Create(OpCodes.Ldstr, "spaar.ModLoader.Internal.Activator")); * i.Insert(5, p.Create(OpCodes.Callvirt, Util.ImportMethod<Assembly>(game, "GetType", typeof(string)))); * // .GetMethod("Activate") * i.Insert(6, p.Create(OpCodes.Ldstr, "Activate")); * i.Insert(7, p.Create(OpCodes.Callvirt, Util.ImportMethod<Type>(game, "GetMethod", typeof(string)))); * // .Invoke(null, null); * i.Insert(8, p.Create(OpCodes.Ldnull)); * i.Insert(9, p.Create(OpCodes.Ldnull)); * i.Insert(10, p.Create(OpCodes.Callvirt, Util.ImportMethod<MethodBase>(game, "Invoke", typeof(object), typeof(object[])))); * i.Insert(11, p.Create(OpCodes.Pop)); */ game.Write(outputPath); }
public static void Inject(ref AssemblyDefinition game, string className, string methodName) { TypeDefinition launchInitializer = game.MainModule.GetType(string.Empty, className); if (launchInitializer == null) { ModLogger.WriteLine(ConsoleColor.Red, className + " not found"); Console.Read(); return; } MethodDefinition launchInitializerAwake = launchInitializer.Methods.FirstOrDefault(method => method.Name == methodName); if (launchInitializerAwake == null) { ModLogger.WriteLine(ConsoleColor.Red, className + "." + methodName + " not found"); Console.Read(); return; } ILProcessor p = launchInitializerAwake.Body.GetILProcessor(); Collection <Instruction> i = p.Body.Instructions; /* * i.Insert(0, p.Create(OpCodes.Nop)); * i.Insert(1, p.Create(OpCodes.Nop)); * i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<Assembly>(game, "GetExecutingAssembly"))); * i.Insert(3, p.Create(OpCodes.Callvirt, Util.ImportMethod<Assembly>(game, "get_Location", typeof(string)))); * i.Insert(4, p.Create(OpCodes.Call, Util.ImportMethod<System.IO.Path>(game, "GetDirectoryName"))); */ int index = 0; // Assembly.LoadFrom(Application.dataPath + "/Mods/ModLoader.dll") // i.Insert(0, p.Create(OpCodes.Call, Util.ImportMethod<Application>(game, "get_dataPath"))); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <Assembly>(game, "GetExecutingAssembly"))); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Assembly>(game, "get_Location"))); // i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<Path>(game, "GetDirectoryName", typeof(string)))); Type[] types = { typeof(string) }; i.Insert( index++, p.Create( OpCodes.Call, game.MainModule.ImportReference(typeof(Path).GetMethod("GetDirectoryName", types)))); // i.Insert(3, p.Create(OpCodes.Stloc_0)); i.Insert(index++, p.Create(OpCodes.Ldstr, Path.DirectorySeparatorChar + "ModLoader.dll")); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <string>( game, "Concat", typeof(string), typeof(string)))); i.Insert( index++, p.Create( OpCodes.Call, ImportMethod <Assembly>(game, "LoadFrom", typeof(string)))); // .GetType("spaar.ModLoader.Internal.Activator() i.Insert(index++, p.Create(OpCodes.Ldstr, "ModLoader.Activator")); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Assembly>(game, "GetType", typeof(string)))); // .GetMethod("Activate") i.Insert(index++, p.Create(OpCodes.Ldstr, "Activate")); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <Type>(game, "GetMethod", typeof(string)))); // .Invoke(null, null); i.Insert(index++, p.Create(OpCodes.Ldnull)); i.Insert(index++, p.Create(OpCodes.Ldnull)); i.Insert( index++, p.Create( OpCodes.Callvirt, ImportMethod <MethodBase>( game, "Invoke", typeof(object), typeof(object[])))); i.Insert(index++, p.Create(OpCodes.Pop)); /* * // Assembly.LoadFrom(Application.dataPath + "/Mods/SpaarModLoader.dll") * i.Insert(0, p.Create(OpCodes.Call, Util.ImportMethod<Application>(game, "get_dataPath"))); * i.Insert(1, p.Create(OpCodes.Ldstr, "/Mods/SpaarModLoader.dll")); * i.Insert(2, p.Create(OpCodes.Call, Util.ImportMethod<string>(game, "Concat", typeof(string), typeof(string)))); * i.Insert(3, p.Create(OpCodes.Call, Util.ImportMethod<Assembly>(game, "LoadFrom", typeof(string)))); * // .GetType("spaar.ModLoader.Internal.Activator() * i.Insert(4, p.Create(OpCodes.Ldstr, "spaar.ModLoader.Internal.Activator")); * i.Insert(5, p.Create(OpCodes.Callvirt, Util.ImportMethod<Assembly>(game, "GetType", typeof(string)))); * // .GetMethod("Activate") * i.Insert(6, p.Create(OpCodes.Ldstr, "Activate")); * i.Insert(7, p.Create(OpCodes.Callvirt, Util.ImportMethod<Type>(game, "GetMethod", typeof(string)))); * // .Invoke(null, null); * i.Insert(8, p.Create(OpCodes.Ldnull)); * i.Insert(9, p.Create(OpCodes.Ldnull)); * i.Insert(10, p.Create(OpCodes.Callvirt, Util.ImportMethod<MethodBase>(game, "Invoke", typeof(object), typeof(object[])))); * i.Insert(11, p.Create(OpCodes.Pop)); */ //game.MainModule.Types.Add(CecilHelper.GetTypeDefinition(CecilHelper.GetModule("Injector2.exe", Directory.GetCurrentDirectory()+Path.DirectorySeparatorChar), "Radioactive")); /* * MethodDefinition ctor = diseases.Methods.FirstOrDefault(method => method.Name == ".ctor"); * ILProcessor p2 = ctor.Body.GetILProcessor(); * Collection<Instruction> ix = p2.Body.Instructions; * * index = 0; * ix.Insert( * index++, * p.Create( * OpCodes.Ldarg_0)); * * * ix.Insert( * index++, * p.Create( * OpCodes.Newobj, * ImportMethod<string>( * game, * ".ctor", * typeof(ResourceSet)))); * ix.Insert( * index++, * p.Create( * OpCodes.Call, * ImportMethod<string>( * game, * "Add", * typeof(Klei.AI.Disease)))); * ix.Insert( * index++, * p.Create( * OpCodes.Stfld, * ImportField<string>( * game, * "Radioactive"))); * * ix.Insert( * index++, * p.Create( * OpCodes.Ldarg_0)); */ }