利用NTFS备用数据流(ADS)隐藏键盘记录器数据的技术分析

本文详细分析了一种使用NTFS备用数据流(ADS)技术隐藏键盘记录器数据的Python恶意软件,包含代码实现、文件隐藏技巧及检测方法,并提供了PowerShell检测脚本示例。

键盘记录器数据存储在ADS中 - SANS互联网风暴中心

发布:2025-07-15 | 最后更新:2025-07-15 07:32:44 UTC 作者:Xavier Mertens

我发现了一个简单的Python键盘记录器,它使用ADS来存储捕获的击键:

1
2
3
4
hidden_dir = os.path.join(os.environ['APPDATA'], 'Microsoft\\Windows\\Cache')
os.makedirs(hidden_dir, exist_ok=True)
log_host_file = os.path.join(hidden_dir, "syscache.dat")
log_file = log_host_file + ":logdata"

还实现了第二层保护,使用SetFileAttributesW()[3]和标志0x02来隐藏文件:

1
2
3
4
5
try:
    FILE_ATTRIBUTE_HIDDEN = 0x02
    ctypes.windll.kernel32.SetFileAttributesW(log_host_file, FILE_ATTRIBUTE_HIDDEN)
except Exception as e:
    print(f"Failed to hide host file: {e}")

该脚本是一个经典的键盘记录器,但还实现了剪贴板监视器来捕获所有文本内容:

1
2
3
4
5
try:
    win32clipboard.OpenClipboard()
    if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_TEXT):
        data = win32clipboard.GetClipboardData()
        win32clipboard.CloseClipboard()

该脚本(SHA256:9927159c39a0201e2fcd558c4716fc5cab7e1c6ab69a311f7a21cab3c5667980)的VT评分较低(仅3/64),即使没有进行混淆处理。该脚本没有外泄机制,因此我推测会有另一个组件来处理这个任务!

如何检测文件系统上的文件是否具有ADS?这可以通过几行PowerShell代码实现:

1
2
3
4
5
6
Get-ChildItem -Recurse -Path C:\ | ForEach-Object {
    $streams = Get-Item $_.FullName -Stream * -ErrorAction SilentlyContinue
    if ($streams.Count -gt 1) { 
        $streams 
    }
}

示例输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\REM\Desktop\PURCHASE_ORDER.exe::$DATA
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\REM\Desktop
PSChildName   : PURCHASE_ORDER.exe::$DATA
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\REM\Desktop\PURCHASE_ORDER.exe
Stream        : :$DATA
Length        : 1044992

PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Users\REM\Desktop\PURCHASE_ORDER.exe:Zone.Identifier
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Users\REM\Desktop
PSChildName   : PURCHASE_ORDER.exe:Zone.Identifier
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : C:\Users\REM\Desktop\PURCHASE_ORDER.exe
Stream        : Zone.Identifier
Length        : 608

参考链接: [1] https://infosecwriteups.com/ntfs-filesystem-alternate-data-stream-ads-c0e4a2402563
[2] https://en.wikipedia.org/wiki/Mark_of_the_Web
[3] https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfileattributesw

关键词: ADS 备用数据流 剪贴板 键盘记录器 恶意软件 Python

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计