Вопрос по куску кода...

Тема в разделе "WASM.BEGINNERS", создана пользователем colobos, 10 фев 2007.

  1. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    В статье "Инжект как метод обхода фаерволлов, жив или мертв?" встретил такой код инжекта в чужой процесс:

    Код (Text):
    1. LoaderCode:
    2.   push     0
    3.   push     InjectSize
    4.   push     esi
    5.   push     InjectCode
    6.   push     edi
    7.   call     ebx
    8. LoaderSize = $-LoaderCode
    9.  
    10. InjectCode:
    11.   call     $+5
    12.   pop      esi
    13.   sub      esi, $-InjectCode-1
    14.   push     0
    15.   lea      eax, [esi+caption-InjectCode]
    16.   push     eax
    17.   lea      eax, [esi+text-InjectCode]
    18.   push     eax
    19.   push     0
    20.   call     [esi+p_MessageBox-InjectCode]
    21.   retn     4
    22.  
    23.   p_MessageBox dd 0
    24.   text    db 'Fuck you, world!', 0
    25.   caption db 'Code inject', 0
    26. InjectSize = $-InjectCode
    27.  
    28.  
    29. ProcessName db 'iexplore.exe', 0
    30. align 4
    31. context     CONTEXT 0
    32.  
    33. entry $
    34.   push     ebp
    35.   mov      ebp, esp
    36.   sub      esp, 8
    37.   mov      eax, [MessageBox]
    38.   mov      [p_MessageBox], eax
    39.   call     FindProcess
    40.   test     eax, eax
    41.   jz       @F
    42.   invoke   OpenProcess, PROCESS_ALL_ACCESS, 0, eax
    43.   test     eax, eax
    44.   jz       @F
    45.   mov      [ebp-4], eax
    46.   invoke   VirtualAllocEx, [ebp-4], 0, LoaderSize+InjectSize, MEM_COMMIT+MEM_RESERVE, PAGE_EXECUTE_READWRITE
    47.   test     eax, eax
    48.   jz       @F
    49.   mov      edi, eax
    50.   invoke   WriteProcessMemory, [ebp-4], edi, LoaderCode, LoaderSize, 0
    51.   lea      eax, [ebp-8]
    52.   invoke   DuplicateHandle, -1, -1, [ebp-4], eax, 0, 0, DUPLICATE_SAME_ACCESS
    53.   invoke   CreateRemoteThread, [ebp-4], 0, 0, edi, 0, CREATE_SUSPENDED, 0
    54.   mov      esi, eax
    55.   mov      [context.ContextFlags], CONTEXT_FULL
    56.   invoke   GetThreadContext, esi, context
    57.   lea      eax, [edi+LoaderSize]
    58.   mov      [context.regEsi], eax
    59.   push     dword [ebp-8]
    60.   pop      [context.regEdi]
    61.   push     [ReadProcessMemory]
    62.   pop      [context.regEbx]
    63.   invoke   SetThreadContext, esi, context
    64.   invoke   ResumeThread, esi
    65.   invoke   CloseHandle, esi
    66.   invoke   CloseHandle, [ebp-4]
    67.   invoke   Sleep, 100
    68. @@:
    69.   leave
    70.   ret
    Вопрос: зачем здесь DuplicateHandle. Прошу сильно не пинать - сам догадываюсь, что вопрос идиотский.
     
  2. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    RTFM, platform SDK
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    colobos Смотри - мы копируем в целевой процес лоадер:
    LoaderCode:
    push 0
    push InjectSize
    push esi
    push InjectCode
    push edi
    call ebx
    LoaderSize = $-LoaderCode

    Это вызов функции ReadProcessMemory(смотри как устанавливаются регистры с помощью SetThreadContext). Функция ReadProcessMemory описана так:
    BOOL ReadProcessMemory(
    HANDLE hProcess, // handle of the process whose memory is read
    LPCVOID lpBaseAddress, // address to start reading
    LPVOID lpBuffer, // address of buffer to place read data
    DWORD nSize, // number of bytes to read
    LPDWORD lpNumberOfBytesRead // address of number of bytes read
    );
    Нас интересует параметр hProcess - хендл процеса из которого копируем. А где взять этот хендл? Вот он и создаётся фунуцией DuplicateHandle.
     
  4. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Спасибо, понял. А при написании инжект кода (без dll) можно пользоваться только метками? Возможно ли подставить в чужой процесс несколько процедур (по типу proc....endp), ссылающихся одна на другую?
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Если ты будешь вставлять код типа call/jmp SomeFunc, то можно, т.к. эти операторы используют относительные адреса. А вот использовать mov eax,offset SomeFunc/call eax нельзя. Придется использовать дельта-смещение