电脑键盘记录器哪个好(keylogger键盘记录器使用方法)
时间:2023-02-07 22:40:05来源:译者:myswsun
预计稿费:100元人民币
提交方式:发送邮件至林微#360.cn,或登录网页在线提交。
0x00前言
回顾第一部分,我们总结了Windows用户模式下键盘记录的四种方法。今天我们就来分析一下每种技术的检测方法。
测试机器:
0x01 SetWindowsHookEx
当我们使用SetWindowsHookEx注册消息钩子时,系统将钩子处理程序保存在钩子链中(这是一个指针列表)。因为我们可以注册任何消息类型的钩子,所以每种消息类型都有一个钩子链。因此,我们的目标是:
钩子链在系统内存中的位置(WH _键盘和WH _键盘_LL)
如何找到钩子的进程名
关于钩链的位置,您可以参考以下内容:
1nt!_ETHREAD + 0x0 => nt!_KTHREAD + 0x088 => nt!_TEB + 0x40 => win32k!tagTHREADINFO + 0xCC => win32k!tagDESKTOPINFO + 0x10 => win32k!tagHOOK
每个结构都很清晰(感谢Windows符号)。Offset的值是我测试机的值,不同的Windows版本和build版本会有所不同(ntoskrnl和win32k.sys)。
来自nt!_ETHREAD看,肯定是GUI线程。我们可以从explorer.exe获得GUI线程或者创建自己的线程。
在上面,我们可以得到系统的所有全局钩链的位置。这个数组指针有16个tagHOOK,数组索引是WH_*消息类型的值(实际上索引=WH_*+1)。如果条目是空,我们可以找到一个全局钩子链。
从tagHook中的_THRDESKHEAD,我们可以得到设置钩子的进程的tagTHREADINFO。因此,我们可以获得进程ID和进程名称:
1processIdOfHooker = PsGetProcessId(IoThreadToProcess((PETHREAD)(*pCurHook->head.pti)));
扫描结果:
好了,找到Windows全局消息钩子就够了。当地的钩子呢?
以下是当地的一些情况:
1nt!_ETHREAD + 0x0 => nt!_KTHREAD + 0x088 => nt!_TEB + 0x40 => win32k!tagTHREADINFO + 0x198 => win32k!tagHOOK
类似于全局钩子,但是可以看到局部钩子链的位置在进程的tagTHREADINFO结构中,这是与进程相关的。DesktopInfo中的钩子链属于同一个桌面下的所有进程。
0x02轮询
我真的不知道怎么这样扫描。为什么?因为它直接从内部结构读取键的状态,所以似乎没有办法检测出来。
Getasynckeystate(),getkeyboardstate () API钩子?是的,我们可以通过API来检测,但是我不想用,因为对系统中的所有进程使用全局APIhook不是一个好方法。使用API钩子,我们可以检查键盘记录器的频率和范围。
0x03原始输入
我首先分析user32.dll的RegisterRawInputDevices函数。这个API将调用win32k.sys中的
ntuserregisterrawinputdevices
经过一些检查后,输入_RegisterRawInputDevices。
这里非常清楚。PsGetCurrentProcessWin32Process返回win32k!tagPROCESSINFO结构体。使用WinDbg查看偏移0x1A4:这里很清楚。psgetcurrentprocesswin 32 process返回win32k!TagPROCESSINFO结构。使用WinDbg查看偏移量0x1A4:
有指向win32k的指针!tagPROCESS_HID_TABLE .
第20-34行,验证注册的数据(HID请求)。
第36-47行,如果没有分配HID表。意思是,如果标记process info->: PHidTable是空,并且没有设备在进程中注册。
第48-71行,将HID请求设置到HID表中。
剩下的就是更新标志,重启HID设备。
让我们来看看SetProcDeviceRequest函数:
系统分配一个HID请求并将其插入HID表中。
HID请求有两个列表,即包含列表、使用页面列表和排除列表。插入哪个列表取决于调用RegisterRawInputDevices的tagRAWINPUTDEVICE的dwFlags值。
对于按键记录,我使用RIDEV_NOLEGACY | RIDEV_INPUTSINK标志,因此它是一个包含列表。最后一个结构是win32k!标记过程_隐藏_请求
可以看到,usuagepage、usuage和spwndtarget是tagRAWINPUTDEVICE的参数。
对于原始输入的检测:
1.枚举系统的所有进程。
2.遍历PID->每个流程;PEPROCESS->tagPROCESSINFO->tag process _ HID _ TABLE->标记过程_隐藏_请求
3.如果我们发现条目usUsagePage = 1(通常是桌面控制)和usUsage = 6(键盘),这个过程用于键盘记录。
扫描结果:
0x04直接输入
检测直接输入时,我在注册钩子的过程中发现了一些有趣的特征。
针对MSIAfterburner.exe,我发现了一些与direct input(Mutant, Section, Key)相关的句柄。从运行的线程中,我们也能发现DINPUT8.dll(微软DirectInput库)。对于MSIAfterburner.exe,我发现了一些与directinput (mutator,section,key)相关的句柄。从运行的线程中,我们还可以找到DINPUT8.dll(微软DirectInput库)。
直接输入测试:
1.枚举系统的所有进程
2.对于每一个过程,列举所有的变异,部分和关键,以配合处理的特点。
3.如果所有的特征都匹配,我们就可以得到进程中所有线程的起始地址。如果起始地址在DINPUT8.DLL的地址room 空中,则找到键盘记录。
扫描结果:
0x05摘要
扫描模式总结如下: