我尝试将已签名的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");
}
答案 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
选项来完成此操作。不知道是否还有其他要求。如果您能进一步了解,我很想知道。