### 做一个沙箱，有什么需要重定向的

**1. 文件系统**

这是最基本的重定向。一个恶意程序通常会读写文件、创建新文件或删除现有文件。你必须让它以为自己在操作真实的文件系统，但实际上，所有这些操作都被隔离在一个虚拟的、临时的环境中

- **重定向读写操作**：
  - **拦截** `open`, `read`, `write`, `close` 等系统调用
  - 将所有对宿主机文件的访问重定向到沙箱内部的**虚拟文件系统**或一个特定的临时文件夹
  - 如果程序试图访问关键系统文件（如 `C:\Windows\System32`），应拒绝其请求或返回一个虚拟的、无害的版本

**2. 注册表**

在 Windows 环境下，注册表是恶意软件进行持久化和存储配置的关键

- **重定向注册表操作**：
  - **拦截** `RegCreateKey`, `RegSetValue`, `RegOpenKey` 等注册表 API 调用
  - 将所有写入操作重定向到沙箱内存中的一个**虚拟注册表**
  - 当程序读取注册表时，先从虚拟注册表中查找，如果不存在，再从宿主机注册表读取，但绝不允许它修改宿主机注册表

**3. 网络通信**

恶意软件的另一大特征就是与外部服务器进行通信，例如下载其他恶意模块、发送窃取的数据或接收指令

- **重定向网络连接**：
  - **拦截** `socket`, `connect`, `send`, `recv` 等网络系统调用
  - 你可以选择将所有网络连接**完全禁止**，或者将它们重定向到一个**本地代理**，由代理来记录和控制所有流量
  - 理想的沙箱会**伪造 DNS 解析**，将恶意域名指向一个本地 IP，然后让代理服务器来处理这些连接，从而捕获所有网络数据包，而不让它们真正离开宿主机

**4. 进程与线程**

许多恶意软件会创建新进程、注入代码或修改其他进程的内存以隐藏自身

- **重定向进程操作**：
  - **拦截** `CreateProcess`, `CreateThread`, `InjectProcess`, `WriteProcessMemory` 等 API 调用
  - 沙箱应监控所有新创建的进程，确保它们也运行在受控环境中。
  - 对于进程注入，你可以直接**拒绝**这类行为，或者将其重定向到一个虚拟的环境，以防止对宿主机上其他进程的感染

**5. 系统信息**

为了躲避沙箱，恶意软件会查询系统信息来判断自己是否被监控。你需要对这些查询进行欺骗

- **重定向系统信息查询**：
  - **拦截** `cpuid`, `GetSystemInfo` 等 API 调用
  - 当恶意程序查询 CPU 制造商、内存大小或系统时间等信息时，你需要返回**虚假的值**，让它以为自己在一个真实的物理机环境中。比如，将 `VMware` 制造商字符串替换为 `GenuineIntel`，或者让系统时间流逝得更慢

**6. 渲染与屏幕**

某些恶意软件可能会尝试截屏或与桌面环境交互

- **重定向屏幕操作**：
  - **拦截** `GetDC`, `BitBlt` 等与屏幕渲染相关的 API
  - 你可以将截屏数据重定向到沙箱的临时文件，而不是让它访问真实的桌面内容