Esempio n. 1
0
        private static bool doCreateRemoteThread(Process pToBeInjected, string sDllPath, out string sError, out IntPtr hwnd)
        {
            try
            {
                sError = "";
                IntPtr hProcess = WINAPI.OpenProcess(0x43a, 1, (uint)pToBeInjected.Id);
                hwnd = hProcess;
                if (hProcess == IntPtr.Zero)
                {
                    Console.WriteLine("Error: dCRT Code: " + Marshal.GetLastWin32Error());
                    return(false);
                }
                IntPtr procAddress = WINAPI.GetProcAddress(WINAPI.GetModuleHandle("kernel32.dll"), "LoadLibraryA");
                if (procAddress == IntPtr.Zero)
                {
                    Console.WriteLine("Unable to find address of \"LoadLibraryA\".\n");
                    Console.WriteLine("Error code: " + Marshal.GetLastWin32Error());
                    return(false);
                }
                IntPtr lpBaseAddress = WINAPI.VirtualAllocEx(hProcess, IntPtr.Zero, (IntPtr)sDllPath.Length, 0x3000, 0x40);
                if ((lpBaseAddress == IntPtr.Zero) && (lpBaseAddress == IntPtr.Zero))
                {
                    Console.WriteLine("Unable to allocate memory to target process.\n");
                    Console.WriteLine("Error code: " + Marshal.GetLastWin32Error());
                    return(false);
                }
                byte[] byteLength = GetByteLength(sDllPath);
                IntPtr zero       = IntPtr.Zero;
                WINAPI.WriteProcessMemory(hProcess, lpBaseAddress, byteLength, (uint)byteLength.Length, out zero);
                //if (Marshal.GetLastWin32Error() != 0)
                //{
                //    sError = "Unable to write memory to process.";
                //    sError = sError + "Error code: " + Marshal.GetLastWin32Error();
                //    return false;
                //}
                if (WINAPI.CreateRemoteThread(hProcess, IntPtr.Zero, IntPtr.Zero, procAddress, lpBaseAddress, 0, IntPtr.Zero) == IntPtr.Zero)
                {
                    Console.WriteLine("Memoryspace Error on LOAD_DLL\n");
                    Console.WriteLine("Error code: " + Marshal.GetLastWin32Error());
                    return(false);
                }
                WINAPI.VirtualFreeEx(hProcess, IntPtr.Zero, UIntPtr.Zero, 0x8000);
                return(true);
            }
            catch (Exception exception)
            {
                sError = "";

                hwnd = IntPtr.Zero;
                Console.WriteLine(exception.ToString());
                return(false);
            }
        }
Esempio n. 2
0
            /// <summary>
            /// Opens all existing local processes with the specified name.
            /// </summary>
            /// <returns>A list with process handles for each process.</returns>
            protected List <IntPtr> GetHandles()
            {
                var processes      = Process.GetProcessesByName(this.ProcessName);
                var processHandles = new List <IntPtr>();

                foreach (var process in processes)
                {
                    var processHandle   = WINAPI.OpenProcess(this.DesiredAccess, false, process.Id);
                    var systemErrorCode = Marshal.GetLastWin32Error();
                    if ((this.IgnoreException) || (systemErrorCode == 0))
                    {
                        processHandles.Add(processHandle);
                    }
                    else
                    {
                        throw new Win32ErrorException(systemErrorCode);
                    }
                }
                return(processHandles);
            }
