Ejemplo n.º 1
0
        internal static void InjectUoMod()
        {
            if (Engine.ClientMajor < 7)
            {
                return;
            }

            if (Engine.ClientBuild > 49)
            {
                return;
            }

            String path = AppDomain.CurrentDomain.BaseDirectory + "\\UOMod.dll";

            IntPtr hp = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, true, ClientCommunication.GetUOProcId());

            if (hp != IntPtr.Zero)
            {
                IntPtr hProcess         = IntPtr.Zero;
                IntPtr hThread          = IntPtr.Zero;
                IntPtr pszLibFileRemote = IntPtr.Zero;
                try
                {
                    hProcess = OpenProcess(
                        PROCESS_QUERY_INFORMATION |                // Required by Alpha
                        PROCESS_CREATE_THREAD |                    // For CreateRemoteThread
                        PROCESS_VM_OPERATION |                     // For VirtualAllocEx/VirtualFreeEx
                        PROCESS_VM_WRITE |                         // For WriteProcessMemory
                        PROCESS_VM_READ,
                        false, ClientCommunication.GetUOProcId());

                    if (hProcess == IntPtr.Zero)
                    {
                        return;
                    }

                    int cch = 1 + lstrlen(path);
                    int cb  = cch * sizeof(char);

                    pszLibFileRemote = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)cb, MEM_COMMIT, PAGE_READWRITE);
                    if (pszLibFileRemote == IntPtr.Zero)
                    {
                        return;
                    }

                    UIntPtr bytesWritten;
                    if (!WriteProcessMemory(hProcess, pszLibFileRemote, Encoding.Default.GetBytes(path), (uint)((path.Length + 1) * Marshal.SizeOf(typeof(char))), out bytesWritten))
                    {
                        return;
                    }

                    IntPtr pfnThreadRtn = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA");
                    if (pfnThreadRtn == IntPtr.Zero)
                    {
                        return;
                    }

                    hThread = CreateRemoteThread(hProcess, IntPtr.Zero, 0, pfnThreadRtn, pszLibFileRemote, 0, IntPtr.Zero);
                    if (hThread == IntPtr.Zero)
                    {
                        return;
                    }

                    WaitForSingleObject(hThread, int.MaxValue);
                }
                finally
                {
                    if (pszLibFileRemote != IntPtr.Zero)
                    {
                        VirtualFreeEx(hProcess, pszLibFileRemote, 0, FreeType.MEM_RELEASE);
                    }

                    if (hThread != IntPtr.Zero)
                    {
                        CloseHandle(hThread);
                    }

                    if (hProcess != IntPtr.Zero)
                    {
                        CloseHandle(hProcess);
                    }
                }
            }

            // Thread attesa che la windowhandle sia disponibile
            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                Thread.Sleep(1500);
                m_modhandle = FindWindow("UOModWindow_" + ClientCommunication.FindUOWindow().ToString("x8").ToUpper(), null);

                if (m_modhandle != IntPtr.Zero)
                {
                    EnableOnStartMod();
                }
            }).Start();
        }