непонятки со статьёй Foly_Father

Тема в разделе "WASM.BEGINNERS", создана пользователем el-, 27 ноя 2006.

  1. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    вот автор пишет следующие ...

    вот я собственно и не понял, если все моудли грузятся после вызова NtResumeThread, то как я перехвачу LdrInitializeThunk, ведь createremotethread не сработает пока не запущен основной тред процесса ...

    если понимать выше написанное как перехват LdrInitializeThunk в вмде контроля создания новых процессов ... то тут тоже не понятки, как такое может быть ведь автор пишет ... до выполнения первых инструкций процесса ... но эта функция вызывается уже в созданом процессе и NtResumeThread уже сработала ...

    большая просьба помогите с этим разобратся ...
     
  2. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    не уж то ник то не в силах помоч ?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    почему?
     
  4. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    цитата: из статьи ms rem'a перехват апи часть первая:
    "Но этот метод работать не будет, так как в момент создания основной нити процесс еще не проинициализирован и CreateRemoteThread возвращает ошибку."

    т.е. основной тред надо один фиг запускать первым ...

    почему сказть не могу, ибо не знаю ...
     
  5. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    el-
    Все происходит в ring3. Пусть жертва создает процесс вызовом KERNEL32!CreateProcessW().
    Перехватываем NTDLL!NtCreateProcess(). CreateProcessW() вызывает NtCreateProcess()(Ex),
    и перехватчик получает управление. Отрабатываем вызов реальной функции NtCreateProcess()(Ex).
    После этого вызова сам процесс(объект "процесс" в ядре) готов, созданно адресное
    пространство процесса, на него спроецированна NTDLL.DLL, PEB тоже уже есть.
    Потоков в процессе еще еще нет. Также статический импорт не проинициализирован,
    TLS тоже не инициализированна. Куча процесса, указатель которой должен храниться
    в PEB->ProcessHeap не создана, значит GetProcessHeap() вызывать нельзя. Зная, что
    после создания объекта процесса будет создан поток вызывом NtCreateThread(), что
    повлечет за собой вызов LdrpInitialize (любой поток при создании начинает выполнятся именно с этой
    функции посредством User-APC (NtCreateThread() -> (sysinter/int2e) -> KeInitThread() ->
    PspUserThreadStartup() -> (following calls will be in new process) -> LdrInitializeThunk() ->
    LdrInitialize() -> (if this not initialized process) -> LdrInitializeProcess), а дальше учитывая что
    это первый поток в непроинициализированном процессе, вызов LdrInitializeProcess(), то можно
    перехватывать LdrInitialize() либо LdrInitializeThunk(), отрабатывать ее вызов и к этому моменту
    ни одна инструкция нового процесса с точки входа не выполнена, но мы уже получили
    управление. Правильно, создавать новые потоки с помощью KERNEL32!CreateRemoteThread()
    мы не сможем, но это и не нужно, достаточно просто узнать адрес LdrInitialize(),
    которая находится в NTDLL.DLL, и записать на ее место переход на наш обработчик,
    который также до этого надо записать в АП нового процесса.
    Ведь писать мы может без проблем, и сам код CreateProcessW() это делает с легкостью.