Esempio n. 3
0
        private static bool CRT(
            Process pToBeInjected,
            string sDllPath,
            out string sError,
            out IntPtr hwnd)
        {
            sError = String.Empty; //in case we encounter no errors

            IntPtr hndProc = WINAPI.OpenProcess(
                (0x2 | 0x8 | 0x10 | 0x20 | 0x400), //create thread, query info, operation
                //write, and read
                1,
                (uint)pToBeInjected.Id);

            hwnd = hndProc;

            if (hndProc == (IntPtr)0)
            {
                sError  = "Unable to attatch to process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr lpLLAddress = WINAPI.GetProcAddress(
                WINAPI.GetModuleHandle("kernel32.dll"),
                "LoadLibraryA");

            if (lpLLAddress == (IntPtr)0)
            {
                sError  = "Unable to find address of \"LoadLibraryA\".\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr lpAddress = WINAPI.VirtualAllocEx(
                hndProc,
                (IntPtr)null,
                (IntPtr)sDllPath.Length, //520 bytes should be enough
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_COMMIT |
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_RESERVE,
                (uint)WINAPI.VAE_Enums.ProtectionConstants.PAGE_EXECUTE_READWRITE);

            if (lpAddress == (IntPtr)0)
            {
                if (lpAddress == (IntPtr)0)
                {
                    sError  = "Unable to allocate memory to target process.\n";
                    sError += "Error code: " + Marshal.GetLastWin32Error();
                    return(false);
                }
            }

            byte[] bytes = CalcBytes(sDllPath);
            IntPtr ipTmp = IntPtr.Zero;

            WINAPI.WriteProcessMemory(
                hndProc,
                lpAddress,
                bytes,
                (uint)bytes.Length,
                out ipTmp);

            if (Marshal.GetLastWin32Error() != 0)
            {
                sError  = "Unable to write memory to process.";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr ipThread = WINAPI.CreateRemoteThread(
                hndProc,
                (IntPtr)null,
                (IntPtr)0,
                lpLLAddress,
                lpAddress,
                0,
                (IntPtr)null);

            if (ipThread == (IntPtr)0)
            {
                sError  = "Unable to load dll into memory.";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            return(true);
        }
Esempio n. 4
0
        private static bool CRT(
            Process pToBeInjected,
            string sDllPath,
            out string sError,
            out IntPtr hwnd)
        {
            sError = String.Empty; //in case we encounter no errors

            IntPtr hndProc = WINAPI.OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, (uint)pToBeInjected.Id);

            hwnd = hndProc;

            if (hndProc == (IntPtr)0)
            {
                sError  = "Unable to attatch to process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr lpLLAddress = WINAPI.GetProcAddress(
                WINAPI.GetModuleHandle("kernel32.dll"),
                "LoadLibraryA");

            if (lpLLAddress == (IntPtr)0)
            {
                sError  = "Unable to find address of \"LoadLibraryA\".\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr lpAddress = WINAPI.VirtualAllocEx(
                hndProc,
                (IntPtr)null,
                (IntPtr)sDllPath.Length,
                //520 bytes should be enough
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_COMMIT |
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_RESERVE,
                (uint)WINAPI.VAE_Enums.ProtectionConstants.PAGE_EXECUTE_READWRITE);

            if (lpAddress == (IntPtr)0)
            {
                sError  = "Unable to allocate memory to target process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            byte[] bytes = CalcBytes(sDllPath);
            IntPtr ipTmp;

            WINAPI.WriteProcessMemory(
                hndProc,
                lpAddress,
                bytes,
                (uint)bytes.Length,
                out ipTmp);

            if (Marshal.GetLastWin32Error() != 0)
            {
                sError  = "Unable to write memory to process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            IntPtr hThread = WINAPI.CreateRemoteThread(
                hndProc,
                (IntPtr)null,
                (IntPtr)0,
                lpLLAddress,
                lpAddress,
                0,
                (IntPtr)null);

            if (hThread == (IntPtr)0)
            {
                sError  = "Unable to load dll into memory.";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            //added so it won't crash while thread is initializing
            // Time-out is 10 seconds...
            int Result = WaitForSingleObject(hThread, 10 * 1000);

            // Check whether thread timed out...
            if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF)
            {
                // Make sure thread handle is valid before closing... prevents crashes.
                if (hThread != null)
                {
                    //Close thread in target process
                    WINAPI.CloseHandle(hThread);
                }

                /* Thread timed out... */
                throw new Exception("WaitForSingleObject failed!\n\n Call tech support.");
            }

            // Sleep thread for so as not to crash host
            Thread.Sleep(1000);

            // Clear up allocated space ( Allocmem )
            VirtualFreeEx(hndProc, lpAddress, (UIntPtr)0, 0x8000);

            // Make sure thread handle is valid before closing... prevents crashes.
            if (hThread != null)
            {
                //Close thread in target process
                WINAPI.CloseHandle(hThread);
            }

            Trace.TraceInformation("Injecter thinks all is OK");
            return(true);
        }
Esempio n. 5
0
        /// <summary>
        /// Injects a x86 or x64 DLL into the process
        /// </summary>
        /// <param name="pToBeInjected">Process to be injected (obtained with Process.GetProcesses() ) </param>
        /// <param name="sDllPath">Full path to the DLL to be injected</param>
        /// <param name="sError">OUT parameter with an error string</param>
        /// <returns></returns>
        public static bool DoInject(
            Process pToBeInjected,
            string sDllPath,
            out string sError)
        {
            IntPtr hwnd = IntPtr.Zero;

            sError = String.Empty; //in case we encounter no errors

            //Open the target process with read , write and execute priviledges
            IntPtr hndProc = WINAPI.OpenProcess(
                (0x000F0000   // STANDARD_RIGHTS_REQUIRED
                 | 0x00100000 // SYNCHRONIZE
                 | 0xFFFF
                ), 0, (uint)pToBeInjected.Id);

            hwnd = hndProc;

            if (hndProc == (IntPtr)0)
            {
                sError  = "Unable to attatch to process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }
            //Get the address of LoadLibraryA
            IntPtr lpLLAddress = WINAPI.GetProcAddress(
                WINAPI.GetModuleHandle("kernel32.dll"),
                "LoadLibraryA");

            if (lpLLAddress == (IntPtr)0)
            {
                sError  = "Unable to find address of \"LoadLibraryA\".\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }
            // Allocate space in the process for our DLL
            IntPtr lpAddress = WINAPI.VirtualAllocEx(
                hndProc,
                (IntPtr)null,
                (IntPtr)sDllPath.Length, //520 bytes should be enough
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_COMMIT |
                (uint)WINAPI.VAE_Enums.AllocationType.MEM_RESERVE,
                (uint)WINAPI.VAE_Enums.ProtectionConstants.PAGE_EXECUTE_READWRITE);


            if (lpAddress == (IntPtr)0)
            {
                sError  = "Unable to allocate memory to target process.\n";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }


            byte[] bytes = CalcBytes(sDllPath);
            IntPtr ipTmp = IntPtr.Zero;
            // Write the string name of our DLL in the memory allocated
            int bResult = WINAPI.WriteProcessMemory(
                hndProc,
                lpAddress,
                bytes,
                (uint)bytes.Length,
                out ipTmp);

            // ERROR x64: "Unable to write memory to process. Error code: 1300"
            if (bResult == 0)
            {
                sError  = "Unable to write memory to process.";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }
            // Load our DLL
            IntPtr ipThread = WINAPI.CreateRemoteThread(
                hndProc,
                (IntPtr)null,
                (IntPtr)0,
                lpLLAddress,
                lpAddress,
                0,
                (IntPtr)null);

            if (ipThread == (IntPtr)0)
            {
                sError  = "Unable to load dll into memory.";
                sError += "Error code: " + Marshal.GetLastWin32Error();
                return(false);
            }

            WINAPI.CloseHandle(hndProc);

            return(true);
        }