NativeBypassCredGuard 是一款通过仅使用 NTAPI 函数(由 ntdll.dll 导出)修补 WDigest.dll 来绕过 Credential Guard 的工具。它提供两种版本:C# 和 C++。
该工具在磁盘上的 WDigest.dll 文件中定位模式 "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00"(如参考资料部分的第一篇文章所述,该模式在所有 Windows 版本的这个文件中都存在),然后计算所需的内存地址,最后修补 WDigest.dll 中两个变量的值:g_fParameter_UseLogonCredential(设为 1)和 g_IsCredGuardEnabled(设为 0)。
这会强制在内存中以明文形式存储凭据,确保从此刻起,用户每次登录时凭据都会以明文存储。因此,下次转储 LSASS 进程时,其中可能包含明文密码。
所使用的 NTAPI 函数如下:

通过仅使用 NTAPI 函数,可以重新映射 ntdll.dll 库以绕过用户模式挂钩和安全机制,这是该工具的一项可选功能。如果使用该功能,将从以挂起模式创建的进程中获取一份干净的 ntdll.dll。
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
选项(必填):
重新映射 ntdll(可选):
读取值(不重新映射 ntdll):
NativeBypassCredGuard.exe check

修补值(重新映射 ntdll):
NativeBypassCredGuard.exe patch true

该工具面向 64 位系统设计,因此必须编译为 64 位二进制文件
如果无法打开 lsass 的句柄,或者无法读取 PEB 结构,该工具将无法正常工作。对于后一种情况,你可以选择使用 kernel32!LoadLibrary 在你的进程中加载 WDigest.dll 以获取其基地址,而不是使用 ntdll!NtReadVirtualMemory 和 ntdll!NtQueryInformationProcess 从 lsass 进程中获取(C 版本中有实现此功能的代码,但已被注释)。但这样做你会使用一个并非由 ntdll.dll 导出、而是由 kernel32.dll 导出的函数,而且一个进程加载该 DLL 可能会显得很奇怪 :)
0x3rhy 已基于此项目创建了一个 BOF 文件:BypassCredGuard-BOF
重新审视 Credential Guard 绕过 ,作者 itm4n —— 一篇非常出色的分析文章,我从中获取了用于搜索 DLL .text 节的模式
WDigest:从坟墓中挖出死者 ,作者 neuralhax —— 一篇令人惊叹的博客,证明了可以为 g_fParameter_UseLogonCredential 使用其他值。我还没有测试过,但你可以试试修改 useLogonCredential_Value 变量
探索 Mimikatz - 第 1 部分 - WDigest ,作者 xpn —— 一篇非常精彩的博客文章,对 WDigest 凭据缓存进行了逆向分析和讲解