You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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,随后重启虚拟机,但均未生效。

疑问

  1. 我的操作是否正确?是否遗漏了步骤?
  2. 签名步骤是否为强制要求?我的签名操作是否正确?
  3. 当LSA忽略我的DLL时,是否会生成事件日志?我已启用%SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-LSA%4Operational.evtx日志但无有效信息,还有其他日志位置吗?
  4. 还有哪些其他排查方法?

内容的提问来源于stack exchange,提问作者Sency

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:01:22