Драйвер ядра Windows: совпадает ли «HANDLE UniqueThread» в «CLIENT_ID CreateThreadId» во время загрузки процесса? - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь написать драйвер APC для инъекций DLL, я нашел этот пример и подумал изменить его в соответствии с моими потребностями.

После того, как я понял код, этокак я думал изменить его (и мой вопрос пришел оттуда).

В коде писатель использовал PsLookupThreadByThreadId для получения ссылочного указателя на структуру ETHREADцелевого процесса.

PsLookupThreadByThreadId(pSpi->Threads[0].ClientId.UniqueThread,&Thread)

, но для получения SYSTEM_THREAD_INFORMATION для ручки UniqueThread он использовал ZwQuerySystemInformation

Я хочу загрузить свою dll сразу после загрузки ntdll, поэтому я хочу использовать PsSetCreateProcessNotifyRoutineEx и сохранить UniqueThread из PS_CREATE_NOTIFY_INFO , полученного при обратном вызовевызван для процесса, на который я нацелен.

моя цель - внедрить мою dll в обратный вызов PloadImageNotifyRoutine , но не использовать ZwQuerySystemInformation , как он делает, чтобы получить UniqueThread , но сохраните его в обратном вызове PcreateProcessNotifyRoutineEx .

Итак, мой вопрос: могу ли я доверять UniqueThread , полученному от PS_CREATE_NOTIFY_INFO ,То же самое в течение всего времени загрузки процесса?

1 Ответ

0 голосов
/ 12 мая 2018

Я хочу использовать PsSetCreateProcessNotifyRoutineEx и сохранить UniqueThread от PS_CREATE_NOTIFY_INFO Я получил, когда обратный вызов вызывается для процесса, на который я нацеливаюсь.

о CreatingThreadId от PS_CREATE_NOTIFY_INFO

Идентификатор процесса и идентификатор потока процесса и потока, который создал новый процесс

этот идентификатор не для нового созданного процесса / потока, а для создателя. если вы хотите внедрить self dll в PloadImageNotifyRoutine callback - PcreateProcessNotifyRoutineEx для вас бесполезен.

PloadImageNotifyRoutine вызывается, когда изображение отображается на целевой процесс - внутри ZwMapViewOfSection. вам нужно убедиться, что ProcessId ( второй параметр PcreateProcessNotifyRoutineEx - идентификатор процесса, в который загружается изображение ), равен PsGetCurrentProcessId(). это означает, что изображение загружено в текущий процесс, и вы можете использовать KeGetCurrentThread() - вам не нужно PsLookupThreadByThreadId вообще

Я хочу загрузить свою DLL сразу после загрузки ntdll

на данный момент любые структуры пользовательского режима в процессе еще не инициализированы. потому что он инициализирован ntdll. В результате - если вы введете свой apc и принудительно выполните его в этот момент - вы получите сбой процесса. не более

Могу посоветовать вам ввести dll при загрузке kernel32.dll . и здесь вам нужно проверить, что это загрузка как dll, а не просто отображение изображений - проверьте ArbitraryUserPointer в потоке teb - указывают ли они на L"*\\kernel32.dll": smss.exe map kernel32.dll во время создания \\KnownDlls (в данном случае ArbitraryUserPointer == 0) wow64 обрабатывает несколько временных карт kernel32.dll (32 и 64 бит) с именами L"WOW64_IMAGE_SECTION" или L"NOT_AN_IMAGE" в ArbitraryUserPointer

...