Пример #1
0
        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);
            }
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }
Пример #5
0
        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));
             */
        }