Надо сделать так, чтобы процес, в который внедряемся, не завершился до окончания работы внедряемого кода. Самое простое, что приходит в голову - перехват ExitProcess-подобных функций. Насколько я понимаю, все они сводятся к ZwTerminateProcess или LdrShutdownProcess. Достаточно перехватывать эти две?
а что если процесс завершится при перехвате ExitProcess??? Немного странный вопрос... Тем не мение, первое что приходит в голову мне - на время перехвата, остановить в перехватываемом процессе все потоки.
Не понял вопроса. Что значит при перехвате. Останавливать потоки нельзя. Идея в том, чтобы вместо, например ZwTerminateProcess, вызвалась моя функция, в которой будет что-то типа Код (Text): WaitForSingleObject( hMutex ); real_ZwTerminateProcess(...) а при завершении внедряемого кода будет вызываться ReleaseMutex( hMutex )
http://wasm.ru/forum/viewtopic.php?id=22106&p=1 Так значит после первого возвращается или нет? ( еще не дебажил на предмет двойного вызова ZwTerminateProcess из ExitProcess, приду домой - проверю. Но все же.. ) -- Проверил. Таки возвращается Хотя в моем случае это не важно. Главное перехватить вызов и подождать, пока Х-код выполнится.
не в ядре -- Реализовал такой перехват. В самом начале перехваченных функций код, при чем обьект события с именем EXIT_EVENT_NAME уже существует и занят. Код (Text): HANDLE h = CreateEvent( 0, 0, 0, EXIT_EVENT_NAME ); WaitForSingleObject( h, INFINITE ); SetEvent( h ); В тестовой проге сразу же после вызова Х-кода, вызываю ExitProcess. Происходит вызов моей функции, WaitForSingleObject "подвисает", далее рабоает поток, в котором выполняется Х-код. И вот там при вызове CopFileW прога виснет. При дебаге в нтдлл несколько раз встречается EnterCriticalSection, подозреваю, что проблема приблизительно такая: перед вызовом перехваченной ZwTerminateProcess вход в критическую секцию уже был сделан, а выход из-за WaitForSingleObject - нет. Вызов CopyFileW приводит к зависанию на входе в ту же секцию. Выходит, нельзя так перехватывать? или я ошибся где-то?
psu выхода из секции PebLock нет и не будет, процессу писец уже эта секция везде юзается, например на входе в CreateFileW в этом процессе никакой код кроме простейшего уже работать не будет короче - выноси все свои Copy в другой процесс, а тут оставляй только Wait
плохо тогда может хукать что-нибуть повыше уровнем? Типа ExitProcess, TerminateProcess. Не так уж и много прог пользуть недокументированные ZwTerminateProcess и т.д А создавать отдельный процесс.. слишком палевно
psu зачем создавать? есть винлогон лсасс сервицес експлорер в конце концов, инжектись туда, создавай тред и там все делай, а в таргетном - только вейт