проблемы с грубым инжектированием кода в чужой процесс

Тема в разделе "WASM.WIN32", создана пользователем Arisu, 19 авг 2007.

  1. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    много данных пишеться :dntknw: боюсь Оутпост сразу заблочит только на одном WriteProcessMemory
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Код (Text):
    1. BOOL InjectAPC(HANDLE hProcess, HANDLE hThread, PVOID pvRemoteMemory)
    2. {
    3.     if(NtQueueApcThread(hThread,LoadLibraryExW,pvRemoteMemory,0,0)!=0)
    4.     {
    5.         return FALSE;
    6.     }
    7.     return TRUE;
    8. }
    Создать в нужном процессе саспендед тред на ф-ю NtTestAlert, проинжектить APC в pvRemoteMemory указатель на строку с именем длл (бери поменьше) в hThread - HANDLE созданного треда, потом резюмить этот тред.

    П.С. И тот и этот код уже рабочий в x32/x64/vista, выдран из моего существующего проекта.
     
  3. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    tylerdurden
    Простите за оффтопик, не вы ли это писали для p64?
    Automated vulnerability auditing in machine code Tyler Durden
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Не, сам во фраке видел :) Высадился :)
     
  5. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Arisu

    Вот решил опять вернуться к твоей теме, - я тогда дал неправильный код. При создании потока в другом процессе вычислять эфф. смещения (адреса) надо так: call-pop reg и в reg будет тогда адрес команды pop reg, и потом с помощью label можно будет определить любой адрес, например, в примере ниже адрес label_Caption = адрес label_base/*через call-pop reg*/ + (label_Caption - label_base). А просто lea, offset имеет смысл вызывать, когда свой модуль подгружаешь в другой процесс, т.е. потом просто загружаешь в регистр адрес = lea label. Вот и всё вроде. Пока!

    Код (Text):
    1. __declspec (naked) WINAPI Inject(LPVOID p)
    2. {
    3.     __asm{
    4.  
    5.         push ebp
    6.         mov ebp, esp
    7.         pushad
    8.  
    9.         call label_base
    10. label_base:
    11.         pop eax // - получаю адрес label_base
    12.         push MB_OK
    13.         lea esi, label_Caption
    14.         lea edi, label_base
    15.         sub esi, edi
    16.         add esi, eax
    17.         push esi // адрес label_Caption = адрес label_base + (label_Caption - label_base)
    18.         lea esi, label_Txt
    19.         lea edi, label_base
    20.         sub esi, edi
    21.         add esi, eax
    22.         push esi // адрес label_Txt = адрес label_base + (label_Txt - label_base)
    23.         push 0x00000000
    24.         lea esi, label_MessageBoxA
    25.         lea edi, label_base
    26.         sub esi, edi
    27.         add esi, eax // адрес label_MessageBoxA = адрес label_base + (label_MessageBoxA - label_base)
    28.         call [esi] // - вызываю MessageBoxA - [адрес label_MessageBoxA]
    29.  
    30.         popad
    31.         mov esp, ebp
    32.         pop ebp
    33.         ret 4
    34. label_MessageBoxA:
    35.         _emit 0xf2
    36.         _emit 0x04
    37.         _emit 0xd7
    38.         _emit 0x77
    39. label_Txt:
    40.         _emit 'H'
    41.         _emit 'e'
    42.         _emit 'l'
    43.         _emit 'l'
    44.         _emit 'o'
    45.         _emit '!'
    46. label_Caption:
    47.         _emit 0x00
    48.     }
    49. }
     
  6. Zenalex

    Zenalex New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2007
    Сообщения:
    10
    Написал прогу, инжектирующую Dll в Explorer.exe, которая затем подменяет ссылки на некоторые ф-ции user32. Инжектирование проходит успешно, в списке процесса Explorer появляется моя dll-ка, ссылки на функции заменяются (смотрю через Olly Debugger). Однако для любого другого процесса в системе user32.dll остается неизменной и dll туда не аттачится автоматически!

    В чем проблема? Я всегда считал, что dll загружаются в память в единственном экземпляре, и патч должен после установки работать для всех программ! А получается что по одному и тому же адресу для разных процессов находится различный код. Неужели в памяти на самом деле присутствуют несколько копий user32??? Помогите разобраться!
     
  7. Zenalex

    Zenalex New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2007
    Сообщения:
    10
    Отвечаю сам себе - поставил в dll SetHook - и все заработало. Но тем не менее вопрос о нескольких копиях User32 остается открытым
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    В смысле "неужели"? Каждому процессу одна копия USER32.DLL, если он конечно импортирует ее функции.
     
  9. Zenalex

    Zenalex New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2007
    Сообщения:
    10
    Фигасе!.. Не понимаю тогда, в чем смысл "динамически связываемых библиотек", если для каждого приложения все равно грузится отдельная копия. Их же, вроде как, придумали как раз для того, чтоб экономить память - типа, каждая библиотека грузится только один раз, а все приложения на нее ссылаются.
     
  10. Bryan_

    Bryan_ New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2007
    Сообщения:
    8
    Можете объяснить к какому решению пришёл топик стартер.
    Пытаюсь разобраться с кодом но при попытке инжектирования приложение (жертва) рушится с кодом исключения c0000005 (ACCESS_VIOLATION)


    Пожалуйста подскажите как исправить ситуацию =(
    Код (Text):
    1. DWORD (WINAPI *InjectedCodePtr)(LPVOID);
    2. DWORD WINAPI InjectedCode ( VOID *Param );
    3. int  GetProcId  ( char * ProcName );
    4.  
    5.  
    6. int main (){
    7.    
    8.     DWORD dwProcId;
    9.     byte *pMem = 0;
    10.     DWORD written;
    11.     DWORD ThreadId;
    12.     HANDLE hProc;
    13.     HANDLE hInjectedThread;
    14.     CONTEXT Context;
    15.  
    16.  
    17.     DWORD adr_MessageBoxA = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA");
    18.     dwProcId = GetProcId ( "calc.exe" );
    19.     hProc = OpenProcess ( PROCESS_ALL_ACCESS, 0, dwProcId );
    20.    
    21.  
    22.     if (hProc == NULL){
    23.         printf ("Error : %d\n", __LINE__ );
    24.         return 0;
    25.     }
    26.  
    27.     pMem = VirtualAllocEx ( hProc, NULL, 128,
    28.                     MEM_COMMIT | MEM_RESERVE,
    29.                     PAGE_EXECUTE_READWRITE );
    30.  
    31.     if ( pMem == NULL ){
    32.         printf ("Error : %d\n", __LINE__ );
    33.         return 0;
    34.     }
    35.  
    36.  
    37.     InjectedCodePtr = &InjectedCode;
    38.  
    39.     if ( 0 == WriteProcessMemory (  hProc,
    40.                            pMem,
    41.                            InjectedCodePtr,
    42.                            64,
    43.                            &written ) ){
    44.        
    45.             printf ("Error : %d\n", __LINE__ );
    46.         return 0;
    47.     }
    48.  
    49.  
    50.     hInjectedThread = CreateRemoteThread ( hProc, NULL, 0,(DWORD (__stdcall *) (VOID *))pMem,NULL, CREATE_SUSPENDED, &ThreadId );
    51.     if ( INVALID_HANDLE_VALUE == hInjectedThread ){
    52.         printf ("Error : %d\n", __LINE__ );
    53.         return 0;
    54.     }
    55.  
    56.  
    57.     Context.ContextFlags = CONTEXT_FULL;
    58.  
    59.     if ( 0 == GetThreadContext ( hInjectedThread, &Context ) ){
    60.         printf ("Error : %d\n", __LINE__ );
    61.         return 0;
    62.     }
    63.  
    64.     Context.Eax = 0;
    65.     Context.Ebx = 0;
    66.     Context.Ecx = 0;
    67.     Context.Edx = MB_OK;
    68.     Context.Esi = (DWORD) adr_MessageBoxA;
    69.  
    70.     if ( 0 == SetThreadContext ( hInjectedThread, &Context ) ){
    71.         printf ("Error : %d\n", __LINE__ );
    72.         return 0;
    73.     }
    74.  
    75.    
    76.     ResumeThread (hInjectedThread);
    77.     VirtualFree (pMem, 128, MEM_RELEASE);
    78.     CloseHandle (hInjectedThread);
    79.     CloseHandle (hProc);
    80.  
    81.  
    82.  
    83.     return 0;
    84. }
    85.  
    86. DWORD WINAPI InjectedCode ( VOID *Param ){
    87.  
    88.  
    89.     __asm {
    90.                         push eax
    91.             push ebx
    92.             push ecx
    93.             push edx
    94.             call esi
    95.     }
    96.     return 0;
    97. }
     
  11. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    А переменная InjectedCode где-то определяется? В этом коде, который сдесь выложен - нет
     
  12. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Кстати еще для инжектинга такого, не нужно для памяти делать PAGE_EXECUTE_READWRITE
    На EXECUTE много антивирусов ругается
     
  13. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Это CopyOnWrite - технология с униха. Дело в том что длл таки одна и та же, но при записи в страницу памяти на самом деле страница копируеться и измененная сущ. только в том процессе в котором ее изменили, в других она остаеться неизмененной
     
  14. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Кстати у Рихтера тоже про это прикольно описано
     
  15. Bryan_

    Bryan_ New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2007
    Сообщения:
    8
    это же инжектируемая функция. Может кто то объяснит почему она не исполняется в удалённом приложении.
     
  16. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Ты присваиваешь другой переменной ссылку на эту. А потом ту записываешь в удаленные процесс. Ответь, на мой первый вопрос.
     
  17. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Угу, и потом заинжектить это в системный процесс :) После чего тебе ругнеться деп, окошком "svchost пал смертью храбрых, почтим его paged pool память минутой молчания *обратный отсчет пошел*"