我读到了有关内存飞地的内容,我发现隐藏一些数据是一个有趣的功能,所以,我在这里。
我无法在所需的API上找到任何内容,但是MSDN文档有[没有关于使用的源代码],我知道我必须调用以下内容:
IsEnclaveTypeSupported
:确保我可以继续。
CreateEnclave
:返回所创建飞地的基址,虽然我也为这个问题而苦苦挣扎,但这个问题帮助了我。
LoadEnclaveData
:将数据添加到我们创建的飞地。
InitializeEnclave
:激活飞地。
基于Windows内部书籍(第1部分),到
execute
我必须运行EENTER
汇编指令,我也没有找到相关信息,但我认为CallEnclave
带有飞地的基地址可以完成这项工作。
无论如何,我被困在第3步,我的
LoadEnclaveData
返回错误代码87
,即ERROR_INVALID_PARAMETER
。
我只是将
NOP
s (0x90) 复制到该地址,只是为了通过正在运行的调试器查看它。
这是代码:
LPVOID lpAddress ;
ENCLAVE_CREATE_INFO_VBS VBS = { 0 };
VBS.Flags = 0;
HANDLE hProcess = GetCurrentProcess();
lpAddress = CreateEnclave(
hProcess,
NULL,
2097152,
NULL,
ENCLAVE_TYPE_VBS,
&VBS,
sizeof(ENCLAVE_CREATE_INFO_VBS),
NULL
);
printf("[-] GetLastError : %d \n", GetLastError());
printf("[+] %-20s : 0x%-016p\n", "lpAddress addr", (void*) lpAddress);
unsigned char buffer[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 , 0x90 , 0x90 };
LoadEnclaveData(
hProcess,
lpAddress,
&buffer,
sizeof(buffer),
PAGE_READWRITE,
NULL,
0,
0,
0
);
printf("[-] GetLastError : %d \n", GetLastError());
LoadEnclaveData
文档,他们没有指定如何处理lpPageInformation
,所以我认为这是问题所在,但他们说The lpPageInformation parameter is not used.
所以我重新检查了几个参数,然后我发现了nSize
必须是整数 multiple of the page size.
所以我很困惑,现在该怎么办?
如果有人确定要在飞地中执行缓冲区,请告诉我。
顺便说一句,选择标题的事情简直要了我的命,[我在这上面浪费的时间比写这篇文章还要多]。
LoadEnclaveData 仅支持具有 ENCLAVE_TYPE_SGX 和 ENCLAVE_TYPE_SGX2 enclave 类型的 enclave。
https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-loadenclavedata#remarks