Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых) |
![]() |
eXeL@B —› Программирование —› Полная инициализация процесса |
Посл.ответ | Сообщение |
|
Создано: 11 августа 2014 12:59 · Личное сообщение · #1 В общем написал лодырь... Цель, запустить процесс дождаться полной инициализации, заморозить, пропатчить в памяти.. и отпустить.. Вопрос, как поймать момент полной инициализации без запуска процесса? WaitForInputIdle(pi.hProcess, INFINITE) не канает.. т.к. запускает процесс и патчить уже поздно. WaitForSingleObject(pi.hProcess, INFINITE) срабатывает только если процесс завершен, тоже не канает. Дрова не предлагать, нужен вариант из под юзермода... Использую сейчас вариант Code:
Но Sleep крайне не надежен... В общем, подскажите вариант... плиз.. ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 11 августа 2014 13:09 · Личное сообщение · #2 |
|
Создано: 11 августа 2014 13:13 · Личное сообщение · #3 |
|
Создано: 11 августа 2014 13:20 · Поправил: deniskore · Личное сообщение · #4 В своем лоадере использую следующую схему. 1) Беру адрес EntryPoint из PE header-a, далее CreateProcess (SUSPENDED | DEBUG) 2) Нахожу базовый адрес по которому загрузился. 3) Пишу привилегированные интсрукции на TLS и EP. 4) Отпускаю процесс, ловлю в дебаг ивенте свои инструкции, патчу нужные данные по оффсету от базы или поиском, восстанавливаю оригинальные байты на TLS или EP. 5) Отпускаю процесс. При желании сюда же можно воткнуть анти-анти-дебаг ![]() ![]() |
|
Создано: 11 августа 2014 13:31 · Личное сообщение · #5 |
|
Создано: 11 августа 2014 13:32 · Личное сообщение · #6 Archer пишет: И что мешает воткнуть eb fe на точку входа или бряк, если на дебаг апи? Бро..(( такая тема.. дело в том, что мой ехе имеет релоки.. и их не вырезать.. т.к. чекается CRC.. под вин7 ехе может грузиться куда угодно.. Для того чтобы найти его в памяти... использую комбинацию из 3 пальцев)) Code:
только после этого смогу найти реальный адрес OEP ... но это после инициализации только.. т.к. не инициализированный процесс Module32First посылает нахер... ERROR_PARTIAL_COPY(( ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 11 августа 2014 13:35 · Личное сообщение · #7 |
|
Создано: 11 августа 2014 13:37 · Поправил: DenCoder · Личное сообщение · #8 |
|
Создано: 11 августа 2014 13:44 · Личное сообщение · #9 |
|
Создано: 11 августа 2014 13:59 · Поправил: DenCoder · Личное сообщение · #10 не креатпроцесс, а геттредконтекст! Берёшь хендл потока из известной структуры для креатпроцесса твоего, берёшь геттредконтекст'ом значения регистров, смотришь eax ))) ----- IZ.RU ![]() |
|
Создано: 11 августа 2014 14:04 · Личное сообщение · #11 |
|
Создано: 11 августа 2014 14:21 · Поправил: Vovan666 · Личное сообщение · #12 |
|
Создано: 11 августа 2014 14:28 · Поправил: ajax · Личное сообщение · #13 DenCoder пишет: берёшь геттредконтекст'ом значения регистров, смотришь eax под x64 фуфло будет. хз почему - не копался Vovan666 зная оффсет, или вычисляя по хеадеру - все относительно... ps: ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 11 августа 2014 14:36 · Поправил: OnLyOnE · Личное сообщение · #14 Vovan666 пишет: при создания процесс CREATE_SUSPENDED [EBX+8]=ImageBase Это я видел. ![]() DenCoder пишет: Берёшь хендл потока из известной структуры для креатпроцесса твоего, берёшь геттредконтекст'ом значения регистров, смотришь eax ))) GetThreadContext в еах == 1 а структура контекста обнуляется полностью.. ----- aLL rIGHTS rEVERSED! ![]() |
|
Создано: 11 августа 2014 15:10 · Поправил: Vovan666 · Личное сообщение · #15 В общем как-то так Code:
![]() |
|
Создано: 11 августа 2014 18:42 · Поправил: DenCoder · Личное сообщение · #16 OnLyOnE пишет: GetThreadContext в еах == 1 Не eax на выходе функции, ё-маё ))) А в структуре контекст поле DWORD Eax; А то, что 1 возращает эта функция - это значит успех ) Код на Си Code:
Vovan666 А что такое Code:
Смещение от EP к OEP ? Для какого-то хитрого пакера? ) ----- IZ.RU ![]() |
|
Создано: 11 августа 2014 21:58 · Личное сообщение · #17 DenCoder пишет: Смещение от EP к OEP ? Для какого-то хитрого пакера? ) х.з. но если CREATE_SUSPENDED = System breakpoint в ольке, то именно там оеп, а не просто в еах. писал от балды без проверке на жертве, т.к. всегда юзаю что-то типа mov eax,threadcontext.regEbx add eax,8h invoke ReadProcessMemory,pinfo.hProcess,eax,addr oep,4h,0 add,[oep],EP ![]() |
|
Создано: 12 августа 2014 13:36 · Личное сообщение · #18 Vovan666 System breakpoint в ольке != CREATE_SUSPENDED. 1) Когда создаётся процесс с флагом CREATE_SUSPENDED, мы находимся на месте ещё перед стартом APC, который делает все необходимые инициализации, в том числе и импорт, и релоки, и TLS, если в хидере нет ошибок. ) 2) Когда в ольке брякаешься на System breakpoint, часть инициализации в APC уже отработало. В первом случае (забыл уже, где именно, но либо в ntdll создающего процесса, либо в ntoskrnl - давно реверсил) устанавливается контекст в создаваемом процессе, который сохраняется APC-рутиной для того, чтобы после инициализации установить его заново. И как раз на XP и 7ке x86 на этапе присваивания контекста в eax заносится EP программы (он же и OEP, если прога ничем не накрыта). В общем, ----- IZ.RU ![]() |
|
Создано: 12 августа 2014 13:50 · Личное сообщение · #19 |
![]() |
eXeL@B —› Программирование —› Полная инициализация процесса |
Эта тема закрыта. Ответы больше не принимаются. |