LoadEnclaveImage"连接到系统的设备无法运行"

时间:2018-06-17 22:58:39

标签: c++ enclave

我尝试将已签名的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");
}

1 个答案:

答案 0 :(得分:0)

加载签名的DLL时,我遇到了相同的一般错误,因此我在其他系统二进制文件中使用Static Import Finder查找了LoadEnclaveImageW的用法,并在SgrmBroker.exe中找到了该文件,并在其中加载了“ SgrmEnclave_secure”。 dll”。尝试将LoadEnclaveImageW与该DLL一起使用成功。

深入研究“ SgrmEnclave_secure.dll”文件的PE结构,我们可以看到在IMAGE_LOAD_CONFIG_DIRECTORY64 structure中为EnclaveConfigurationPointer定义了一个值(请参阅PE-bear的screenshot )。

此指针指向IMAGE_ENCLAVE_CONFIG64 structure,此screenshot显示在Ghidra中进行解析时的外观。 ImportList成员是一系列IMAGE_ENCLAVE_IMPORT structures的RVA。

因此,似乎需要在PE中定义这些结构。可以使用链接器中的/ENCLAVE选项来完成此操作。不知道是否还有其他要求。如果您能进一步了解,我很想知道。