2025年6月下旬,地下论坛开始出现一种名为TinkyWinkey的复杂Windows键盘记录器,该恶意软件以前所未有的隐蔽性针对企业和个人终端发起攻击。
与依赖简单钩子或用户模式进程的传统键盘记录工具不同,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环境。
参考来源:
New TinkyWinkey Stealthily Attacking Windows Systems With Advanced Keylogging Capabilities
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)