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

Тема в разделе "WASM.WIN32", создана пользователем 984259h, 27 май 2010.

  1. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    984259h
    Код (Text):
    1.  PVOID pBuffer = NULL;
    2.          NtStatus = NtAllocateVirtualMemory(hProcess,&pBuffer,0,&dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    3.          if (NT_SUCCESS(NtStatus))
    4.          {
    5.             NtStatus = NtWriteVirtualMemory(hProcess,pBuffer,pBuffer,dwSize,0);
    не особо понял, а где вы релоки правите?
    попробуйте вот этот код http://wasm.ru/forum/viewtopic.php?id=37450

    юзать так:

    Код (Text):
    1.     DWORD dwAddr = InjectCode( hProcess, f_Main );
    2.  
    3.     bool ret = false;
    4.  
    5.     if ( dwAddr != -1 )
    6.     {
    7.         if ( pCreateRemoteThread( hProcess, 0, 0, (LPTHREAD_START_ROUTINE)dwAddr, NULL, 0, 0 ) != NULL )
    8.         { ..
     
  2. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    Код (Text):
    1. HANDLE hModule = GetModuleHandleA(NULL);
    и базу лучше более универсально получать, иначе уже находят в адрессном пространстве другого процесса не выйдет инжект сделать.

    Код (Text):
    1. DWORD GetImageBase()
    2. {
    3.     DWORD dwRet = 0;
    4.  
    5.     __asm
    6.     {
    7.             call GetBase
    8.         GetBase:
    9.             pop eax
    10.             and eax, 0FFFF0000h
    11.         Find:
    12.             cmp word ptr [ eax ], 0x5A4D
    13.             je end
    14.             sub eax, 00010000h
    15.             jmp Find
    16.         End:
    17.             mov [ dwRet ], eax
    18.     }
    19.  
    20.     return dwRet;
    21. }
     
  3. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    ilja_
    Базу лучше искать через TEB. То есть получать LDR_MODULE.BaseAddress.
    Вот для 64 бит пример, для 32 бит поправить 1 строчку вроде нужно:
    Код (Text):
    1. ;fasm macro.
    2. macro GetBaseOfKernel32Into reg
    3. {
    4.     mov  reg , [gs:dword 30h]                                    ;TEB
    5.     mov  reg , [reg + 60h]                                       ;PEB
    6.     mov  reg , [reg + 24]                                        ;PEB->Ldr
    7.     mov  reg , [reg + 32]                                        ;first module(InMemoryOrder module list)
    8.     mov  reg , [reg]                                             ;assume that ntdll will be second in module list.
    9.     mov  reg , [reg]                                             ;assume that kernel32 will be third in module list.
    10.     mov  reg , [reg + 32]                                        ;LDR_MODULE64.BaseAddress
    11. }        
    12. macro GetBaseOfNtdllInto reg
    13. {
    14.     mov  reg , [gs:dword 30h]                                    ;TEB
    15.     mov  reg , [reg + 60h]                                       ;PEB
    16.     mov  reg , [reg + 24]                                        ;PEB->Ldr
    17.     mov  reg , [reg + 32]                                        ;first module(InMemoryOrder module list)
    18.     mov  reg , [reg]                                             ;assume that ntdll will be second in module list.
    19.     mov  reg , [reg + 32]                                        ;LDR_MODULE64.BaseAddress
    20. }
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ziral2088
    Плохой способ, более того не желательный для использования. Модуль следует искать по имени, в идеале по полному. Например у меня многие процессы запускаются с верификатором, это системный механизм, провайдеры грузятся до загрузки kernel32.dll, таким образом нет никакой гарантии что kernel32 тритий модуль в списке.
     
  5. ilja_

    ilja_ New Member

    Публикаций:
    0
    Регистрация:
    27 май 2010
    Сообщения:
    33
    ziral2088
    Сделали вы инжект в процесс, дальше из этого процесса вам нужно прыгнуть в следующий, тем способом который дали вы, вы получите базу процесса в котором вы находитесь, а не базу своего образа внутри этого процесса.
     
  6. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    Что то не пойму, а зачем мне база моего образа? Мне нужна база нтдлл или кернела, но никак не своего.

    Clerk
    Можешь рассказать как настроить\что поставить в системе, что бы kernel32.dll в памяти оказалась не второй?(то есть в списке InLoadOrderModuleList она и так не вторая часто, к примеру в том же csrss.exe она третья, а в списке InMemoryOrderModuleList у меня всегда была вторая)
    Был бы очень признателен за совет.
     
  7. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    ilja_
    Перечитал топ еще раз, понял о чем вы говорите. Да мой код был немного не в тему, не видел что вы искали базу своей дллки в чужом процессе.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ziral2088
    http://wasm.ru/forum/viewtopic.php?id=37208
     
  9. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Имеется ввиду csrss, который можно нотифицировать, если нужно.
     
  10. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    заработало таким образом :
    Код (Text):
    1. BOOL NativeInjectProcess(DWORD ( WINAPI *pFunction )( LPVOID ),char *szProcessName)
    2. {
    3.   BOOL bRet = FALSE;
    4.   CLIENT_ID C_ID;
    5.   C_ID.UniqueProcess = (HANDLE)GetProcessID(szProcessName);
    6.   C_ID.UniqueThread = NULL;
    7.   OBJECT_ATTRIBUTES ObjectAttributes;
    8.   InitializeObjectAttributes(&ObjectAttributes,NULL,0,NULL,NULL);
    9.   BOOLEAN bPrivilegeEnable = TRUE;
    10.   NTSTATUS NtStatus = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bPrivilegeEnable);
    11.   if (NT_SUCCESS(NtStatus))
    12.   {
    13.      HANDLE hProcess = NULL;
    14.      NtStatus = NtOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ObjectAttributes,&C_ID);
    15.      if (NT_SUCCESS(NtStatus))
    16.      {
    17.          HANDLE hModule;                // Get my hModule by PEB (Process Environment Block)
    18.          __asm  {
    19.         push ebx                    
    20.             xor  ebx, ebx                      // clear ebx
    21.             mov  ebx, fs:[ 0x30 ]           // get a pointer to the PEB
    22.             mov  ebx, [ebx + 0x08 ]       // get PEB->ImageBaseAddress
    23.         mov  [hModule], ebx        
    24.         pop  ebx }                  
    25.             DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+
    26.                         ((PIMAGE_DOS_HEADER)(hModule))->e_lfanew +
    27.                     sizeof(DWORD)+
    28.                                 sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    29.          PVOID pBuffer = NULL;
    30.          NtStatus = NtAllocateVirtualMemory(NtCurrentProcess(),&pBuffer,0,&dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    31.          if (NT_SUCCESS(NtStatus))
    32.          {
    33.                 DWORD ReadBytes;
    34.             NtStatus = NtReadVirtualMemory(NtCurrentProcess(),(PVOID)hModule,pBuffer,dwSize,&ReadBytes);
    35.             if (NT_SUCCESS(NtStatus))
    36.             {
    37.               // NtFreeVirtualMemory(hProcess,(PVOID*)hModule,&ReadBytes,MEM_RELEASE);
    38.               PVOID pMemory = (PVOID)hModule;
    39.               NtStatus = NtAllocateVirtualMemory(hProcess,&pMemory,0,&ReadBytes,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    40.               if (NT_SUCCESS(NtStatus))
    41.               {
    42.                              DWORD OldProction;
    43.                              NtStatus = NtProtectVirtualMemory(hProcess,&pMemory,&ReadBytes,PAGE_EXECUTE_READWRITE,&OldProction);    
    44.                  if (NT_SUCCESS(NtStatus))
    45.                      {
    46.                 DWORD WriteBytes;
    47.                     NtStatus = NtWriteVirtualMemory(hProcess,pMemory,pBuffer,ReadBytes,&WriteBytes);
    48.                         if (NT_SUCCESS(NtStatus))
    49.                         {
    50.                        HANDLE hRemoteThread = NULL;
    51.                        NtStatus = RtlCreateUserThread(hProcess,NULL,FALSE,0,NULL,NULL,pFunction,pMemory,&hRemoteThread,0);
    52.                        if (NT_SUCCESS(NtStatus))
    53.                            {
    54.                           if (hRemoteThread != NULL)
    55.                       {
    56.                           NtClose(hRemoteThread);
    57.                           bRet = TRUE;
    58.                       }
    59.                        }
    60.                     }
    61.                  }
    62.               }
    63.             }
    64.  
    65.          }
    66.       }
    67.       NtClose(hProcess);
    68.   }
    69.   return bRet;
    70. }
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    984259h
    Код (Text):
    1.      __asm  {
    2.         push ebx                    
    3.             xor  ebx, ebx                      // clear ebx
    4.             mov  ebx, fs:[ 0x30 ]           // get a pointer to the PEB
    5.             mov  ebx, [ebx + 0x08 ]       // get PEB->ImageBaseAddress
    6.         mov  [hModule], ebx        
    7.         pop  ebx }                  
    8.             DWORD dwSize = ((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+
    9.                         ((PIMAGE_DOS_HEADER)(hModule))->e_lfanew +
    10.                     sizeof(DWORD)+
    11.                                 sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    Желательно найти описатель модуля в базе данных загрузчика, оттуда и брать базу и размер модуля. Он может быть иного размера, чем указанный в хидере. Все обращения к его базе данных должны исполняться с захваченной кс LdrpLoaderLock.
    Код (Text):
    1. NtStatus = NtAllocateVirtualMemory(NtCurrentProcess(),&pBuffer,0,&dwSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    2.          if (NT_SUCCESS(NtStatus))
    3.          {
    4.                 DWORD ReadBytes;
    5.             NtStatus = NtReadVirtualMemory(NtCurrentProcess(),(PVOID)hModule,pBuffer,dwSize,&ReadBytes);
    6.             if (NT_SUCCESS(NtStatus))
    7.             {
    Это не нужно. Незачем копировать образ в иное место в текущем процессе.
    Код (Text):
    1. DWORD OldProction;
    2.                              NtStatus = NtProtectVirtualMemory(hProcess,&pMemory,&ReadBytes,PAGE_EXECUTE_READWRITE,&OldProction);
    Это тоже не нужно. Атрибуты задаются при аллокации.
    Код (Text):
    1. NtClose(hRemoteThread);
    Следует возвратить описатель из функции. Некоторые параметры для RtlCreateUserThread() должны быть внешними.
    Код (Text):
    1. NULL,FALSE,0,NULL,NULL
    Слишком много нулей. Следует использовать push eax для загрузки нуля, в нём статус из предыдущего сервиса.
    -
    В общем отвратительный способ. Следует учитывать релокацию, импорт и прочее. Для обычного приложения такой копипаст образа закончится крахом.
     
  12. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Clerk
    не совсем понял про