Запуск win32-процесса из KernelMode

From
Lev Fireworker ()
To
All ()
Date
2003-04-08T05:31:56Z
Area
SU.WINDOWS.NT.PROG
From: "Lev Fireworker" <firew0rker@nteam.ru>

Hi All,

Hi All,

Мне нужно запускать win32-процессы из драйвера, причем дергать драйвер
из UserMode будет некому.
Скрестил код из примера 6.2 книги Гэри Неббета и rk_exec.c из ntrootkit.
Кто не видел кода - покажу, просто он сильно громоздкий чтобы сразу
посылать сюда. То, что получилось, запускает процесс если вызвано из
обработчика, например, IRP_MJ_CREATE (т.е. из контекста к-л. нормального
процесса). Но если вызывать из DriverEntry, не срабатывает InformCsrss,
т.к. в процессе system по адресу 0x77fa8168 лежит 0. Пробовал так:
void executeFromContextOf(wchar_t *ImageFileName, wchar_t *ProcessName)
{
        _asm int 3;
        HANDLE  ProcessHandle,ThreadHandle;
        UNICODE_STRING  name;   
        RtlInitUnicodeString(&name,ProcessName);
        CLIENT_ID clid={(VOID*)93,NULL}; //это ламерство потом пофиксю
        OBJECT_ATTRIBUTES attr={sizeof(OBJECT_ATTRIBUTES),0,/*&name*/NULL,
OBJ_CASE_INSENSITIVE};
        ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &attr, &clid);
        PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS,
NULL,ProcessHandle, NULL, execute, ImageFileName);
}
- ZwRequestWaitReplyPort возвращает 0, но процесс не может загрузить
kernel32, будто InformCsrss вообще не вызывали.
А если так:
        ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation, &pi,
sizeof(pi), NULL);
        KeAttachProcess(pi.PebBaseAddress);
        execute(ImageFileName);
        KeDetachProcess();      

то pi.PebBaseAddress равен какому-то адресу, где вообще нет страницы.
Естественно BSOD.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)