一 、环境要求

1.1 实验环境不低于一下要求

  • 64 位 Microsoft Windows 操作系统
  • Microsoft Visual Studio 2015
  • 英特尔软件防护扩展 SDK

注意:Visual Studio一定是专业版

1.2 BIOS中开启SGX配置

不同bios的设置可能会有区别,即使bios不支持sgx,也不会影响入门学习。我们可以通过SGX
SDK里面内置的模拟器来运行调试enclave程序。

手动 BIOS 配置

  1. 系统在启动过程中,键入要进入 BIOS 击键 (通常功能键)。

  2. 通过下面的菜单导航:

      英特尔高级菜单-> CPU 配置软件 Guard 扩展指令集 (SGX)->
    
  3. BIOS 都会显示下面的选项。(并非所有系统 Oem 都支持所有的三个选项。)

      已启用软件控制已禁用
    

这些选项定义,如下所示:

     已启用

如果设置此选项,英特尔软件防护扩展是已启用且可供使用的应用程序。

     注:如果设置已启用,英特尔高级菜单-> CPU Configuration-> PRMRR必须还配置。(一些 Oem 可能会自动分配 PRMRR 值时启用了英特尔 SGX。)如果 OEM 支持 PRMRR 所选内容,将值设为 32 MB,64 MB 或 128 MB。英特尔参考 BIOS 的默认选项为 128 MB。

软件控制
如果设置软件控制,您的应用程序必须支持在英特尔软件防护扩展功能检测过程(以前提供的链接) 中提及英特尔 SGX 使用 API.

     注:支持通过软件参加英特尔软件防护扩展,则可能需要重新启动系统。已禁用

如果设置被禁用,英特尔 SGX 已明确禁用,并通过软件应用程序无法启用它。您应更改此设置为启用。如果已禁用,则可以只构建/运行英特尔 SGX 启用模拟模式中的应用程序。此外,英特尔 SGX 平台软件 (PSW) 将无法安装。

4.后启用英特尔 SGX,输入键击保存并退出BIOS。

二 、软件安装

2.1 Intel ME下载及安装

https://downloadcenter.intel.com/download/28680/Intel-Management-Engine-Driver-for-Windows-7-
E:\devsoft\sgx\ME_SW_1909.12.0.1237\Corp\ME_SW_MSI\SetupME.exe

SGX有些相关的安全功能需要Intel Management Engine(ME)提供(单向计数器monotonic counter和实时时钟RTC)以及互联网连接,所以建议安装SGX SDK及PSW时保持互联网连接, 并且安装完全版的Intel ME软件包

2.2 安装Visual studio 2017

通过微软官方下载Visual Studio IDE,不是code。
https://visualstudio.microsoft.com/

这一步一定要在安装SGX SDK之前。否则,你启动VS2017时,无法看到SGX的插件。

2.3 安装SGX SDK

2.3.1 下载

https://registrationcenter.intel.com/en/products/postregistration/?sn=CCXS-ZSSJ7GG5&EmailID=908947250%40qq.com&Sequence=2444010&ret=n
下载PSW(平台环境)和SDK(必须的),下载后的exe文件解压后,有说明文档和安装的exe

2.3.2 新建项目可以看到 Intel SGX Enclave Project时,说明你的环境是ok的。

Hello World

原生C++的helloworld (高手可以跳过)

// main_app.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include"pch.h"
#include <stdio.h>
#include <string.h>#define MAX_BUF_LEN 100void foo(char *buf, size_t len)
{const char *secret = "Hello App!";if (len > strlen(secret)){ memcpy(buf, secret, strlen(secret) + 1);}
}int main()
{char buffer[MAX_BUF_LEN] = "Hello World!";foo(buffer, MAX_BUF_LEN);printf("buffer:\"%s\"\n", buffer);return 0;}

ctrl+f5 运行。
定义了一个buffer和长度。将Hello World传入后打印。

Windows版Hello World的所有代码都是运行在Windows内存空间的。因此运行在这个Windows运行环境下的其他程序可以很容易的通过一些漏洞攻击Hello World的内存空间,例如通过修改foo()函数代码段的数据,把buffer[]数组内的“Hello App”替换成其他的字符串。

Enclave版本Hello World

修改edl文件,在ECALLs添加 foo函数调用
enclave {from "sgx_tstdc.edl" import *;trusted {/* define ECALLs here. */public void foo([out,size=len] char* buf,size_t len);};untrusted {/* define OCALLs here. */};
};
打开原生版本的helloworld项目,文件-》添加-》现有项目

目的:把enclave项目add到原生项目

把enclave项目添加到原生C++的项目中去。资源里表里可以看到存在两个项目

在原生(main_app)右键 import Enclave


选中之前修改的edl文件,OK

文件结构

停顿一下,先看看现在的文件目录。(实验命名不是很规范,看起来有点累)
main_app.cpp是原生的helloworld。
Enclave1.cpp是Enclave项目创建的文件。

