当前位置:首页 > 谚语 >

电脑键盘记录器哪个好(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摘要

扫描模式总结如下:

展开更多
标签: