如何在内存中运行LoadEnclaveData函数?

问题描述 投票:0回答:1

我读到了有关内存飞地的内容,我发现隐藏一些数据是一个有趣的功能,所以,我在这里。

我无法在所需的API上找到任何内容,但是MSDN文档有[没有关于使用的源代码],我知道我必须调用以下内容:

  1. IsEnclaveTypeSupported
    :确保我可以继续。

  2. CreateEnclave
    :返回所创建飞地的基址,虽然我也为这个问题而苦苦挣扎,但这个问题帮助了我。

  3. LoadEnclaveData
    :将数据添加到我们创建的飞地。

  4. InitializeEnclave
    :激活飞地。

  5. 基于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());

根据MSDN的

LoadEnclaveData
文档,他们没有指定如何处理
lpPageInformation
,所以我认为这是问题所在,但他们说
The lpPageInformation parameter is not used.
所以我重新检查了几个参数,然后我发现了
nSize
必须是整数
multiple of the page size.
所以我很困惑,现在该怎么办?

如果有人确定要在飞地中执行缓冲区,请告诉我。

顺便说一句,选择标题的事情简直要了我的命,[我在这上面浪费的时间比写这篇文章还要多]。

winapi memory-management enclave
1个回答
0
投票

LoadEnclaveData 仅支持具有 ENCLAVE_TYPE_SGX 和 ENCLAVE_TYPE_SGX2 enclave 类型的 enclave。

https://learn.microsoft.com/en-us/windows/win32/api/enclaveapi/nf-enclaveapi-loadenclavedata#remarks

© www.soinside.com 2019 - 2024. All rights reserved.