Инжект в системный процесс на c++

Тема в разделе "WASM.BEGINNERS", создана пользователем rsky, 13 дек 2006.

  1. rsky

    rsky New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    4
    Приветствую.

    Господа, поделитесь примером =)

    Спасибо.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    примерно так:
    Код (Text):
    1. BOOL InjectIntoProcess(HANDLE p_handle, PVOID proc)
    2. {      
    3.     PBYTE Buffer;
    4.     DWORD dwRead=0;
    5.  
    6.     DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE *)(BASEADDR) +
    7.         ((PIMAGE_DOS_HEADER)(BASEADDR))->e_lfanew
    8.             + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    9.  
    10.     Buffer = (PBYTE)VirtualAlloc(NULL, dwSize,
    11.         MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    12.     if (Buffer == NULL)
    13.         return FALSE;
    14.  
    15.     ReadProcessMemory(GetCurrentProcess(), (LPCVOID)BASEADDR,
    16.         (LPVOID)Buffer, dwSize, &dwRead);  
    17.  
    18.     PBYTE pMem = (PBYTE)VirtualAllocEx(p_handle, (LPVOID)BASEADDR, dwRead,
    19.         MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    20.     if (Buffer == NULL)
    21.         return FALSE;
    22.  
    23.     DWORD dwOldProt, dwNumBytes;
    24.     VirtualProtectEx(p_handle, pMem , dwRead, PAGE_EXECUTE_READWRITE,
    25.         &dwOldProt);
    26.  
    27.     if (!WriteProcessMemory(p_handle, pMem, Buffer, dwRead, &dwNumBytes))
    28.         return FALSE;
    29.  
    30.     DWORD dwThreadId;  
    31.     CreateRemoteThread(p_handle, NULL, 0, proc, NULL, 0, &dwThreadId);
    32.  
    33.     return TRUE;
    34. }
    35. /*
    36.  
    37. p_handle - хендл процесса в который нужно инжектнуццо
    38. proc - аддресс ф-ции, которая будет выполняться в удалённом потоке
    39. BASEADDR - ImageBase бинарника, который делает инжект
    40.  
    41. */
     
  3. rsky

    rsky New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    4
    Cr4sh

    Спасибо огромное, а как узнать p_handle процесса, например explorer.exe ?
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    RTFM => OpenProcess
     
  5. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    Cr4sh а шо если BASEADDR занят?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну и что?
     
  7. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    затрецо чужой исполняемый код
     
  8. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    делюсь
    32-64 битный инжект-ремув
    показывает код ошибки LoadLibrary
    можно задавать PID можно имя процесса
     
  9. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Cr4sh а шо если BASEADDR занят?

    выбирай такой, чтоб он не оказался занятым, а что, есть другие идеи? =)
    хотя можно писать базонезависимый код, и инжектить его куда попало...

    >> затрецо чужой исполняемый код

    ничего не затётся, просто VirtualAllocEx не сработает
     
  10. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> выбирай такой, чтоб он не оказался занятым

    таких адресов НЕТ

    >> ничего не затётся, просто VirtualAllocEx не сработает

    VirtualAllocEx cannot reserve a reserved page. It can commit a page that is already committed. This means you can commit a range of pages, regardless of whether they have already been committed, and the function will not fail.

    >> есть другие идеи? =)
    >> хотя можно писать базонезависимый код, и инжектить его куда попало...

    идея читать ртфм :)

    Код (Text):
    1. #include <windows.h>
    2. #include <Dbghelp.h>
    3.  
    4. bool inject_pe(DWORD pid, void * pe)
    5. {
    6.   HANDLE host = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);  
    7.   if ( ! host ) return false;
    8.  
    9.   char * img = reinterpret_cast<char*>(pe);
    10.   const IMAGE_DOS_HEADER & dh = *reinterpret_cast<IMAGE_DOS_HEADER*>(img);
    11.   IMAGE_NT_HEADERS & nth = *reinterpret_cast<IMAGE_NT_HEADERS*>(img + dh.e_lfanew);
    12.   const IMAGE_FILE_HEADER & fh = nth.FileHeader;
    13.   const IMAGE_OPTIONAL_HEADER & oh = nth.OptionalHeader;
    14.  
    15.   const ULONG image_size = oh.SizeOfImage;
    16.   char * base = reinterpret_cast<char*>(VirtualAllocEx(host, 0, image_size,
    17.                                                   MEM_COMMIT, PAGE_READWRITE));
    18.   if ( ! base ) goto panic;
    19.  
    20.   const IMAGE_SECTION_HEADER * section = reinterpret_cast<IMAGE_SECTION_HEADER*>
    21.                     (reinterpret_cast<UINT_PTR>(&oh) + fh.SizeOfOptionalHeader);
    22.  
    23.   // imports
    24.   // note: we exploit the fact, that system dll are mapped to
    25.   //         the same addresses in all process spaces
    26.   //         (however, injected code has to load these dlls itself)
    27.  
    28.   const IMAGE_DATA_DIRECTORY & imp_dir = oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
    29.   const IMAGE_IMPORT_DESCRIPTOR * idesc = reinterpret_cast<IMAGE_IMPORT_DESCRIPTOR*>
    30.                         (ImageRvaToVa(&nth, img, imp_dir.VirtualAddress, NULL));
    31.   for ( ; idesc->Characteristics; ++idesc )
    32.   {
    33.     HMODULE dll = LoadLibraryA((char*)ImageRvaToVa(&nth, img, idesc->Name, NULL));
    34.     if ( ! dll ) goto panic;
    35.     IMAGE_THUNK_DATA * import = reinterpret_cast<IMAGE_THUNK_DATA*>
    36.                     (ImageRvaToVa(&nth, img, idesc->OriginalFirstThunk, NULL));
    37.     IMAGE_THUNK_DATA * thunk = reinterpret_cast<IMAGE_THUNK_DATA*>
    38.                             (ImageRvaToVa(&nth, img, idesc->FirstThunk, NULL));
    39.     for ( ; import->u1.Function; ++import, ++thunk )
    40.     {                        
    41.       DWORD ordanal = import->u1.Ordinal;
    42.       FARPROC proc = 0;
    43.       if ( 0x80000000 & ordanal )
    44.         proc = GetProcAddress(dll, MAKEINTRESOURCE(ordanal));
    45.       else
    46.       {
    47.         const IMAGE_IMPORT_BY_NAME * pimp_name = reinterpret_cast<IMAGE_IMPORT_BY_NAME*>
    48.                                     (ImageRvaToVa(&nth, img, ordanal, NULL));
    49.         proc = GetProcAddress(dll, reinterpret_cast<const char*>(pimp_name->Name));
    50.       }        
    51.       if ( !proc )
    52.       {
    53.         FreeLibrary(dll);
    54.         goto panic;
    55.       }
    56.       thunk->u1.Function = reinterpret_cast<DWORD>(proc);
    57.     }
    58.     FreeLibrary(dll);
    59.   }
    60.  
    61.   // fixups
    62.   struct IMAGE_BASE_RELOCATION { DWORD VirtualAddress, SizeOfBlock; struct Item { WORD Offset:12; WORD Type:4; } item[1]; };
    63.   unsigned const fix_va = oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
    64.   if ( ! fix_va ) goto panic;
    65.   unsigned const fix_size = oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
    66.   const IMAGE_BASE_RELOCATION * fixups = reinterpret_cast<IMAGE_BASE_RELOCATION*>
    67.                                         (ImageRvaToVa(&nth, img, fix_va, NULL));
    68.   const UINT_PTR end = (UINT_PTR)ImageRvaToVa(&nth, img, fix_va + fix_size, NULL);
    69.   const size_t delta = reinterpret_cast<UINT_PTR>(base) - oh.ImageBase;
    70.   while ( reinterpret_cast<UINT_PTR>(fixups) < end )
    71.   {
    72.     char * const addr = (char*)ImageRvaToVa(&nth, img, fixups->VirtualAddress, NULL);
    73.     UINT_PTR end = fixups->SizeOfBlock + reinterpret_cast<UINT_PTR>(fixups);
    74.     const IMAGE_BASE_RELOCATION::Item * i = &fixups->item[0];
    75.     for ( ; reinterpret_cast<UINT_PTR>(i) < end; ++i )
    76.       if ( i->Type == IMAGE_REL_BASED_HIGHLOW )
    77.         *reinterpret_cast<DWORD*>(&addr[i->Offset]) += delta;
    78.     fixups = reinterpret_cast<const IMAGE_BASE_RELOCATION*>(i);
    79.   }
    80.  
    81.   // inject sections
    82.   for ( int i = 0; i != fh.NumberOfSections; ++i )
    83.   {
    84.     const ULONG virtual_size = section[i].Misc.VirtualSize;
    85.     const ULONG raw_size = section[i].SizeOfRawData;
    86.     const SIZE_T size = raw_size < virtual_size ? raw_size : virtual_size;
    87.     SIZE_T written = 0;
    88.     WriteProcessMemory(host, base + section[i].VirtualAddress,
    89.                             img + section[i].PointerToRawData, size, &written);
    90.     if ( written != size )
    91.       goto panic;
    92.     const ULONG c = section[i].Characteristics;
    93.     DWORD protect = PAGE_READONLY;
    94.     if ( c & IMAGE_SCN_MEM_WRITE )    protect = PAGE_READWRITE;
    95.     if ( c & IMAGE_SCN_MEM_EXECUTE )  protect = PAGE_EXECUTE_READ;
    96.     if ( c & IMAGE_SCN_MEM_EXECUTE && c & IMAGE_SCN_MEM_WRITE )
    97.       protect = PAGE_EXECUTE_READWRITE;
    98.     DWORD old_protect;
    99.     VirtualProtectEx(host, base + section[i].VirtualAddress, virtual_size,
    100.                      protect, &old_protect);
    101.   }
    102.  
    103.   // start
    104.   HANDLE thread = CreateRemoteThread(host, NULL, 0,
    105.         (LPTHREAD_START_ROUTINE)(base + oh.AddressOfEntryPoint), NULL, 0, NULL);
    106.   if ( thread )
    107.   {
    108.     CloseHandle(thread);
    109.     CloseHandle(host);
    110.     return true;
    111.   }
    112. panic:
    113.   CloseHandle(host);
    114.   return false;
    115. }
     
  11. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    Блин может не совсем в тему но новый топ открывать не охота на делфях или на асме инжект может кто скинет.
     
  12. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    На делфи в статьях "Перехват API функций в Windows NT" на асме в "От зеленого к красному"
     
  13. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> таких адресов НЕТ
    дада, все два гига юзермодного адрессного пространства забиты под чистую))

    >> идея читать ртфм :)
    а если бинарник будет без фиксапов?)
    хотя хз, с другой стороны никто не мешает скомпилить его чтоб он был...
     
  14. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Инжект через CreateRemoteThread. На делфе.

    Код (Text):
    1. function InjectViaCreateRemoteThread(ProcessID:Cardinal; DllPath:String):Boolean;
    2. var
    3.  pDllName:pointer;
    4.  hProcess,hThread:Thandle;
    5.  BytesWritten,TheadID:Cardinal;
    6. begin
    7. result:=false;
    8. hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
    9. if (hProcess=0) then exit;
    10. pDllName:=VirtualAllocEx(hProcess,Nil,Length(DllPath),MEM_COMMIT,PAGE_READWRITE);
    11. if (pDllName <> nil)and(WriteProcessMemory(hProcess,pDllName,PChar(DllPath),Length(DllPath),BytesWritten)) then
    12.  begin
    13.   hThread:=CreateRemoteThread(hProcess,nil,0,GetProcAddress(LoadLibrary('kernel32.dll'),'LoadLibraryA'),pDllName,0,TheadID);
    14.   if hThread<>0 then
    15.    begin
    16.     result:=true;
    17.     WaitForSingleObject(hThread,INFINITE);
    18.     VirtualFreeEx(hProcess,pDllName,0,MEM_RELEASE);
    19.    end;
    20.  end;
    21. CloseHandle(hProcess);
    22. end;
     
  15. Sergei_2006

    Sergei_2006 New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    30
    А полностью рабочий с Dll'ой. Просто все кричат что в статьях "Перехват API функций в Windows NT" все гуд описано ну так приатачили бы к ним пример инжекта dll и половина вопросов бы спразу отпала.
    Самому учиться хорошо но временами лучше идти по уже протоптанной дороге.
     
  16. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Сам пиши :). Я эту дллку часа два искать буду.
     
  17. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> дада, все два гига юзермодного адрессного пространства забиты под чистую))

    достаточно что б несколько кб были заняты... нужные... ты ж видиш ща модно несильно задумываясь копипастить чужие сорцы... и ктото откопипастит твой базовый адрес =)

    >> а если бинарник будет без фиксапов?)
    >> хотя хз, с другой стороны никто не мешает скомпилить его чтоб он был...

    если есть сорцы то нет трабл создать фиксапы... плюсов это даст чуток... на первый взгляд + к размеру но реально позиционно независимый код на асме получаеццо больше =)

    >> Самому учиться хорошо но временами лучше идти по уже протоптанной дороге

    и придеш туда где все места заняты :P для современных фаеров весь код веше неактуален =)
     
  18. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    А вот с этим можно поспорить.
     
  19. rsky

    rsky New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    4
    fr0b-p

    > для современных фаеров весь код веше неактуален =)

    а есть актуальный пример ? =)
     
  20. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> А вот с этим можно поспорить.

    я ничо никому доказывать не хочу :) а если действительна хошь спорить делой ставки и подумоем ;)

    >> а есть актуальный пример ? =)

    есть =) тока после публикации он станет неактуальный .