Запуск 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)