grok是一个驱动模块,其主要功能就行进行键盘按键及剪切板数据的记录,也就是一个键盘记录器。实现原理是通过对shadow-ssdt的相关函数进行hook,和r3对GetUserMessage进行hook的原理差不多。
关键部分如下:
查找csrss.exe进程是否已经启动,如果没有启动,则创建线程等待其启动。如果已经启动,就进入下一步准备进行hook操作。
前面检查csrss.exe进程是因为后面解析shadow-ssdt数据需要gui进程环境,需要附加到csrss.exe进程,然后才方便解析shadow-ssdt。之后,根据自定义的序号获取函数地址,其内部实现如下:
系统版本相关的shadow-ssdt函数序号,根据系统版本赋值,解析过程就不展开。
保存hook后的逻辑处理函数地址,一个是消息截取,一个是剪切板截取。
实际执行hook操作的函数,大致是inlinehook的流程。确认需要hook函数的地址,然后保存函数体前几个被覆盖的字节码,填入劫持的跳转shllcode地址。
关闭内存写保护,然后进行内存修改,安装跳转函数
劫持NtUserPeekMessage函数的shellcode
按键类型的消息过滤
剪切板的数据获取通过NtCreateLocalMemHandle。
获取一些辅助信息,使得按键数据更立体完善
最后,这是个古早的样本了。shadow-ssdt hook 在较新的win10/win11上是无法进行的,因为pg对shadow-ssdt 数据进行了保护。