这个问题的相关文件在这里:
https://cubiclesoft.com/Unrelated/32_pe_msmpeng_test.zip
包含一个之前和之后的 DLL。这个简单的 PHP 脚本演示了这个问题:
<?php
$ts = microtime(true);
file_put_contents("test.dll", file_get_contents("32_pe_msmpeng_before.dll"));
echo "Time taken: " . sprintf("%.02f", microtime(true) - $ts) . " sec\n";
unlink("test.dll");
$ts = microtime(true);
file_put_contents("test.dll", file_get_contents("32_pe_msmpeng_after.dll"));
echo "Time taken: " . sprintf("%.02f", microtime(true) - $ts) . " sec\n";
unlink("test.dll");
?>
输出看起来像:
>php test.php
Time taken: 0.00 sec
Time taken: 4.14 sec
两个 DLL 之间的唯一区别是证书表已被删除并且 PE 校验和已在“之后”DLL 中更新。4 秒的延迟是由 MsMpEng.exe 在此期间使用 100% 的 CPU 核心造成的。MsMpEng.exe 是主要的 Windows Defender 实时扫描引擎。这些文件没有被标记为恶意软件,但这种行为很奇怪,因为简单地删除证书表会触发深度扫描。
原始文件是使用我的Windows PE File Tools for PHP和以下命令修改的:
php pe_tools.php modify clear-certs 32_pe_msmpeng_before.dll 32_pe_msmpeng_after.dll
php pe_tools.php modify apply-checksum 32_pe_msmpeng_after.dll 32_pe_msmpeng_after.dll
我已经以我能想到的所有可能的方式检查了“之后”文件,它似乎对我使用的所有工具都完全有效。我还修改了许多其他 PE 文件,而没有触发实时扫描程序。仅此文件会导致 CPU 使用率的时间延迟和峰值,并且仅在删除证书表后才会发生。我可以对文件进行各种其他疯狂的更改,这些更改应该会立即导致无效的证书表(例如,添加新的 PE 部分、嵌入图标等)并且它也不会绊倒实时扫描程序。但是完全删除证书表,然后在 MsMpEng.exe 中出现 4 秒延迟 + 100% CPU。这种行为似乎意味着仅拥有一个证书表可能会绕过部分甚至全部的 Windows Defender。
但这不是真正的问题。我想知道的是,导致 MsMpEng.exe 进行需要 4 秒以上才能完成的深度扫描的“之后”DLL 中究竟是什么?