我读到了内存飞地,发现隐藏一些数据是一个有趣的功能,所以,我来了。
我无法在所需的 API 上找到任何内容,但 MSDN 文档有 [没有关于使用的源代码],我知道我必须调用以下命令:
IsEnclaveTypeSupported
: 以确保我可以继续。CreateEnclave
:返回创建的飞地的基地址,虽然我也为此苦苦挣扎,但这个问题帮助了我。LoadEnclaveData
:将数据添加到我们创建的飞地。InitializeEnclave
: 激活飞地。基于Windows Internal book(第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());
根据 MSDN 的LoadEnclaveData
文档,他们没有指定要做什么lpPageInformation
,所以我认为是问题所在,但他们说The lpPageInformation parameter is not used.
所以我重新检查了几个参数,我发现它nSize
必须是一个整数multiple of the page size.
所以我很困惑,现在要做什么?
如果有人确定要在飞地中执行缓冲区,请告诉我。
顺便说一句,选择标题的事情让我很生气,[我在这上面浪费了比写这篇文章更多的时间]。