【7月6日更新】惠普电脑内置键盘记录器?可窃取账号密码等敏感用户
作者:网友投稿 时间:2018-03-23 09:15
你在使用惠普电脑吗?如果答案是肯定的,那么请小心了,你的音频驱动程序可能会存储你的击键记录,甚至泄露你的重要信息。
7.6更新6月,某部委下属网络安全和信息化领导小组办公室已经发布公告通报了惠普电脑存在隐藏键盘记录器问题。据说国内不少公务员也在用着惠普的PC设备,信息隐患实在细思恐极。

而事实上,5月中旬,瑞士安全公司Modzero的安全研究员 Thorsten Schroeder 就已经发现,许多惠普笔记本电脑和平板电脑中的Conexant音频驱动程序变身Keylogger, 记录用户的击键内容。Keylogger可以监测用户的每一次击键信息。该软件不仅仅捕获了特定按键的按键记录,而且还记录了每个按键的点击信息,并将它们存储在一个可读的文件中( C:\Users\Public\MicTray.log)。恶意软件或木马可以利用这一点,绕过系统对可疑行为的安全检测,获取记录文件,窃取用户的账户信息、信用卡卡号、聊天记录、密码等个人信息。

Conexant是一家集成电路制造商,既生产音频芯片也开发相关驱动程序。Conexant High-Definition (HD) Audio Driver音频驱动程序可帮助软件与硬件进行通信。惠普公司根据不同的计算机型号,在Conexant音频驱动程序中写入一些控制特定按键(如媒体按键)的代码。研究人员发现,与Conexant音频驱动程序安装包一起安装的MicTray64.exe应用程序已在Windows系统中注册为计划任务,能够监控击键内容以确定用户是否按下了音频相关的按钮(例如静音/取消静音)。用户的击键记录保存在名为“Users/Public”的文件夹中,可以传送给OutputDebugString调试端口,这个端口允许通过MapViewOfFile函数访问该文件夹中的数据。
音频驱动程序变成间谍软件Schroeder在一篇博客中表示,该软件的目的是识别用户是否已经按下或松开特殊键。但是开发人员加入了诊断和调试功能,用于确保所有按键都可以通过调试界面广播出去,也可以写入硬盘上公共目录中的日志文件。这种调试将音频驱动程序转换成了内置的Keylogger。
研究显示,2015年12月发布的MicTray64.exe的早期版本并不会把击键记录存储到文件夹中。2016年10月,惠普将MicTray64.exe更新到1.0.0.46版本,增添了诊断功能,记录用户击键内容并存储到本地文件夹。目前,共有30种型号的惠普电脑装有1.0.0.46版本的MicTray64.exe。而根据文件的元信息,至少在2015年圣诞节时期,惠普电脑安装的该驱动程序就已经存在击键记录行为。
MicTray64.exe 1.0.0.46版本进行击键记录的具体过程如下:
int64 keylogger_enable(bool activate)
{
[...]
if ( !keylogger_active )
{
[...]
// 13=WH_KEYBOARD_LL: Installs a hook procedure that
// monitors low-level keyboard input events. For
// more information, see the LowLevelKeyboardProc
// hook procedure.
hKeyloggerHook = SetWindowsHookExW(
13, (HOOKPROC)handle_scancode,
hSelf,
0);
if ( hKeyloggerHook )
{
keylogger_active = 1;
return 0;
}
[...]
}
记录功能激活之后,用户每按一次键盘,就会触发以下伪代码执行:
LRESULT handle_scancode(
int _in_nCode,
WPARAM _in_wParam,
tagKBDLLHOOKSTRUCT *_in_lParam_keystroke)
{
tagKBDLLHOOKSTRUCT *key_stroke;
WPARAM wParam;
int nCode;
int64 target;
DWORD is_keyfoo;
int is_keydown;
char tmp;
int64 key_flags;
int64 key_vk;
key_stroke = _in_lParam_keystroke;
wParam = _in_wParam;
nCode = _in_nCode;
if ( _in_nCode >= 0 )
{
target = (cfg_HotKeyMicScancode >> 8 *
(cfg_HotKeyMicScancode_len - cfg_HotKeyMicScancode_len2));
LODWORD(key_vk) = _in_lParam_keystroke->vkCode;
LODWORD(key_flags) = _in_lParam_keystroke->flags;
is_keyfoo = _in_lParam_keystroke->flags & 1;
is_keydown = ~(key_flags >> 7) & 1;
[*] send_to_dbglog(
0x1D,
L"Mic target 0x%x scancode 0x%x flags 0x%x extra 0x%x vk 0x%x\n",
target,
_in_lParam_keystroke->scanCode,
key_flags,
_in_lParam_keystroke->dwExtraInfo,
key_vk);
conexant_handle_fn_keys(
cfg_MicMuteScancodeSettings,
is_keydown,
key_stroke->scanCode,
target,
&cfg_HotKeyMicScancode_len,
&cfg_HotKeyMicScancode_len2,
1);
if ( cfg_MicMuteScancodeSettings & 4 )
conexant_handle_fn_keys(
cfg_MicMuteScancodeSettings,
is_keydown,
key_stroke->scanCode,
(cfg_HotKeyMicScancode2 >> 8 *
(cfg_HotKeyMicScancode2_len - cfg_HotKeyMicScancode2_len2)),
&cfg_HotKeyMicScancode2_len,
&cfg_HotKeyMicScancode2_len2,
1);
tmp = cfg_SpkMuteScancodeSettings;
if ( cfg_SpkMuteScancodeSettings & 8 && is_keyfoo
|| !(cfg_SpkMuteScancodeSettings & 8) )
{
conexant_handle_fn_keys(
cfg_SpkMuteScancodeSettings,
is_keydown,
key_stroke->scanCode,
(cfg_HotKeySpkScancode >> 8 *
(cfg_HotKeySpkScancode_len - cfg_HotKeySpkScancode_len2)),
&dword_1402709C8,
&dword_1402709CC,
0);
tmp = cfg_SpkMuteScancodeSettings;
}
if ( tmp & 4 && (tmp & 8 && is_keyfoo || !(tmp & 8)) )
conexant_handle_fn_keys(
tmp,
is_keydown,
key_stroke->scanCode,
(cfg_HotKeySpkScancode2 >> 8 *
(cfg_HotKeySpkScancode2_len - cfg_HotKeySpkScancode2_len2)),
&cfg_HotKeySpkScancode2_len,
&cfg_HotKeySpkScancode2_len2,
0);
}
return CallNextHookEx(hhk, nCode, wParam, key_stroke);
}
其中,[*]那部分代码触发的功能可以将击键记录写入文件,或通过运行store_keystroke()代码,将击键记录经由Microsofts Debug Monitor 接口广播出去:
void store_keystroke(LPCVOID lpBuffer)
{
WORD *scancode_logline;
int64 str_len;
DWORD NumberOfBytesWritten;
int str_newline;
scancode_logline = lpBuffer;
if ( g_write_to_logfile )
{
SetFilePointer(g_hFile, 0, 0, 2);
str_len = -1;
while ( scancode_logline[str_len++ + 1] != 0 )
;
WriteFile(
g_hFile,
scancode_logline,
2 * str_len,
&NumberOfBytesWritten,
0);
str_newline = '\n\0\r';
WriteFile(g_hFile, &str_newline, 4, &NumberOfBytesWritten, 0);
}
else
{
OutputDebugStringW(lpBuffer);
}
}




