Доброе время суток. Я программирую на языке C# так что буду выкладывать так сказать абстрактный код. Саму проблему вы уже узнали из заголовка топика так для чего же мне это нужно, а для того чтобы запустить CLR в удаленном процессе и дальнейшего инжекта в него библиотеки написанной на C#. Код (Text): uint sizeUni = (uint)Encoding.Unicode.GetByteCount(fullPath); //Получаем хэндл Kernel32 и указатель на LoadLibraryW IntPtr hKernel32 = Imports.GetModuleHandle("Kernel32"); if (hKernel32 == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); IntPtr hLoadLib = Imports.GetProcAddress(hKernel32, "LoadLibraryW"); if (hLoadLib == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); //Выделяем адресное пространство под ссылку на библиотеку pLibRemote = Imports.VirtualAllocEx(_handle, IntPtr.Zero, sizeUni, AllocationType.Commit, MemoryProtection.ReadWrite); if (pLibRemote == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); //Записываем в выделенное адресное пространство ссылку на библиотеку int bytesWritten; if (!Imports.WriteProcessMemory(_handle, pLibRemote, pLibFullPathUnmanaged, sizeUni, out bytesWritten) || bytesWritten != (int)sizeUni) throw new Win32Exception(Marshal.GetLastWin32Error()); IntPtr cid = IntPtr.Zero; if (OSVersion.IsAboveOrEqual(WindowsVersion.Vista)) Imports.RtlCreateUserThread(_handle, IntPtr.Zero, false, 0, IntPtr.Zero, IntPtr.Zero, hLoadLib, pLibRemote, out hThread, out cid); else hThread = Imports.CreateRemoteThread(_handle, IntPtr.Zero, 0, hLoadLib, pLibRemote, 0, IntPtr.Zero); if (hThread == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); if (Imports.WaitForSingleObject(hThread, (uint)ThreadWaitValue.Infinite) != (uint)ThreadWaitValue.Object0) throw new Win32Exception(Marshal.GetLastWin32Error()); Ошибка происходит в момент создания потока внутри процесса. Выдается ошибка 126, что не удается найти модуль. (The specified module could not be found)
У меня тоже 32-х битный процесс не открывает 64-х битный, хотя находит и привилегии получены. Видно, прийдется переписывать под 64-х битную платформу.
paralvic Конечно надо переписывать. И уже со стороны 64 битов - открывать 64 и 32х-битные. И не забывать про WOW wrapper.
Забавно, функция и для х64 Код (Text): Process32First/Process32Next перебирают все процессы и 32, и 64. Есть ли простой способ узнать какой процесс вернули? 32 или 64
paralvic Ага! GetLastError() равен пяти? IsWow64Process: A handle to the process. The handle must have the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right. For more information, see Process Security and Access Rights. Ваш акцесс к хендлу: Код (Text): hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwProcessId); п.с Код (Text): BOOL IsWow64(HANDLE hProcess2) { BOOL bIsWow64 = FALSE; // WOW64 is the x86 emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows. //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a handle to the DLL that contains the function //and GetProcAddress to get a pointer to the function if available. fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(hProcess2,&bIsWow64)) { //handle error } } return bIsWow64; } Функция написана очень плохо ...
Комментарии: AppAttack.cpp компилируем в х64 приложение. Это строка с именем программы, которую ищем: LPCTSTR argv = (LPCTSTR) L"WinHEX.exe"; // L"notepad.exe" L"BeholdTV.exe" WinHEX.exe вроде пока 32х битная программа. Результат парадоксально: The process is not running under WOW64
paralvic Код (Text): hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwProcessId); замени на Код (Text): hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);