内核反截图思路流程
0x0 提要
NtUserSetWindowDisplayAffinity 在win32kfull.sys
ValidateHwnd 在 win32kbase.sys
0x1 分析NtUserSetWindowDisplayAffinity
先把传入的句柄通过ValidateHwnd转换成驱动对象,然后调用SetDisplayAffinity
0x2分析SetDisplayAffinity
分析如图,最后是通过调用ChangeWindowTreeProtection来改变
0x3 怎么找到函数地址思路
1.找到win32kfull.sys的地址,再找到NtUserSetWindowDisplayAffinity的地址
再找到SetDisplayAffinity,最终找到ChangeWindowTreeProtection
2.怎么找win32kfull.sys,通过ZwQuerySystemInformation模拟任务管理器一样遍历找到
3.有了win32kfull.sys基址,通过特征码查找后续的函数地址
0x4 ChangeWindowTreeProtection需要的参数
1.先获得传入的句柄
2.同理上面的思路获得win32kbase.sys,遍历得到ValidateHwnd的基址,将句柄转换成驱动对象
3.定义ChangeWindowTreeProtection参数的结构体
0x5 怎么找到我们需要反截图的进程和APC注入
1.同理上面通过ZwQuerySystemInformation遍历找到需要反截图的进程
2.同理通过遍历找到winlogon的PID(管理用户登录登出),为什么要找到这个,为了获得系统EPROCESS结构体 通过PsLookupProcessByProcessId。然后使用KeStackAttachProcess附加到我们想要反截图的进程上。
0x6 思路整理总结
1.先写一个R0-R3的通信
2.R3工作:通过FindWindow查找到进程句柄,然后传入dwAffinity的值。
3.R0工作:通过APC注入到进程,然后改变进程的ChangeWindowTreeProtection
4.实现跳过各个调用函数,直接改变最后的保护