一种名为 TinkyWinkey 的基于 Windows 的复杂键盘记录器于 2025 年 6 月下旬开始出现在地下论坛上,以前所未有的隐蔽性瞄准企业和个人端点。
与依赖简单挂钩或用户模式进程的传统键盘记录工具不同,TinkyWinkey 利用双重组件(Windows 服务和注入的 DLL 有效负载)在收集丰富的上下文数据时保持隐藏。
该恶意软件的出现凸显了威胁行为者策略的令人不安的演变,将深度系统分析与低级键盘捕获相结合,为间谍活动和凭据盗窃提供了极具吸引力的目标。
TinkyWinkey 的攻击媒介通常从安装名为“Tinky”的恶意服务开始。该服务通过 SCM API 调用安装,配置为自动启动,即使在系统重新启动时也能确保持久性。
激活后,服务辅助线程通过在重复的用户令牌上调用 CreateProcessAsUser 在活动用户会话中生成主键盘记录模块 (winkey.exe)。
这种方法不仅可以避免可见的控制台窗口,还可以直接访问用户模式桌面上下文。Cyfirma 分析师指出,这种技术允许恶意软件在标准用户权限下无缝运行,同时在系统进程中保持隐蔽性。
加载后,键盘记录器组件会使用低级钩子 (WH_KEYBOARD_LL) 来拦截每次击键,包括媒体键、修饰符组合和 Unicode 字符。
该恶意软件维护一个连续的消息循环来调度捕获的事件,将每次击键与前台窗口标题和当前键盘布局相关联。
Cyfirma 研究人员发现,TinkyWinkey 通过 HKL 句柄动态检测布局更改,并在受害者在语言之间切换时记录事件。
这确保了攻击者能够准确地重建多语言输入,而这一功能经常被更简单的键盘记录器忽视。

typedef LONG (WINAPI *RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
void log_windows_version() {
HMODULE hMod = LoadLibraryW(L"ntdll.dll");
if (hMod) {
RtlGetVersionPtr fn = (RtlGetVersionPtr)GetProcAddress(hMod, "RtlGetVersion");
RTL_OSVERSIONINFOW rovi = { sizeof(rovi) };
if (fn(&rovi) == 0) {
char buffer[128];
snprintf(buffer, sizeof(buffer),
"Windows version: %ld.%ld (build %ld)\n",
rovi.dwMajorVersion, rovi.dwMinorVersion, rovi.dwBuildNumber);
write_to_file(buffer);
}
}
}
感染机制和持久策略
TinkyWinkey 的感染机制取决于其基于服务的持久性和隐蔽的 DLL 注入。建立“Tinky”服务后,加载程序使用自定义 FindTargetPID 例程解析受信任进程(最常见的是explorer.exe)的 PID。
获取带有PROCESS_ALL_ACCESS的句柄后,它会通过 VirtualAllocEx 在目标进程中分配内存,并将完整路径写入keylogger.dll。
指向 LoadLibraryW 的后续 CreateRemoteThread 调用强制受信任进程加载恶意 DLL。
这种远程注入方法不仅将键盘记录代码隐藏在合法进程中,而且还规避了许多监控独立可执行文件的端点保护解决方案。
最终的 WaitForSingleObject 调用可确保在句柄关闭之前干净地完成注入,从而保持系统稳定性并进一步掩盖取证分析中的泄露。
通过其组合服务执行和精确的 DLL 注入,TinkyWinkey 实现了商用恶意软件中罕见的隐身性和弹性水平,使传统的检测和删除策略不足以保护现代 Windows 环境。
1. 本版块文章内容及资料部分来源于网络,不代表本站观点,不对其真实性负责,也不构成任何建议。
2. 部分内容由网友自主投稿、编辑整理上传,本站仅提供交流平台,不为该类内容的版权负责。
3. 本版块提供的信息仅作参考,不保证信息的准确性、有效性、及时性和完整性。
4. 若您发现本版块有侵犯您知识产权的内容,请及时与我们联系,我们会尽快修改或删除。
5. 使用者违规、不可抗力(如黑客攻击)或第三方擅自转载引发的争议,联盟不承担责任。
6. 联盟可修订本声明,官网发布即生效,继续使用视为接受新条款。