EreTIk's Box » Cтатьи, исходники » Создание процесса из драйвера режима ядра: Windows 8


Думаю, бывало и не раз у многих, что при написании драйвера режима ядра возникало желание создать настоящий процесс и делегировать часть задач ему. Но до недавнего момента это было табуировано MS'ом: нужные функции просто не экспортировались для драйверов из ядра ОС, оставались "грязные хаки"... И вот вышла Windows 8, в линейке которой (x86/AMD64-сборки 8102, 8250, 8400 и, 9200) у ntoskrnl.exe появились пара "секретных" экспортов: безымянные экспорты с ординалами 1 и 2. Но при наличии символов ядро охотно раскроет свой секрет (ниже приведен отрывок из вывода команды "dumpbin /EXPORTS ntoskrnl.exe"):

... 1 0035E96D [NONAME] _PsCaptureUserProcessParameters@8 2 000F7470 [NONAME] _ZwCreateUserProcess@44 ...

Набросав несложный скрипт, легко ищется виновник этого торжества: condrv.sys: "Console Driver". Заглянув внутрь PE-файла можно найти использование этих функций: запуск процесса "\SystemRoot\System32\Conhost.exe" с нужными параметрами. Поймать его работу в динамике тоже достаточно просто, достаточно просто запустить cmd.exe:

1: kd> !thread THREAD 82b47300 Cid 0ee8.0eec Teb: 7f56f000 Win32Thread: 00000000 RUNNING on processor 1 Not impersonating DeviceMap 91bf9408 Owning Process 82ba54c0 Image: cmd.exe Attached Process N/A Image: N/A Wait Start TickCount 16360 Ticks: 0 Context Switch Count 15 IdealProcessor: 0 UserTime 00:00:00.000 KernelTime 00:00:00.015 Win32 Start Address cmd!mainCRTStartup (0x00ae9de1) Stack Init 94574de0 Current 945749f4 Base 94575000 Limit 94572000 Call 0 Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 ChildEBP RetAddr Args to Child 94574aa4 935e05b6 94574bac 94574b44 02000000 nt!ZwCreateUserProcess (FPO: [11,0,0]) 94574b74 935e0664 94574bac 1360de35 82b3fc28 condrv!CdpCreateProcess+0xba (FPO: [Non-Fpo]) 94574bf8 935e0935 00000001 006e20a8 82b3fc28 condrv!CdpLaunchServerProcess+0x80 (FPO: [Non-Fpo]) 94574c1c 935de35e 939b0de0 006e20a8 00000580 condrv!CdpServerFastIoctl+0x11b (FPO: [7,1,4]) 94574c40 810cba8b 82b3fc28 00000001 006e20a8 condrv!CdpFastIoDeviceControl+0x44 (FPO: [Non-Fpo]) 94574cf0 810d1ace 82b3fc54 00000000 00000000 nt!IopXxxControlFile+0x3d0 (FPO: [Non-Fpo]) 94574d24 80fc5c6c 0000000c 00000000 00000000 nt!NtDeviceIoControlFile+0x2a (FPO: [Non-Fpo]) 94574d24 77046f54 0000000c 00000000 00000000 nt!KiFastCallEntry+0x12c (FPO: [0,3] TrapFrame @ 94574d54) 0063ee98 7704600a 74b4c21e 0000000c 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 0063ee9c 74b4c21e 0000000c 00000000 00000000 ntdll!NtDeviceIoControlFile+0xa (FPO: [10,0,0]) 0063eee0 74b4bfbb 0063ef18 0063ef0c 0000000c KERNELBASE!ConsoleLaunchServerProcess+0x59 (FPO: [Non-Fpo]) 0063f158 74b17dc1 000004c0 00000001 7f568000 KERNELBASE!ConsoleAllocate+0xe1 (FPO: [Non-Fpo]) 0063f190 74b1f140 74b00000 00000001 006e1a60 KERNELBASE!ConsoleInitialize+0x189 (FPO: [0,9,4]) 0063f3d4 74b0d90b 74b00000 00000000 0063f3fc KERNELBASE!_KernelBaseBaseDllInitialize+0x3a1 (FPO: [Non-Fpo]) 0063f3e8 7705ef28 74b00000 00000001 00000000 KERNELBASE!KernelBaseDllInitialize+0x14 (FPO: [Non-Fpo]) 0063f408 7705efcc 74b0d8f7 74b00000 00000001 ntdll!LdrxCallInitRoutine+0x14 0063f450 7705fe72 74b0d8f7 74b00000 00000001 ntdll!LdrpCallInitRoutine+0x63 (FPO: [Non-Fpo]) 0063f544 7705fcef 006e1af8 006e1b60 006e1b60 ntdll!LdrpInitializeNode+0x2d4 (FPO: [SEH]) 0063f564 7706692d 006e1af8 0063f5e4 0063f587 ntdll!LdrpInitializeGraph+0x55 (FPO: [3,1,4]) 0063f58c 7705fcd4 006e18e8 0063f5e4 0063f5bb ntdll!LdrpInitializeGraph+0x70 (FPO: [3,1,4]) 0063f5bc 770601d9 0063f5e4 ffffffff 00000000 ntdll!LdrpPrepareModuleForExecution+0x188 (FPO: [Non-Fpo]) 0063f770 7705f367 7706398c 0063f79c 00000000 ntdll!LdrpLoadDll+0x3e6 (FPO: [SEH]) 0063f7a8 7706db5a 00000000 00000000 7706398c ntdll!LdrLoadDll+0x71 (FPO: [Non-Fpo]) 0063fba0 77060696 0063fc28 76ff0000 937b705a ntdll!LdrpInitializeProcess+0x13d8 (FPO: [Non-Fpo]) 0063fbf0 770605ec 7f568000 76ff0000 00000000 ntdll!_LdrpInitialize+0xa1 (FPO: [Non-Fpo]) 0063fc04 770605bc 00000000 00000000 00000000 ntdll!LdrpInitialize+0x1c (FPO: [0,0,0]) 0063fc14 00000000 0063fc28 76ff0000 00000000 ntdll!LdrInitializeThunk+0x12 (FPO: [Non-Fpo])

Параметры этих функций уже давно можно найти в интернете, ntoskrnl.lib из DDK для Windows 8 содержит эти функции. Теперь дело за малым: будем ждать описание функций в MSDN =))


ΞρεΤΙκ