wordpress邀请注册,网站优化工作,创建一个网络平台需要多少钱,做隐私的网站Windows内核新手上路2——挂钩shadow SSDT 文章核心内容#xff1a;安全软件窗口保护、安全输入、截屏保护的一些思路。挂钩NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMes…Windows内核新手上路2——挂钩shadow SSDT 文章核心内容安全软件窗口保护、安全输入、截屏保护的一些思路。挂钩NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMessage、NtUserMessageCall、NtUserSetWindowLong、NtUserShowWindow、NtUserDestroyWindow、NtUserCallHwndParamLock用于窗口保护挂钩了NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage用于安全输入挂钩NtGdiBitBlt、NtGdiStretchBlt用于截屏保护。 a) Shadow SSDT简介
Shadow SSDT亦可称SSSDT英文全名Shadow System Services Descriptor Table中文直译“阴影系统服务描述表”。Shadow SSDT管的是图形、用户相关的函数gdi32.dll、user32.dll。
SSDT SHANDOW的结构跟SSDT的结构类似见Windows内核新手上路1——挂钩SSDT。
挂钩shadow SSDT的方法类似于挂钩SSDT有一点不同的是在挂钩前必须将进程上下文切换到CSRSS进程。 1.1 窗口保护
恶意程序通过获取安全软件的窗口句柄然后通过关闭、隐藏、禁用等手段破坏其正常工作需要挂钩这些函数来防止恶意程序的破坏。R3和R0函数对应关系如表1所示。
表1 R3-R0函数对于关系 R3 R0 作用 FindWindow NtUserFindWindowEx 查找窗口获取句柄 GetForegroundWindow NtUserGetForegroundWindow 得到当前顶层窗口 EnumWindows NtUserBuildHwndList 枚举所有顶层窗口 GetWindowThreadProcessId NtUserQueryWindow 获取句柄对应的进程PID WindowFromPoint NtUserWindowFromPoint 获取所在位置的窗口句柄 SetParent NtUserSetParent 改变某个子窗口的父窗 PostMessage NtUserPostMessage 发送消息 SendMessage NtUserMessageCall 发送消息 SetWindowLong NtUserSetWindowLong 改变窗口属性 ShowWindow NtUserShowWindow 改变窗口显示状态 DestroyWindow NtUserDestroyWindow 销毁窗口 EnableWindow NtUserCallHwndParamLock 禁用、启用窗口 1.2 安全输入
挂钩NtUserSendInput、NtUserGetAsyncKeyState、NtUserOpenDesktop、NtUserTranslateMessage分别用于防止模拟按键、获取键盘按键状态、打开安全桌面、将虚假按键还原成真实的按键。 a) NtUserSendInput
恶意程序可以通过调用SendInput来模拟按键干扰正常输入可以挂钩NtUserSendInput防止恶意操作。当用户正在输入密码等隐私信息的时候禁止其他程序调用SendInput模拟键盘和鼠标操作。
b) NtUserGetAsyncKeyState
恶意程序可能不停的调用NtUserGetAsyncKeyState来获取键盘的按键状态从而记录键盘的输入信息可以挂钩NtUserGetAsyncKeyState用来禁止此类键盘记录行为。当用户正在输入密码等隐私信息的时候禁止其他程序调用NtUserGetAsyncKeyState但是不会阻止当前受保护的进程调用否则会影响正常的密码输入行为。
c) NtUserOpenDesktop
在Windows操作系统中消息钩子通过SetWindowsHookEx设置只会当前的桌面上的窗口有效所以可以建立一个安全桌面用于运行需要严密保护的进程这样非本桌面上运行的程序无法通过消息钩子的方式来获取需要保护进程窗口的信息达到了保护目标进程窗口的目的360保险箱和金山密保都有一个叫安全桌面的功能正是这样实现的。
首先调用真实的NtUserOpenDesktop函数然后获取返回句柄的桌面名字如果此桌面名字跟创建的安全桌面名字一样则关闭此桌面句柄并返回一个NULL值否则返回真实的句柄。达到保护安全桌面的目的真正做到安全桌面不可渗透。
d) NtUserTranslateMessage
在输入密码的时候用户程序一般调用TranslateMessage将消息转化为具体的按键信息利用此特点可以构建一个DirectInput安全输入通道即尽可能少的通过Windows系统的键盘按键传输通道此通道是极度危险的恶意程序可以在任意位置添加HOOK截获按键信息。
对NtUserTranslateMessage的挂钩用于修正虚拟键盘输入的虚拟按键首先需要判断是否正在输入密码虚拟键盘是否正在运行是否需要修正按键这三个参数都是运行于R3的控制程序传递进来给R0驱动的。然后判断消息是否是键盘按键的消息如果是则进一步判断此消息是否对应虚假按键如果是则修正为真实的按键。虚假的按键和真实的按键也是R3传递给R0驱动的。整个输入通道完全自己构建不通过Windows系统提供的任何通道所有的类型的HOOK都无法在此期间截获虚拟键盘输入的密码很多安全软件提供的虚拟键盘的思路大致如此吧没有去仔细调研。
1.3 截屏保护
很多截屏类的键盘记录程序。当用户在虚拟键盘上按下一个键时恶意程序就截一次屏幕这样可以清楚地看到用户输入的密码信息。挂钩两个函数NtGdiBitBlt、NtGdiStretchBlt可以用于防截屏。
卡巴斯基反病毒软件率先推出截屏保护即当虚拟键盘运行的时候阻止程序进行截屏操作在一定程度上可以阻止此类键盘记录工具的工作。但是卡巴斯基有一个很大的缺陷它只能阻止全屏的截图不能阻止部分屏幕的截图。 PS:上面都是一些思路没有涉及代码还需要一步步去实践验证。