acageduser/DMA-Attack-Firmware-Customization
GitHub: acageduser/DMA-Attack-Firmware-Customization
Stars: 177 | Forks: 23
# DMA-Attack-Firmware-Customization
### 执行摘要
本指南提供了一种使用 [LambdaConcept 的 PCIe Screamer Squirrel DMA 板](https://shop.lambdaconcept.com/home/50-screamer-pcie-squirrel.html) 进行 **硬件混淆的综合方法**。该项目涉及模拟 DMA 卡以避免被反作弊系统检测,将其伪装成 [Realtek RTL8111](https://www.aliexpress.us/item/3256805896010027.html) PCIe 以太网卡。这是网络安全中的一项关键技术,为保护高价值硬件免受自动检测系统的侵害提供了创新方法。
# 展示的关键技能
- **Firmware 开发:** 定制和修改 Firmware 以实现特定目标。
- **硬件操控:** 利用 FPGA 技术模拟不同的硬件配置。
- **网络安全:** 实施先进技术以防止被复杂的反作弊系统检测。
- **项目管理:** 全面记录项目,确保可复现性和清晰度。
# #
## 目的
#### 战略基本原理
专注于规避像 BattleEye (BE) 和 Easy Anti-Cheat (EAC) 这样的反作弊系统,反映了复杂黑客组织的复杂性和组织性。这些系统由聪明的专业人员开发,资金充足,是测试先进规避技术的理想场所。成功绕过如此强大的检测机制不仅突显了技术专长,还提供了可应用于更广泛网络安全领域的宝贵见解。通过应对这些挑战,本项目展示了 DMA Firmware 的定制、硬件操控的专业知识以及先进的网络安全技能——这些在科技行业非常有价值,并且与防御同等资金充足、恶意的实体相关。

## 软件和硬件列表
- 硬件:
- [LabmdaConcept 的 PCIe Screamer Squirrel DMA 板](https://shop.lambdaconcept.com/home/50-screamer-pcie-squirrel.html)
- [Realtek 的 RTL8111 - 瑞昱半导体公司的集成千兆以太网控制器](https://www.aliexpress.us/item/3256805896010027.html)
- 软件:
- [MindShare - Arbor](https://www.mindshare.com/software/Arbor)
- PCILeech-FPGA [源代码](https://github.com/ufrisk/pcileech-fpga)
- [Visual Studio Community](https://visualstudio.microsoft.com/vs/community/)
- [Xilinx Vivado](https://www.xilinx.com/support/download.html)
## 项目详情
### 项目是什么?
本项目是一个硬件混淆模拟。硬件混淆是一种有效的网络安全技术,通过将高优先级硬件伪装成低优先级硬件来隐藏其真实性质。
### 为什么硬件混淆在网络安全中有效?
攻击者通常优先针对高价值硬件。通过将此类硬件伪装成低价值硬件,可以降低被检测的可能性,从而有效地拖延攻击者。
#### 高价值硬件示例:
- **服务器:** 对托管应用程序、数据库和敏感信息至关重要。针对这些可能导致重大数据泄露和中断。
- **网络路由器和交换机:** 基础设施的核心, compromised 这些可以提供对大量网络流量和控制的访问。
#### 低价值硬件示例:
- **打印机:** 普通且常被忽视,使其成为伪装高价值资产的理想选择。
- **扫描仪:** 与打印机类似,这些通常不被视为高价值目标,但在许多环境中很普遍。
### 硬件混淆的优势:
- **降低检测风险:** 通过掩盖高价值资产,显著降低它们被针对的几率。
- **增加攻击复杂性:** 攻击者必须花费更多时间和资源来识别和针对有价值资产,增加了检测和干预的可能性。
- **战略欺骗:** 为攻击者制造虚假的安全感,可将他们引入陷阱,例如蜜罐,在那里可以监控和分析他们的活动。
### 潜在应用:
- **企业网络:** 通过将关键服务器和数据库伪装成不太关键的设备来保护它们。
- **工业系统:** 通过将工业控制系统和关键基础设施掩盖为标准 IT 设备来保护它们。
- **金融机构:** 通过使交易处理系统看起来像非必要的办公设备来保护它们。
- **政府和国防:** 通过使用硬件混淆技术增强敏感系统和通信网络的安全性。
# #
# 项目
## 1. 介绍信息:
#### 35T
本项目将使用 ```35T: Squirrel``` 设备。75T 和 100T 设备将有所不同!
#### 为什么选择 RTL8111?
我还将使用 RTL8111 作为“donor card”(捐赠卡)。Donor card 指的是我将从中提取合法 ID 的物理设备。Donor card 的信息将被放到 DMA 卡上。使用真正的网卡将确保我的所有 ID 都是准确的。
####
我选择 RTL8111 是因为其驱动程序都有完善的文档。在选择合适的 donor card 时,这是一个需要牢记的重要步骤。开源驱动程序是最好的。可以在 [此 wiki](https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers) 上的 [开源无线驱动程序比较](https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers) 中找到开源驱动程序列表。
## 2. 捐赠卡 ID
从 donor card 收集 ID 是项目的第一部分。我将使用 [MindShare 的 Arbor](https://www.mindshare.com/software/Arbor) 获取我的 donor card 的硬件 ID。我将在这里执行 PCI 扫描:

我们可以在 PCI Map 选项卡中识别出 RTL8111 位于 Bus 5:

在 PCI Config 选项卡内,我们可以识别 RTL8111 中的许多值,例如 ```B:D:F```、```Class```、```Device Description```、```Device Type```、```Capabilities```。

我们还可以识别 RTL8111 的标头:

RTL8111 上没有什么异常。我们必须从 RTL8111 收集一些值。
#### Base Registry Address (BAR)
通过单击 BAR0 到 BAR5,记下你的 Base Registry Address (BAR) 的大小。设置为“00 00 00 00”的 BAR 是一个特殊的 BAR。0 表示 RTL8111 上未使用此特定 BAR。

```BAR0``` 是 ```256 bytes```。

```BAR1``` 未使用。

```BAR2``` 和 ```BAR3``` 是一对。它们的大小是 ```4KB```。

BAR4 和 BAR5 是一对。它们的大小是 ```16KB```。
#### Device Serial Number (DSN) Capability Structure

#### Advanced Error Reporting (AER) Capability Structure

#### Power Management (PM) Capability Structure

### MSI-X Capability Structure

#### Virtual Channel (VC) Capability Structure

#### Message Signaled Innterrupt (MSI) Capability Structure

## 3. 启用 Master Abort 处理以增强错误检测
在 ```pcileech_pcie_cfg_a7.sv``` 文件(位于 ```pcileech-fpga-4.15\PCIeSquirrel\src```)中将 master abort flag 设置为 ```1```,因为它有助于在 DMA 事务期间捕获无效的内存访问,如果设置为 0,这些访问 otherwise 不会被注意到。如果自定义 Firmware 出现问题,这可以更轻松地进行调试。检测和解决稍后可能出现的任何配置错误或失败事务(如果有)将更容易管理。如果没有此更改,你就有可能错过可能损害 DMA Firmware 功能的关键错误。这是一个保障措施。不要跳过此步骤。

我用 ```CTRL + F``` 功能和字符串“```master abort flag```”很容易地找到了它。整个文件中只有 1 处提到这一点。使该行完全如下所示:
```
rw[20] <= 1; // CFGSPACE_STATUS_REGISTER_AUTO_CLEAR [master abort flag]
```
Read/Write (rw) ```rw[20]``` 是正确的行。
## 4. 设置 DSN
在同一个文件中,将 DSN 值复制到 ```rw[127:64]``` 行。此行用于 cfg_dsn。此部分中有 16 个可用字符。确保将 ```Lower DW``` 复制到前 8 个数字上,并将 ```Upper DW``` 复制到后 8 个数字中,如下所示:
```
rw[127:64] <= 64'h684CE00051140000; // +008: cfg_dsn
```
```684CE000``` 和 ```51140000``` 是我们的 Lower 和 Upper DW。
保存 ```pcieleech_pcie_cfg_a7.sv```。
## 5. Vivado
#### 打开
Vivado 是我将用来创建 ```pcileech_squirrel.xpr``` 文件的工具。请务必确切知道你的 ```PCIeSquirrel``` 文件夹在哪里。我的在 ```M:\CUSTOM FW\pcileech-fpga-4.15\PCIeSquirrel```,所以我将 ```cd``` 到该位置并运行 ```source vivado_generate_project.tcl -notrace``` 来构建。
```cd``` 进入你的 ```PCIeSquirrel```:

```
source vivado_generate_project.tcl -notrace
```

创建 ```.xpr``` 文件时确保没有错误。打开 ```Sources``` 框内的文件 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。展开 ```pcileech_squirrel_top``` 和 ```i_pcileech_tlps128_dst64 : pcileech_tlps128_dst64```,直到找到 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。打开 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。
#### ID
我们现在将把之前保存的 ID 写入 ```IDs``` 选项卡。

我已经更新了 ```Vendor ID```、```Device ID```、```Revision ID```、```Subsystem Vendor ID``` 和 ```Subsystem ID```。无需更新 ```Class Code``` 中的任何值,因为 RTL8111 已经是 ```02 00 00```:

#### BAR
导航到 BARs 选项卡。BARs ```0``` 和 ```1``` 各自是 32 位 BAR,因为它们各包含一个 BAR。BARs ```2``` 和 ```4``` 是 64 位 BAR,因为它们各包含两个 BAR。I/O BAR 始终是 32 位。不要启用 BARs ```1```、```3``` 和 ```5```,因为它们是未使用的 BAR。我们知道这一点是因为它们被硬编码为全 ```0```。BAR ```3``` 是 BAR ```2``` 的一部分,所以不要启用 BAR ``````。同样,BAR ```5``` 是 BAR ```4``` 的一部分,所以不要启用 BAR ```5```。所有 64 位 BAR 都会进位到下一个 BAR,因此不要启用每个 64 位 BAR 的后半部分。更新 BAR:

我们应该保留其他选项卡,因为 DMA 设备需要在底层正常运行。更改其他选项卡(如 ```Power Management```)中的值可能会导致 DMA 卡过压或欠压。**不要**更改这些选项卡,否则你有硬件故障的风险!相反,点击屏幕底部的 ```OK```,然后在弹出框中不更改任何默认设置的情况下点击 ```Generate```。

#
找到 ```inst : pcie_7x_0_core_top (pcie_7x_0_core_top.v) (2)```

我们现在将手动编辑这些值。不再有像以前那样的友好 GUI 来帮助我们。你(通常)通过 ```__``` 读取参数名称。例如,```MSI_CAP_64_BIT_ADDR_CAPABLE``` 位于 ```MSI``` Structure 中,```CAP```(capabilities 的缩写)是 Capability 的名称,```64_BIT_ADDR_CAPABLE``` 是描述的名称。我在下面包含了有关如何读取 MSI capability 的屏幕截图。他们喜欢缩写名称,因此请仔细阅读。我将在下面列出要更改的行号和值:
#### Message Signaled Interrupt (真实示例)

第 154 行:
```
parameter MSI_CAP_64_BIT_ADDR_CAPABLE = "TRUE",
```
### PCIe

第 101 行:
```
parameter integer DEV_CAP_ENDPOINT_L0S_LATENCY = 3,
```

如何读取:
```3``` 是 ```[8:6]``` 处的 Endpoint L0s Latency 的值

第 102 行:
```
parameter integer DEV_CAP_ENDPOINT_L1_LATENCY = 6,
```

第 103 行:
```
parameter DEV_CAP_EXT_TAG_SUPPORTED = "TRUE",
```

第 104 行:
```
parameter integer DEV_CAP_MAX_PAYLOAD_SUPPORTED = 2,
```

第 105 行:
```
parameter integer DEV_CAP_PHANTOM_FUNCTIONS_SUPPORT = 0,
```

第 134 行:
```
parameter [3:0] LINK_CAP_MAX_LINK_SPEED = 4'h1,
```

第 135 行:
```
parameter [5:0] LINK_CAP_MAX_LINK_WIDTH = 6'h1,
```

第 139 行:
```
parameter [3:0] LINK_CTRL2_TARGET_LINK_SPEED = 4'h0,
```

第 163 行:
```
parameter [3:0] PCIE_CAP_DEVICE_PORT_TYPE = 4'h0,
```
如何读取:
```4'``` 表示该值宽 4 位。此处分配的值必须适合 4 位。
```h``` 表示数字的基数。```h``` 代表十六进制(基数为 16)
```0``` 是分配的实际值
```4'h0``` 表示它是一个设置为 0 的 4 位十六进制值。我们可以看到 ```0000b``` 是为 ```Device/Port Type``` 分配的值。吻合。

第 267 行:
```
parameter LINK_CAP_ASPM_SUPPORT = 3,
```
#### Power Management Capability Structure

第 167 行:
```
parameter PM_CAP_D1SUPPORT = "TRUE",
```
第 168 行:
```
parameter PM_CAP_D2SUPPORT = "FALSE",
```

第 171 行:
```
parameter PM_CSR_NOSOFTRST = "TRUE",
```

第 310 行:
parameter PM_CAP_AUXCURRENT = 4,

第 315 行:
```
parameter PM_CAP_VERSION = 3,
```
#### MSI-X Capability Structure
这部分略有不同。
1. PCIE_BASE_PTR:设置为 0x40,这是 PCI Express capability structure 所在的位置。
第 292 行:
```
parameter [7:0] PCIE_BASE_PTR = 8'h40,
```
2. PCIE_CAP_NEXTPTR:设置为 0xC8,这是下一个 capability(Power Management)所在的位置。
第 164 行:
```
parameter [7:0] PCIE_CAP_NEXTPTR = 8'hC8,
```
3. PM_BASE_PTR:设置为 0xC8,这是 Power Management capability 的偏移量。
第 309 行:
```
parameter [7:0] PM_BASE_PTR = 8'hC8,
```
4. PM_CAP_NEXTPTR:设置为 0xD0,指向偏移量 0xD0 处的 MSI-X structure。
第 169 行:
```
parameter [7:0] PM_CAP_NEXTPTR = 8'hD0,
```
5. MSI_BASE_PTR:设置为 0xD0,MSI-X capability 的位置。
第 280 行:
```
parameter [7:0] MSI_BASE_PTR = 8'hD0,
```
6. MSI_CAP_NEXTPTR:设置为 0x00,指示 capability 链的结束。
第 282 行:
```
parameter [7:0] MSI_CAP_NEXTPTR = 8'h00,
```
7. CAPABILITIES_PTR:capabilities 列表的起始点设置为 0x40,这是 PCIe capability 的偏移量
第 359 行:
```
parameter [7:0] CAPABILITIES_PTR = PCIE_BASE_PTR,
```
这将根据偏移量和指针链接配置空间中的 capability 结构。
保存你目前的工作。
## 6. 构建
这将需要一段时间运行。在我的 10600KF + 3070 PC 上大约花了 10 分钟。

在控制台中再次运行 ```source vivado_build.tcl -notrace```。

它将生成 ```pchileech_squirrel_top.bin```。将其刷入你的 DMA 卡。本项目不会介绍如何将 Firmware 刷入 DMA 卡,因为这超出了本项目的范围。本项目仅用于构建自定义 Firmware。
## 7. 测试
#### DMA 卡功能检查
将你的第二台 PC(Attack PC)连接到安装了 DMA 卡的 PC。
插入我的 DMA 卡的图片
插入连接了我的笔记本电脑的图片
我可以使用 [Lone DMA Test Tool](https://phoenixlabstore.com/lone-dma-test-tool/) 验证我的 Firmware 是否正常工作。

## 8. 针对 BattleEye Anti Cheat 测试我的 Firmware
当启动配备了 BattleEye Anti Cheat 的游戏时,禁止将 DMA 卡插入你的计算机。你将立即被禁止,并且你的硬件 ID 将被记录在黑名单上。除非你的 Firmware 配置空间**不**类似于你的普通卡,否则不要尝试本指南的这一部分。我已经更改了我的配置空间,但这超出了本项目的范围。我稍后可能会介绍这一点,但是,如果你正在阅读此说明,它目前尚未写入本指南。下一部分风险自负。
我将在 PlayerUnknown's Battlegrounds 上进行测试,因为它是一款使用 BattleEye anti cheat 的免费在线游戏。
#### Firmware 通过检查
我登录游戏没有问题。

#
# 结论
这个项目很成功。我将在这里保持我的 Firmware 状态最新。当此方法不再有效时,我将更新此部分。
截至我最后一次检查 03/03/2026,此方法通过并且有效。
#
## 使用的文档和驱动程序
#### 文档
- [RTL8111](https://pdf1.alldatasheet.co.kr/datasheet-pdf/view/1253500/REALTEK/RTL8111.html)
#### 驱动程序
- [RTL8111](https://pdf1.alldatasheet.co.kr/datasheet-pdf/download/1253500/REALTEK/RTL8111.html)
## 延伸阅读
- PCILeech [capabilities](https://github.com/ufrisk/pcileech)
- PCILeech 利用 PCIe 硬件设备通过 DMA 读写系统内存,无需在目标系统上安装驱动程序,支持各种硬件和软件内存获取方法,包括基于 FPGA 的设备用于完全内存访问和插入 kernel implants 以实现高级内存和文件系统访问,在 Windows 和 Linux 上运行。
## 词汇表
- **DMA (Direct Memory Access)**:一种允许硬件设备直接访问系统内存的方法,绕过 CPU,使数据传输更快。
- **FPGA (Field-Programmable Gate Array)**:一种用于各种任务的可编程硬件,包括模拟不同的硬件配置,如本项目中的网卡。
- **PCIe (Peripheral Component Interconnect Express)**:一种高速接口标准,用于将硬件设备(如 GPU 或网卡)连接到主板。
- **BAR (Base Address Register)**:一个寄存器,保存分配给设备的内存或 I/O 地址空间,对于 PCIe 事务期间与设备交互至关重要。
- **DSN (Device Serial Number)**:分配给硬件设备的唯一标识符,用于 PCIe 事务期间的识别。
- **TLP (Transaction Layer Packet)**:PCIe 通信中使用的一种数据包,用于在设备和内存之间传输数据。
- **AER (Advanced Error Reporting)**:一项 PCIe 功能,提供有关错误的详细信息,改进诊断和故障排除。
- **VC (Virtual Channel)**:PCIe 中的一种 capability structure,允许多个独立的数据路径或虚拟通道共享同一物理链路。
- **Master Abort**:当设备尝试访问无效的内存位置或未响应的设备时发生的错误情况。启用 master abort handling 允许检测和记录这些错误。
- **BE (BattleEye)**:游戏中使用的一种反作弊软件,用于检测未经授权的修改,包括基于 DMA 的作弊方法。
- **EAC (Easy Anti-Cheat)**:另一种流行的反作弊系统,旨在防止在线游戏中的黑客攻击和作弊。
- **Donor Card**:用于提取 ID 和配置数据以创建修改后的 Firmware 来模拟另一个设备的物理硬件设备。
# 注意
本项目仅供**教育目的**。不允许在纯教育环境之外使用本项目。本项目仅用于向我教授一种用于检测预防的网络安全策略。遵循本指南即表示你了解所涉及的风险,因为它包括重写可能导致硬件变砖的关键 Firmware 文件。任何 Firmware 篡改都可能导致变砖。以此为戒!仅按出现的步骤操作。
- [Realtek 的 RTL8111 - 瑞昱半导体公司的集成千兆以太网控制器](https://www.aliexpress.us/item/3256805896010027.html)
- 软件:
- [MindShare - Arbor](https://www.mindshare.com/software/Arbor)
- PCILeech-FPGA [源代码](https://github.com/ufrisk/pcileech-fpga)
- [Visual Studio Community](https://visualstudio.microsoft.com/vs/community/)
- [Xilinx Vivado](https://www.xilinx.com/support/download.html)
## 项目详情
### 项目是什么?
本项目是一个硬件混淆模拟。硬件混淆是一种有效的网络安全技术,通过将高优先级硬件伪装成低优先级硬件来隐藏其真实性质。
### 为什么硬件混淆在网络安全中有效?
攻击者通常优先针对高价值硬件。通过将此类硬件伪装成低价值硬件,可以降低被检测的可能性,从而有效地拖延攻击者。
#### 高价值硬件示例:
- **服务器:** 对托管应用程序、数据库和敏感信息至关重要。针对这些可能导致重大数据泄露和中断。
- **网络路由器和交换机:** 基础设施的核心, compromised 这些可以提供对大量网络流量和控制的访问。
#### 低价值硬件示例:
- **打印机:** 普通且常被忽视,使其成为伪装高价值资产的理想选择。
- **扫描仪:** 与打印机类似,这些通常不被视为高价值目标,但在许多环境中很普遍。
### 硬件混淆的优势:
- **降低检测风险:** 通过掩盖高价值资产,显著降低它们被针对的几率。
- **增加攻击复杂性:** 攻击者必须花费更多时间和资源来识别和针对有价值资产,增加了检测和干预的可能性。
- **战略欺骗:** 为攻击者制造虚假的安全感,可将他们引入陷阱,例如蜜罐,在那里可以监控和分析他们的活动。
### 潜在应用:
- **企业网络:** 通过将关键服务器和数据库伪装成不太关键的设备来保护它们。
- **工业系统:** 通过将工业控制系统和关键基础设施掩盖为标准 IT 设备来保护它们。
- **金融机构:** 通过使交易处理系统看起来像非必要的办公设备来保护它们。
- **政府和国防:** 通过使用硬件混淆技术增强敏感系统和通信网络的安全性。
# #
# 项目
## 1. 介绍信息:
#### 35T
本项目将使用 ```35T: Squirrel``` 设备。75T 和 100T 设备将有所不同!
#### 为什么选择 RTL8111?
我还将使用 RTL8111 作为“donor card”(捐赠卡)。Donor card 指的是我将从中提取合法 ID 的物理设备。Donor card 的信息将被放到 DMA 卡上。使用真正的网卡将确保我的所有 ID 都是准确的。
####
我选择 RTL8111 是因为其驱动程序都有完善的文档。在选择合适的 donor card 时,这是一个需要牢记的重要步骤。开源驱动程序是最好的。可以在 [此 wiki](https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers) 上的 [开源无线驱动程序比较](https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers) 中找到开源驱动程序列表。
## 2. 捐赠卡 ID
从 donor card 收集 ID 是项目的第一部分。我将使用 [MindShare 的 Arbor](https://www.mindshare.com/software/Arbor) 获取我的 donor card 的硬件 ID。我将在这里执行 PCI 扫描:

我们可以在 PCI Map 选项卡中识别出 RTL8111 位于 Bus 5:

在 PCI Config 选项卡内,我们可以识别 RTL8111 中的许多值,例如 ```B:D:F```、```Class```、```Device Description```、```Device Type```、```Capabilities```。

我们还可以识别 RTL8111 的标头:

RTL8111 上没有什么异常。我们必须从 RTL8111 收集一些值。
#### Base Registry Address (BAR)
通过单击 BAR0 到 BAR5,记下你的 Base Registry Address (BAR) 的大小。设置为“00 00 00 00”的 BAR 是一个特殊的 BAR。0 表示 RTL8111 上未使用此特定 BAR。

```BAR0``` 是 ```256 bytes```。

```BAR1``` 未使用。

```BAR2``` 和 ```BAR3``` 是一对。它们的大小是 ```4KB```。

BAR4 和 BAR5 是一对。它们的大小是 ```16KB```。
#### Device Serial Number (DSN) Capability Structure

#### Advanced Error Reporting (AER) Capability Structure

#### Power Management (PM) Capability Structure

### MSI-X Capability Structure

#### Virtual Channel (VC) Capability Structure

#### Message Signaled Innterrupt (MSI) Capability Structure

## 3. 启用 Master Abort 处理以增强错误检测
在 ```pcileech_pcie_cfg_a7.sv``` 文件(位于 ```pcileech-fpga-4.15\PCIeSquirrel\src```)中将 master abort flag 设置为 ```1```,因为它有助于在 DMA 事务期间捕获无效的内存访问,如果设置为 0,这些访问 otherwise 不会被注意到。如果自定义 Firmware 出现问题,这可以更轻松地进行调试。检测和解决稍后可能出现的任何配置错误或失败事务(如果有)将更容易管理。如果没有此更改,你就有可能错过可能损害 DMA Firmware 功能的关键错误。这是一个保障措施。不要跳过此步骤。

我用 ```CTRL + F``` 功能和字符串“```master abort flag```”很容易地找到了它。整个文件中只有 1 处提到这一点。使该行完全如下所示:
```
rw[20] <= 1; // CFGSPACE_STATUS_REGISTER_AUTO_CLEAR [master abort flag]
```
Read/Write (rw) ```rw[20]``` 是正确的行。
## 4. 设置 DSN
在同一个文件中,将 DSN 值复制到 ```rw[127:64]``` 行。此行用于 cfg_dsn。此部分中有 16 个可用字符。确保将 ```Lower DW``` 复制到前 8 个数字上,并将 ```Upper DW``` 复制到后 8 个数字中,如下所示:
```
rw[127:64] <= 64'h684CE00051140000; // +008: cfg_dsn
```
```684CE000``` 和 ```51140000``` 是我们的 Lower 和 Upper DW。
保存 ```pcieleech_pcie_cfg_a7.sv```。
## 5. Vivado
#### 打开
Vivado 是我将用来创建 ```pcileech_squirrel.xpr``` 文件的工具。请务必确切知道你的 ```PCIeSquirrel``` 文件夹在哪里。我的在 ```M:\CUSTOM FW\pcileech-fpga-4.15\PCIeSquirrel```,所以我将 ```cd``` 到该位置并运行 ```source vivado_generate_project.tcl -notrace``` 来构建。
```cd``` 进入你的 ```PCIeSquirrel```:

```
source vivado_generate_project.tcl -notrace
```

创建 ```.xpr``` 文件时确保没有错误。打开 ```Sources``` 框内的文件 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。展开 ```pcileech_squirrel_top``` 和 ```i_pcileech_tlps128_dst64 : pcileech_tlps128_dst64```,直到找到 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。打开 ```i_pcie_7x_0 : pcie_7x_0 (pcie_7x_0.xci)```。
#### ID
我们现在将把之前保存的 ID 写入 ```IDs``` 选项卡。

我已经更新了 ```Vendor ID```、```Device ID```、```Revision ID```、```Subsystem Vendor ID``` 和 ```Subsystem ID```。无需更新 ```Class Code``` 中的任何值,因为 RTL8111 已经是 ```02 00 00```:

#### BAR
导航到 BARs 选项卡。BARs ```0``` 和 ```1``` 各自是 32 位 BAR,因为它们各包含一个 BAR。BARs ```2``` 和 ```4``` 是 64 位 BAR,因为它们各包含两个 BAR。I/O BAR 始终是 32 位。不要启用 BARs ```1```、```3``` 和 ```5```,因为它们是未使用的 BAR。我们知道这一点是因为它们被硬编码为全 ```0```。BAR ```3``` 是 BAR ```2``` 的一部分,所以不要启用 BAR ``````。同样,BAR ```5``` 是 BAR ```4``` 的一部分,所以不要启用 BAR ```5```。所有 64 位 BAR 都会进位到下一个 BAR,因此不要启用每个 64 位 BAR 的后半部分。更新 BAR:

我们应该保留其他选项卡,因为 DMA 设备需要在底层正常运行。更改其他选项卡(如 ```Power Management```)中的值可能会导致 DMA 卡过压或欠压。**不要**更改这些选项卡,否则你有硬件故障的风险!相反,点击屏幕底部的 ```OK```,然后在弹出框中不更改任何默认设置的情况下点击 ```Generate```。

#
找到 ```inst : pcie_7x_0_core_top (pcie_7x_0_core_top.v) (2)```

我们现在将手动编辑这些值。不再有像以前那样的友好 GUI 来帮助我们。你(通常)通过 ```标签:BattlEye, DMA攻击, DMA板卡, DNS 解析, Easy Anti-Cheat, FPGA开发, PCIe Screamer, PCIe设备, PCILeech, RTL8111, Squirrel, 反作弊绕过, 固件修改, 固件定制, 模拟伪装, 游戏安全, 硬件安全, 硬件混淆, 红队战术, 网卡模拟, 网络安全, 隐私保护