1

我正在尝试将签名的 DLL 加载到 VBS 飞地并LoadEnclaveImage返回A device attached to the system is not functioning.

Hyper-V、安全启动和 TPM 2.0 都可以正常工作,所以我不太确定错误指的是什么。

示例代码:

if (IsEnclaveTypeSupported(ENCLAVE_TYPE_VBS))
{
    DWORD lpError = 0;
    ENCLAVE_CREATE_INFO_VBS vci = { 0 };
    vci.Flags = 1;

    PVOID enclave = CreateEnclave(GetCurrentProcess(),
        NULL,
        1024 * 1024 * 2,
        NULL,
        ENCLAVE_TYPE_VBS,
        &vci,
        sizeof(ENCLAVE_CREATE_INFO_VBS),
        &lpError);

    if (enclave != NULL)
    {
        auto lib = LoadLibrary(L"kernelbase.dll");
        auto addr = (__LoadEnclaveImage)GetProcAddress(lib, "LoadEnclaveImageW");

        if (addr(enclave, L"...\testme.dll"))
        {
            printf("Worked!\n");
        }
        else {
            printf("Failed to load image\n");
            printf(GetLastErrorAsString().c_str());
        }

    }
    else
    {
        printf(GetLastErrorAsString().c_str());
    }
}
else {
    printf("VBS not supported\n");
}
4

1 回答 1

1

我在加载签名的 DLL 时遇到了同样的一般错误,所以我使用Static Import FinderLoadEnclaveImageW在其他系统二进制文件中查找用法,并在加载“SgrmEnclave_secure.dll”的 SgrmBroker.exe 中找到它。尝试使用该 DLL 是成功的。LoadEnclaveImageW

深入研究“SgrmEnclave_secure.dll”文件的 PE 结构,我们可以看到EnclaveConfigurationPointerIMAGE_LOAD_CONFIG_DIRECTORY64结构中定义了一个值(参见PE-bear 的屏幕截图)。

这个指针指向一个IMAGE_ENCLAVE_CONFIG64结构,这个屏幕截图显示了它在 Ghidra 中解析时的样子。该ImportList成员是一系列IMAGE_ENCLAVE_IMPORT结构的 RVA 。

所以看起来这些结构需要在 PE 中定义。这可以使用/ENCLAVE链接器中的选项来完成。不确定是否有额外的要求。如果您对此进一步了解,我很想知道。

于 2019-11-02T19:33:32.923 回答