编辑 Enclave1.cpp
#include "Enclave1_t.h"#include "sgx_trts.h"
#include <string.h>void foo(char *buf, size_t len)
{const char *secret = "Hello App!";if (len > strlen(secret)){memcpy(buf, secret, strlen(secret) + 1);}
}
编辑main_app.cpp
#include "pch.h"
#include <stdio.h>
#include <tchar.h>
#include "sgx_urts.h"
#include <string.h>
#include "Enclave1_u.h"#define ENCLAVE_FILE _T("Enclave1.signed.dll")
#define MAX_BUF_LEN 100int main()
{   sgx_enclave_id_t    eid;sgx_status_t        ret = SGX_SUCCESS;sgx_launch_token_t   token = { 0 };int updated = 0;char buffer[MAX_BUF_LEN] = "Hello World!";//创建包含token的enclave容器ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL);if (ret != SGX_SUCCESS){printf("APP:error %#x ,failed to create enclave .\n", ret);return -1;}//Enclave CALL(ECALL) 启动enclave容器foo(eid,buffer,MAX_BUF_LEN);printf("%s\n",buffer);getchar();//销毁enclave容器if (SGX_SUCCESS != sgx_destroy_enclave(eid))return -1;system("pause");getchar();return 0;}

编译结果
1>------ 已启动全部重新生成: 项目: main_app, 配置: Debug Win32 ------
2>------ 已启动全部重新生成: 项目: Enclave1, 配置: Debug Win32 ------
2>Creating proxy/bridge routines
1>Creating untrusted proxy/bridge routines
1>pch.cpp
2>Enclave1.cpp
1>Enclave1_u.c
2>Enclave1_t.c
2>  正在创建库 E:\sgx\main_app\Debug\Enclave1.lib 和对象 E:\sgx\main_app\Debug\Enclave1.exp
2>Enclave1.vcxproj -> E:\sgx\main_app\Debug\Enclave1.dll
2>sign the enclave
2>The required memory is 0x15f000.
2>Succeed.
2><EnclaveConfiguration>
2>    <ProdID>0</ProdID>
2>    <ISVSVN>0</ISVSVN>
2>    <StackMaxSize>0x40000</StackMaxSize>
2>    <HeapMaxSize>0x100000</HeapMaxSize>
2>    <TCSNum>1</TCSNum>
2>    <TCSPolicy>1</TCSPolicy>
2>    <DisableDebug>0</DisableDebug>
2>    <MiscSelect>0</MiscSelect>
2>    <MiscMask>0xFFFFFFFF</MiscMask>
2></EnclaveConfiguration>
1>main_app.cpp
1>main_app.vcxproj -> E:\sgx\main_app\Debug\main_app.exe
========== 全部重新生成: 成功 2 个,失败 0 个,跳过 0 个 ==========
运行结果

结语

运行的过程并不顺利,我本身不懂C++,也没用过VS2017。报了很多lib找不到或者无法打开的错误。经过大量尝试一后才跑通了helloworld。遇到问题慢慢分析,可以参考其他文章。关于如何打卡intel sgx的支持,还有检查手段。

需要源码的可以先留言

Intel SGX入门教程(二)在windows环境搭建intel sgx环境并运行helloworld程序相关推荐

  1. [ Laravel 5.5 文档 ] 快速入门 —— 使用 Laragon 在 Windows 中搭建 Laravel 开发环境

    简介 之前学院君陆续写了三篇介绍 Laravel 开发环境的教程:Homestead.Valet 和 LaraDock,我都是在 Mac 系统中安装使用的,相当流畅,没有任何梗,但是对于那些使用 Wi ...

  2. 乐鑫Esp32学习之旅② 巧用eclipes编辑器,官方教程在Windows下搭建esp32开发环境,打印 “Hello World”。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  3. Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发

    前言 本教程适用于以下两种用户: ①无Linux环境搭建经验或搭建Linux开发环境不成功: ②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功: 本教程提供了windows下搭建 ...

  4. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  5. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  6. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  7. R语言七天入门教程二:认识变量与运算符

    R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...

  8. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  9. LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。

    LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...

  10. c语言类似于 n的标识符,C语言快速入门教程(二)

    C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要: 单词 + 语法! 将单词按照一定的语法拼凑起来就成 ...

最新文章

  1. Xcode中如何解决无法使用svn命令行的问题
  2. C与CUDA混合编程的配置问题
  3. spark学习-42-Spark的driver理解和executor理解
  4. pythontime库简单使用_Python time库基本使用方法分析
  5. JVM 垃圾回收算法机制及其实现原理
  6. linux--vi的使用
  7. 国际顶级学界和工业界大咖云集、AIoT 实训营,你不可错过的嵌入式 AI 盛会!...
  8. 橡胶支座抗压弹性模量计算公式_单向滑动抗震弹性支座作用介绍
  9. 4.7UF400V 10*8.4贴片铝电解电容封装尺寸
  10. 我如何用Unity3D实现一个Galgame框架(存档读档与设置面板的思路)
  11. Deepin搭建Qt5开发环境
  12. 离线强化学习(Offline RL)系列3: (算法篇) IQL(Implicit Q-learning)算法详解与实现
  13. 有关Amazon站内信邮件类别处理
  14. 又一个 Golang 编写的僵尸网络:KmsdBot
  15. 计算机公式与函数的定义及两者的关系,excel(公式与函数).ppt
  16. mysql能放在电脑哪个盘_电脑文件一般放在哪个盘好呢?
  17. 如何查看自己电脑的基本配置?
  18. 如何使用接口进行发票查验?
  19. 局域网计算机如何传输文件,同一个局域网内如何传输文件
  20. 优秀的开源项目一览(持续更新中...)

热门文章

  1. imap服务器收缓存pst文件夹,Outlook 转移OST数据文件 IMAP账户
  2. (三)OpenCV中的图像处理之轮廓
  3. html js设置颜色渐变效果,Javascript 颜色渐变效果的实现代码
  4. [COGS2652]秘术「天文密葬法」-长链剖分-01分数规划
  5. Linux中常见的指令(三):几个查看文件内容的指令,ctrl+c的理解
  6. Raspberry pi 通过iphone手机访问
  7. window10怎么卸载php,window10怎么卸载软件以及清空插件
  8. webp怎么转png?图片webp格式怎么转换?
  9. java葱_Java程序设计_网课答案
  10. 如何申请GlobalSign SSL证书,需要什么条件?