Конференция "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 и ни один процес не устоял, кого бы не мучил
  • xayam © (29.04.11 12:34) [20]

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

    http://delphimaster.net/view/2-1178820436/0-40
  • xayam © (04.05.11 17:19) [21]

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

    косяк исправлен, спасибо за подсказку
  • Leonid Troyanovsky © (07.05.11 23:10) [22]

    > xayam ©   (04.05.11 17:19) [21]

    > косяк исправлен, спасибо за подсказку

    Воспринял.

    Пожалуйста, всегда готов.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (07.05.11 23:10) [23]

    > xayam ©   (04.05.11 17:19) [21]

    > косяк исправлен, спасибо за подсказку

    Воспринял.

    Пожалуйста, всегда готов.

    --
    Regards, LVT.
  • p © (09.04.12 20:35) [24]
    Здравствуйте

    В продолжении темы

    Написал драйвер, ставлю callback на PsSetLoadImageNotifyRoutine для отслеживания загрузки kernel32.dll, в 32 битных ОС все работает отлично, но в x64 начиная с Vista для драйверов без цифровой подписи сделали облом, в тоже время начиная с Vista появилась LdrRegisterDllNotification которая вроде позволяет обойтись без PsSetLoadImageNotifyRoutine, собственно вопрос следующий, будет ли работать неподписанный драйвер в XP 64 бит?
  • p © (09.04.12 20:39) [25]
    Если будет то в Windows 2000...XP x32/x64 можно использовать неподписанный драйвер, а в Vista...7 LdrRegisterDllNotification
  • Rouse_ © (09.04.12 21:23) [26]

    > будет ли работать неподписанный драйвер в XP 64 бит?

    нет
  • p © (13.04.12 07:23) [27]
    Попробовал запустить в XP 64 SP2, работает, правда странности какие то наблюдаются, если .sys на рабочем столе сервис стартует, если в папке system32/drivers запускаться не хочет
  • brother © (13.04.12 09:34) [28]
    > если .sys на рабочем столе

    имхо, туда доступ пользователю полный

    > если в папке system32/drivers запускаться не хочет

    имхо, нет соотв. прав пользователя...
  • p © (19.04.12 19:43) [29]

    > p ©   (09.04.12 20:39) [25]


    LdrRegisterDllNotification

    фигня - только для своего процесса

    Полюбому делать цифровую подпись для какого то конечного продукта, а тестировать драйвера bcdedit.exe -set TESTSIGNING ON + самопальный сертификат
 
Конференция "WinAPI" » Об инициализации процессса и инжекте
Есть новые Нет новых   [134430   +3][b:0][p:0.002]