JeremyWildsmith/daedalus-virtualizer
GitHub: JeremyWildsmith/daedalus-virtualizer
基于 Verilator 硬件仿真的代码虚拟化混淆平台,通过为每个项目合成独立的私有指令集架构和安全飞地来保护软件免受逆向工程和知识产权盗窃。
Stars: 0 | Forks: 0
# Daedalus
Daedalus 是一个安全的应用程序开发平台,旨在帮助保护软件免受逆向工程和知识产权盗窃的侵害。它通过将受保护的代码转换为无法轻易解构的生成式秘密架构来实现这一点,同时仍允许其在常规计算机系统上执行。此过程通常被称为基于代码虚拟化的混淆。
Daedalus 背后的核心理念是将虚拟化代码混淆的概念从软件解释器向外推演,在受限于软件系统的前提下,使其尽可能接近硬件解释器核心。Daedalus 通过利用 Verilator 硬件描述语言仿真工具实现了这一目标。
## 工作原理
Daedalus 为每个项目合成一个**安全工具链**。该工具链包括:
- 一个编译器,用于将受保护的 C 代码转换为生成的私有 ISA / 架构
- 一个用于执行该架构的运行时解释器
- 一个通过使用 Verilator 仿真 RTL 硬件实现的安全飞地平台
- 一个允许受保护代码与未受保护代码之间进行通信的消息传递层
其结果是没有任何两个受保护的项目是相同的。不同的合成种子和功能选择可以生成独特的执行平台、操作码布局、加密密钥和行为差异。
## Daedalus 用户模型
Daedalus 应用程序通常分为三个部分:
1. 未受保护的应用程序代码
常规宿主端代码,例如 UI、网络、文件处理或用户交互。
2. 受保护的应用程序代码
编译到 Daedalus 安全飞地中的安全敏感逻辑。
3. Daedalus 仿真服务器
在宿主应用程序和安全飞地之间桥接通信。
这使得开发人员可以保留对性能敏感或普通的原生代码,而仅将关键算法隔离在受保护的环境中。
示例用例:
- 产品密钥验证
- DRM 或许可证强制执行
- 防篡改例程
- 专有算法或敏感决策逻辑
## 安全特性
根据原型和配置的不同,Daedalus 可以合成具有以下特性的工具链:
- 随机化指令编码
- 指令加密
- 内存加密
- 内存布局混淆
- 操作数重映射 / 语义变化
- 虚拟化核心的并发执行(即安全飞地核心的 RTL 仿真被划分并在多个系统核心上并发执行。)
- 多层虚拟化(Labyrinth 原型)
这些特性旨在显著增加静态分析、动态检测、内存转储和逆向工程所需的工作量。
## 包含的原型
### Foundry
一种基于 RISC-V 修改的安全飞地,使用 Verilog 实现并通过 Verilator 编译。Foundry 支持加密、内存混淆、操作码重映射以及其他合成时的变化。
### Labyrinth
在 Foundry 之上构建,Labyrinth 使用受保护的 eBPF 风格虚拟机添加了额外的软件虚拟化层。这创建了多层代码虚拟化。
## 快速开始(Docker)
```
git clone https://github.com/JeremyWildsmith/daedalus-virtualizer.git
cd daedalus-virtualizer
docker build . --tag daedalus
docker run --rm -it daedalus
```
进入容器后:
```
dacpu-init
dacpu-test
```
## 创建项目
使用项目向导:
```
dacpu-init
```
此交互式设置允许您选择:
- 原型
- 生成种子
- 安全特性
- 变体
- 并发内核支持
生成之后:
```
cd my-project
dacpu-test
make
```
## 示例概念
考虑这样一个场景:软件供应商希望保护其许可证验证逻辑。算法不是直接以原生代码交付验证例程,而是被放置在 Daedalus 安全飞地内部。用户界面和常规的应用程序逻辑保持原生,而仅验证逻辑在受保护的环境中执行。
您可以按照以下指南体验此用例:
1. 使用命令 `dacpu-init` 创建一个带有安全工具链的新 Daedalus 项目
2. 导航至为模板创建的 `main.c` 模板文件。将其替换为一个简单的验证命令行界面。请注意密钥验证逻辑是如何延迟到 Daedalus 安全飞地处理的:
```
#include
#include
#include
#include
#include
#include
void read_line(struct daedalus_ctx* ctx, char* buffer, int buffer_len) {
int i;
for(i = 0; i < buffer_len - 1;) {
uint8_t c;
int n = read_enclave(ctx, &c, 1);
if(n > 0) {
if(c == '\n') break;
else buffer[i++] = c;
}
}
buffer[i] = 0;
}
int main() {
char name[256];
char key[256];
char buffer[256];
struct daedalus_ctx* ctx = create_enclave_session();
printf("Welcome to the Key Verification System... System is starting up...\n");
sleep(3);
printf("Enter your name: ");
fgets(name, sizeof(name) - 1, stdin);
write_enclave(ctx, (uint8_t*)&name, strlen(name));
printf("Enter your product key: ");
fgets(key, sizeof(key) - 1, stdin);
write_enclave(ctx, (uint8_t*)&key, strlen(key));
printf("Please wait while validate your key...\n");
read_line(ctx, buffer, sizeof(buffer));
printf("\n");
if(strcmp(buffer, "VALID") == 0) {
name[strlen(name) - 1] = 0;
key[strlen(key) - 1] = 0;
printf("You have captured the flag! FLAG={'%s', %s}", name, key);
} else {
printf("Sorry, that isn't the right product key. Try again :)\n");
}
return 0;
}
```
3. 导航至安全飞地部分,并实现密钥验证逻辑:
```
#include "firmware.h"
void read_str(unsigned char* buf, int max_read, unsigned char stopchar)
{
int i;
for(i = 0; i < max_read - 1; i++) {
while(!firmware_read(&buf[i]))
continue;
if(!buf[i] || buf[i] == stopchar)
break;
}
buf[i] = 0;
}
void print_str(const char *p)
{
while (*p != 0)
firmware_write(*(p++));
}
unsigned long build_key(char* key) {
unsigned long hash = 5381;
int c;
while ((c = *key++)) {
hash = ((hash << 5) + hash) + c;
}
return hash;
}
//We source this from: https://en.wikipedia.org/wiki/Linear_congruential_generator
unsigned int lcg_step(unsigned int current) {
return current * 1664525u + 1013904223u;
}
//For "Jeremy Wildsmith" the key should be: 8p63qr85-mdo7m7s7-g705q34b-q54vs76h
int compare_key(char* key, unsigned long key_hash) {
int ki = 0;
if(!key[ki])
return 0;
for(int w = 0;; w++) {
for(int i = 0; i < 8; i++) {
if(!key[ki])
return 0;
int lower = key_hash % 3 ? 48 : 97;
int upper_r = key_hash % 3 ? 57 : 122;
char d = lower + (key_hash % (upper_r - lower + 1));
if(key[ki++] != d)
return 0;
key_hash = lcg_step(key_hash);
}
if(w < 3) {
if(key[ki++] != '-')
return 0;
} else {
break;
}
}
if(key[ki])
return 0;
return 1;
}
void main() {
char name[256];
char key[256];
for(;;) {
read_str(name, sizeof(name), '\n');
read_str(key, sizeof(key), '\n');
unsigned long hash = build_key(name);
//To prevent bruteforcing, lets add a busy loop.
for(int i = 0; i < 1000; i++) {
name[i % 10] = name[(i + 1) % 10] * name[(i + 2) % 10];
}
if(compare_key(key, hash))
print_str("VALID\n");
else
print_str("NOT_VALID\n");
}
}
```
4. 使用 make 命令生成安全的二进制文件。调用 ./bin/secure-app 中的二进制文件,看看您是否能在不查看源代码的情况下捕获标志(flag):)
## 项目目标
Daedalus 探索了以下领域的交叉点:
- 编译器合成
- 硬件仿真
- 代码虚拟化
- 混淆研究
- 安全执行环境
- 抗逆向工程
它既是一个实用的开发平台,也是一个探索保护分布式软件新方法的研究项目。
## 系统要求
典型的 Linux 构建环境:
- Python 3.11+
- Verilator 5+
- GCC / build-essential
- make
- clang
- Docker(可选)
有关完整的安装步骤,请参阅项目文档。
## 代码仓库
https://github.com/JeremyWildsmith/daedalus-virtualizer
## 作者
Jeremy Wildsmith
BCIT COMP 8047 主要项目
标签:C语言编译器, DRM, meg, RTL仿真, Verilator, 代码安全, 代码混淆, 代码虚拟化, 信息安全, 反逆向工程, 安全工具链, 安全飞地, 密码学, 恶意软件分析对抗, 手动系统调用, 漏洞枚举, 知识产权保护, 硬件仿真, 自定义指令集(ISA), 虚拟机保护, 许可证验证, 请求拦截, 软件保护, 软件加固, 逆向工具, 防篡改