[吐槽] win10 WSL linux 子系统 ProcessNotify 进程路径
工作需要,对 win10 linux 子系统做监控,发现 PsSetCreateProcessNotifyRoutine 无效,遂google到:
https://blogs.msdn.microsoft.com/wsl/
文章说要 PsSetCreateProcessNotifyRoutineEx2,而且要 Minimum supported client Windows 10, version 1703,
事实证明这是扯淡,在14393就可以用该API,但是要MmGetSystemRoutineAddress获取该地址。
MSDN里很美好的表示:
PCREATE_PROCESS_NOTIFY_ROUTINE_EX SetCreateProcessNotifyRoutineEx;
void SetCreateProcessNotifyRoutineEx(
_In_ HANDLE ParentId,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
)
{ ... }
CreateInfo又是扯淡,这里并没有进程路径,Flags::IsSubsystemProcess也不对,也许文档和产品是两个物种,驴唇和马嘴。
笔者电脑,跑 VS2015 和 虚拟机win10,虚拟机内 win10 还是卡卡,有人嘴角已俏笑:“你电脑不行”。
对此回答是:
1.我电脑是i7-7700 + 128GB 固态硬盘
2.清理掉脑子里影响判断力的翔,面对一个很卡或很快的操作系统做选择时,才能有~~智选择。
笔者用 Vs2005 和 wdk7.1 编辑和编译了demo sys,然后很扯淡的给了个 STATUS_ACCESS_DENIED !!
MSDN PsSetCreateProcessNotifyRoutineEx2 曰:
The image that contains the callback routine pointer did not have IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY set in its image header.
有仇吗,至于吗?遍寻wdk7.1 给link 加参数的方法无果,于是解析PE结构,用 1.cpp 给 OptionalHeader->DllCharacteristics set IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY,
并 recalculate PE checksum. 嗯可以加载了。
然后发现了神奇的问题:
void SetCreateProcessNotifyRoutineEx(
_In_ HANDLE ParentId,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
)
ParentId 其实是 EProcess !!
ProcessId 是对的;
CreateInfo 里大部分结构为空,没有路径(CreateInfo本身也可以为0)。
那么,ProcessId 和 ParentId 本身可以从EProcess取到;路径怎么办?
google之,发现两篇:
http://www.freebuf.com/articles/system/103342.html
http://geek.csdn.net/news/detail/200336
第一个链接是腾讯电脑管家,网上转载满天飞的,里面所给的文件路径偏移在我14393里并不对。
第二个是张银奎的文章,thx to 老雷,这里的偏移是可以拿到的,但出现了问题三。
调试发现:
ProcessNotify 在创建进程的时候,
PWCHAR ProcPathName = *(PWCHAR*)(PicoContext+0x180);
ProcPathName 是父进程的路径,
而进程退出的时候,则是本进程的路径。
why?
ProcessNotify 在创建进程时断下,ba w8 (PicoContext+0x180),
断到LXCORE!LxpThreadGroupSetExecutable,看了这个函数,路径的问题就明白了。
参考断点如下:
PsRegisterPicoProvider
0 d fffff802`5ee904f4 0001 (0001) nt!PspCreatePicoProcess
1 e fffff800`0128105b 0001 (0001) 1!ProcessNotifyRoutineEx2 // 笔者的demo sys
3 e fffff80f`fd9bb500 0001 (0001) LXCORE!LxpThreadGroupSetExecutable
结论,玩屎要。。错了,玩10要小心,切防翔进脑。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课