Конференция "WinAPI" » Об инициализации процессса и инжекте
 
  • Сергей М. © (26.10.10 21:05) [0]
    Суть:

    1. Работает кернел-драйвер, использующий PsSetCreateProcessNotifyRoutine для извещения приложения о старте процессов

    2. При получении извещения о старте интересующего процесса приложение пытается с использованием CreateRemoteThread как можно раньше инжектировать в его АП dll-модуль, на что получает вполне объяснимый отлуп в виде ERROR_NOT_ENOUGH_MEMORY.

    Вопрос:

    А как грамотно подождать пока произвольный процесс-жертва будет готова к инъекции, но не опоздать при этом ?

    Кривоватое решение у меня есть, но на то оно и кривоватое что я в нем не уверен ..
  • Сергей М. © (27.10.10 10:16) [1]
    И тишина)... будто никто и никогда не заморачивался такой задачей..

    Привожу свое кривое решение:


    function WaitForJnjectable(ProcessID: Cardinal; WaitTimeout: Cardinal): Boolean;
    var
     hProcess: THandle;
     BytesNeeded: DWORD;
    begin
     Result := False;
     hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
     if hProcess = 0 then Exit;
     while True do begin
       if EnumProcessModules(hProcess, nil, 0, BytesNeeded) then
         if BytesNeeded >= (SizeOf(THandle)*3) then begin //ntdll32, kenel32 and user32 must be loaded at least
           Result := True;
           Break;
         end;
       if WaitTimeout < INFINITE then begin
         Dec(WaitTimeout);
         if WaitTimeout = 0 then begin
           CloseHandle(hProcess);
           SetLastError(ERROR_TIMEOUT);
           Exit;
         end;
       end;
       Sleep(1);
     end;
     CloseHandle(hProcess);
    end;



    Оно действительно кривое ?
  • Slym © (27.10.10 13:36) [2]
    PsSetLoadImageNotifyRoutine и ждать ntdll32, kenel32 and user32 must be loaded at least
  • Сергей М. © (27.10.10 14:42) [3]

    > Slym ©   (27.10.10 13:36) [2]


    предположим, переделка KMD для задействования в нем PsSetLoadImageNotifyRoutine исключена

    меня интересует прикладное кольцо ..
  • Игорь Шевченко © (27.10.10 15:10) [4]
    Чем AppInit_Dlls не устраивает ?
  • Сергей М. © (27.10.10 15:16) [5]

    > Чем AppInit_Dlls не устраивает ?


    Игорь, мы эту тему уже обсасывали)
    Не всякую дельфийскую либу можно приспособить под использование этой фичи.
  • Сергей М. © (27.10.10 16:01) [6]

    > Slym ©   (27.10.10 13:36) [2]


    Да и не факт что инжект обязан пройти успешно при факте успешной загрузки и инициализации эти 3-х либ ..
    Это я лишь сделал предположение что этого будет достаточно .. Но насколько оно оправдано ?
  • Rouse_ © (27.10.10 16:46) [7]
    А если притвориться отладчиком? OpenProcess + DebugActiveProcess и вперед, тут тебе и подгрузка библиотек и все что угодно...
  • Сергей М. © (27.10.10 16:50) [8]

    > Rouse_


    Можно, конечно, и притвориться, но это, полагаю, ощутимо усложнит задачу ..
  • Rouse_ © (27.10.10 16:53) [9]
    Ну кода пописать конечно придется, зато будет полный контроль над процессом и изначальная задача решается...
  • Rouse_ © (27.10.10 16:57) [10]
    Собственно даже кода много не потребуется - всего лишь дождаться выхода на OEP (пара десятков циклов) ну или на крайний случай LOAD_DLL_DEBUG_EVENT с отлавливанием подгрузки требуемых библиотек, все остальное пропускать по ContinueDebugEvent
  • Сергей М. © (27.10.10 17:13) [11]
    Факт выхода на OEP - это, конечно, идеальный вариант, в этом случае, я полагаю, даже нет повода заморачиваться состоянием загруженности ключевых сист.модулей.. ежу понятно что на этот момент они уже загружены...

    Просто я подумал что, возможно, существуют и иные потайные ходы (нежели дабаг-контроль процесса), позволяющие оперативно отследить момент прохождения OEP.

    Тут еще возникает такой попутный вопрос: отсутствие (или неполная инициализация) какой конкретно либы в АП жертвы приводит к отказу вызова CreateRemoteThread() с кодом, говорящим якобы NOT ENOUGH MEMORY..
  • Rouse_ © (27.10.10 17:47) [12]
    Кстати посмотри еще вот это, не твой ли случай?
    http://mnin.blogspot.com/2007/05/injecting-code-into-privileged-win32.html
  • Rouse_ © (27.10.10 17:54) [13]
    Ибо если смотреть исходники CreateRemoteThread, то там наблюдается следующий код:

       //
       // Allocate a stack for this thread in the address space of the target
       // process.
       //

       Status = BaseCreateStack(
                   hProcess,
                   dwStackSize,
                   0L,
                   &InitialTeb
                   );

       if ( !NT_SUCCESS(Status) ) {
           BaseSetLastNTError(Status);
           return NULL;
           }



    Здается мне что именно это и приводит к ошибке NOT ENOUGH MEMORY...
  • Leonid Troyanovsky © (27.10.10 18:31) [14]

    > Сергей М. ©   (27.10.10 17:13) [11]

    > Просто я подумал что, возможно, существуют и иные потайные
    > ходы

    http://delphimaster.net/view/1-1179920037
    Правда, по ссылке http://delphimaster.net/view/2-1178820436/
    39 сообщений не показываются, но, резюм есть.

    --
    Regards, LVT.
  • имя (27.10.10 19:19) [15]
    Удалено модератором
  • Rouse_ © (27.10.10 20:05) [16]
    Кстати, а если отлавливаемый процесс всегда известен, то мошт ну его эту драйверную прослойку и инжект с третьего кольца? Не проще ли в секцию импорта добавить свою библиотеку?
  • Сергей М. © (27.10.10 22:36) [17]

    > Leonid Troyanovsky ©   (27.10.10 18:31) [14]


    Спасибо !

    Все бы ничего, но успею ли я гарантированно "затормозить" жертву ДО того как она пройдет OEP ?
    Не я же стартую жертву ..


    > Rouse_ ©   (27.10.10 20:05) [16]


    Нет, жертва может быть произвольной и заренее неизвестна.
  • Настоящий Финский Парень (29.10.10 19:21) [18]

    > Сергей М. ©   (27.10.10 10:16) [1]


    Отличное вполне решение, я так издевался над Касперским, сможет он при запуске сервиса или gui что либо сделать, нет не смог, вредосная dll успешна внедрена, только потом плакать начинает когда уже поздно брыкатся
  • Настоящий Финский Парень (29.10.10 19:25) [19]
    Делал кстати в User Mode по таймеру 1ms и ни один процес не устоял, кого бы не мучил
 
Конференция "WinAPI" » Об инициализации процессса и инжекте
Есть новые Нет новых   [134430   +2][b:0][p:0.002]