自定义Windows身份验证包DLL无法被LSA加载的排查求助
自定义Windows身份验证包LSA加载DLL失败排查
问题背景
我正在开发一个自定义Windows身份验证包,但LSA(本地安全机构)无法加载我的DLL,DLL从未被调用(无日志生成)。
已实现的代码与配置
导出的SpLsaModeInitialize方法
通过.def文件导出该方法,代码如下:
EXTERN_C __declspec(dllexport) NTSTATUS NTAPI SpLsaModeInitialize( ULONG LsaVersion, PULONG PackageVersion, PSECPKG_FUNCTION_TABLE * ppTables, PULONG pcTables ) { __LOG_TRACE_FUNC_BEGIN(); // 写入日志到C:\temp\log.txt *PackageVersion = SECPKG_INTERFACE_VERSION; *ppTables = sp_lsa_function_table; *pcTables = 1; __LOG_TRACE_FUNC_END(); // 写入日志到C:\temp\log.txt return 0; }
DllMain与DllInit实现
同时实现了以下两个函数:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { __LOG_TRACE_FUNC_BEGIN(); // 写入日志到C:\temp\log.txt switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } __LOG_TRACE_FUNC_END(); // 写入日志到C:\temp\log.txt return TRUE; } BOOLEAN DllInit(IN PVOID DllHandle, IN ULONG Reason, IN PCONTEXT Context OPTIONAL) { __LOG_TRACE_FUNC_BEGIN(); // 写入日志到C:\temp\log.txt switch (Reason) { case DLL_PROCESS_ATTACH: #if defined (DEBUG) DebugBreak(); #endif InitializeCriticalSection(&DllCritSect); break; case DLL_PROCESS_DETACH: EnterCriticalSection(&DllCritSect); LeaveCriticalSection(&DllCritSect); DeleteCriticalSection(&DllCritSect); break; } __LOG_TRACE_FUNC_END(); // 写入日志到C:\temp\log.txt return TRUE; UNREFERENCED_PARAMETER(Context); UNREFERENCED_PARAMETER(DllHandle); }
.def文件导出定义
EXPORTS DllMain DllInit SpLsaModeInitialize
清单文件(dap.dll.manifest)
项目中存在该清单文件(不确定是否需要,原本是项目中另一个凭据提供器部分所需):
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50608.0' processorArchitecture='x64' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> </assembly>
编译与签名步骤
DLL以Release/x64模式编译,执行了以下签名步骤(不确定是否强制要求):
makecert.exe -sv dap.pvk -n "CN=Dallas" dap.cer -r pvk2pfx.exe -pvk dap.pvk -spc dap.cer -pfx dap.pfx -po 123 signtool.exe sign /f "dap.pfx" /p 123 "dap.dll"
部署操作
将dap.dll移至目标Windows 10虚拟机的Windows\System32目录,添加了相应注册表项,也尝试将其加入Security Packages,随后重启虚拟机,但均未生效。
疑问
- 我的操作是否正确?是否遗漏了步骤?
- 签名步骤是否为强制要求?我的签名操作是否正确?
- 当LSA忽略我的DLL时,是否会生成事件日志?我已启用
%SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-LSA%4Operational.evtx日志但无有效信息,还有其他日志位置吗? - 还有哪些其他排查方法?
内容的提问来源于stack exchange,提问作者Sency
相关产品推荐
相关产品推荐

