Инжект 32х библиотеки в 32х процесс на 64х ОС

Тема в разделе "WASM.X64", создана пользователем Qj, 12 сен 2010.

  1. Qj

    Qj New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2010
    Сообщения:
    1
    Доброе время суток.
    Я программирую на языке C# так что буду выкладывать так сказать абстрактный код.
    Саму проблему вы уже узнали из заголовка топика так для чего же мне это нужно, а для того чтобы запустить CLR в удаленном процессе и дальнейшего инжекта в него библиотеки написанной на C#.

    Код (Text):
    1.            
    2.                uint sizeUni = (uint)Encoding.Unicode.GetByteCount(fullPath);
    3.  
    4.                 //Получаем хэндл Kernel32 и указатель на LoadLibraryW
    5.                 IntPtr hKernel32 = Imports.GetModuleHandle("Kernel32");
    6.                 if (hKernel32 == IntPtr.Zero)
    7.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    8.                 IntPtr hLoadLib = Imports.GetProcAddress(hKernel32, "LoadLibraryW");
    9.                 if (hLoadLib == IntPtr.Zero)
    10.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    11.  
    12.                 //Выделяем адресное пространство под ссылку на библиотеку
    13.                 pLibRemote = Imports.VirtualAllocEx(_handle, IntPtr.Zero, sizeUni, AllocationType.Commit, MemoryProtection.ReadWrite);
    14.                 if (pLibRemote == IntPtr.Zero)
    15.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    16.  
    17.                 //Записываем в выделенное адресное пространство ссылку на библиотеку
    18.                 int bytesWritten;
    19.                 if (!Imports.WriteProcessMemory(_handle, pLibRemote, pLibFullPathUnmanaged, sizeUni, out bytesWritten) || bytesWritten != (int)sizeUni)
    20.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    21.  
    22.                 IntPtr cid = IntPtr.Zero;
    23.                 if (OSVersion.IsAboveOrEqual(WindowsVersion.Vista))
    24.                     Imports.RtlCreateUserThread(_handle, IntPtr.Zero, false, 0, IntPtr.Zero, IntPtr.Zero, hLoadLib, pLibRemote, out hThread, out cid);
    25.                 else
    26.                     hThread = Imports.CreateRemoteThread(_handle, IntPtr.Zero, 0, hLoadLib, pLibRemote, 0, IntPtr.Zero);
    27.  
    28.                 if (hThread == IntPtr.Zero)
    29.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    30.                 if (Imports.WaitForSingleObject(hThread, (uint)ThreadWaitValue.Infinite) != (uint)ThreadWaitValue.Object0)
    31.                     throw new Win32Exception(Marshal.GetLastWin32Error());
    Ошибка происходит в момент создания потока внутри процесса. Выдается ошибка 126, что не удается найти модуль. (The specified module could not be found)
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Qj
    сначала разберитесь как это делается на Си или асме, а потом уже на C# пишите
     
  3. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Qj
    Читай доки из google(inject dll)
    А потом сюды.
     
  4. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    У меня тоже 32-х битный процесс не открывает 64-х битный, хотя находит и привилегии получены.
    Видно, прийдется переписывать под 64-х битную платформу.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.550
    Адрес:
    Russia
    paralvic
    Конечно надо переписывать. И уже со стороны 64 битов - открывать 64 и 32х-битные. И не забывать про WOW wrapper.
     
  6. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Забавно, функция и для х64
    Код (Text):
    1. Process32First/Process32Next
    перебирают все процессы и 32, и 64.

    Есть ли простой способ узнать какой процесс вернули? 32 или 64
     
  7. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    Наверное с помощью функции IsWow64Process
     
  8. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Код (Text):
    1. BOOL WINAPI IsWow64Process(
    2.   __in   HANDLE hProcess,
    3.   __out  PBOOL Wow64Process
    4. );
     
  9. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    :dntknw:
    Не различаем 32 и 64.

    Код с форума + МСДН пример по WOW64.
     
  10. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    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):
    1. hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwProcessId);
    п.с

    Код (Text):
    1. BOOL IsWow64(HANDLE hProcess2)
    2. {
    3.     BOOL bIsWow64 = FALSE;
    4.     // WOW64 is the x86 emulator that allows 32-bit Windows-based applications to run seamlessly on 64-bit Windows.
    5.  
    6.     //IsWow64Process is not available on all supported versions of Windows.
    7.     //Use GetModuleHandle to get a handle to the DLL that contains the function
    8.     //and GetProcAddress to get a pointer to the function if available.
    9.  
    10.     fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
    11.         GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    12.  
    13.     if(NULL != fnIsWow64Process)
    14.     {
    15.         if (!fnIsWow64Process(hProcess2,&bIsWow64))
    16.         {
    17.             //handle error
    18.         }
    19.     }
    20.     return bIsWow64;
    21. }
    Функция написана очень плохо ...
     
  11. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Комментарии:
    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
     
  12. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    MSDN
     
  13. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    paralvic
    Код (Text):
    1. hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwProcessId);
    замени на
    Код (Text):
    1. hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
     
  14. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    Это пример, и в MSDN не все гладко ... Просто это кривая реализация ..
     
  15. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    спасибо