首页
论坛
课程
招聘
[吐槽] win10 WSL linux 子系统 ProcessNotify 进程路径
2017-9-27 15:41 4771

[吐槽] win10 WSL linux 子系统 ProcessNotify 进程路径

2017-9-27 15:41
4771
[吐槽] 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要小心,切防翔进脑。

[公告]名企招聘!

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 9630
活跃值: 活跃值 (2200)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2017-9-27 17:11
2
0
感觉pico  process以后可以拿来干坏事
雪    币: 153
活跃值: 活跃值 (410)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengyunabc 活跃值 1 2017-9-27 17:51
3
0
感谢分享!
雪    币: 253
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
敉沧 活跃值 2017-9-27 18:00
4
0
hzqst 感觉pico process以后可以拿来干坏事
https://research.checkpoint.com/beware-bashware-new-method-malware-bypass-security-solutions/
之前的一篇文章。  WSL  绕过杀软。
雪    币: 8669
活跃值: 活跃值 (477)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2017-9-28 01:54
5
0
IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
直接改DriverSection的Flag就行了,没必要动PE文件
*(PULONG)((PCHAR)driverObject->DriverSection + 13 * sizeof(void*)) |= 0x20;

PS一句,PicoContext的结构惊奇,监控太惊奇

雪    币: 290
活跃值: 活跃值 (491)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
囧囧 活跃值 2017-9-28 13:45
6
0
cvcvxk IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY直接改DriverSection的Flag就行了,没必要动PE文件*(PULONG)((PCHAR)driverObje ...
改DriverSection的Flag  确实可以~
雪    币: 2288
活跃值: 活跃值 (581)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
VirtualCC 活跃值 2019-10-20 22:21
7
0
Use the linker's /INTEGRITYCHECK switch to enable. 
游客
登录 | 注册 方可回帖
返回