DMA固件读卡器源码:pcileech-带读卡器仿真的FPGA
DMA固件读卡器源码只提供源码 pcileech-带读卡器仿真的fpga最近在折腾硬件安全研究的小伙伴们应该都听说过DMA直接内存访问读卡器的骚操作。这玩意儿不经过CPU直接跟内存对话的特性在取证和漏洞挖掘领域简直是个神器。今天咱们就扒一扒某开源DMA固件读卡器的源码实现顺带看看PCILeech项目中那个带FPGA仿真的黑科技。先看DMA固件的核心初始化代码片段void dma_init() { // 配置PCIe BAR空间 pci_write32(dev, PCI_BASE_ADDRESS_0, bar_phys); // 设置DMA控制寄存器 uint32_t ctrl_reg DMA_CTRL_ENABLE | DMA_CTRL_64BIT; mmio_write(dma_base REG_CTRL, ctrl_reg); // 分配环形缓冲区 dma_ring alloc_dma_buffer(RING_SIZE); mmio_write(dma_base REG_RING_ADDR, dma_ring.phys_addr); }这里有个骚操作——通过MMIO直接操作PCIe设备的配置空间。BAR0的映射让硬件可以直接访问物理内存而环形缓冲区的设计通常用cyclic DMA模式能实现持续的数据搬运。注意那个64BIT标志位现在新设备都玩64位寻址了不开启这个分分钟给你来个内存越界。DMA固件读卡器源码只提供源码 pcileech-带读卡器仿真的fpgaPCILeech项目的FPGA实现更有意思看这段Verilog状态机always (posedge clk) begin case(state) IDLE: if (pcie_rx_valid) begin cmd_buffer pcie_rx_data; state DECODE; end DECODE: if (cmd_buffer[31:28] CMD_READ) begin ram_addr cmd_buffer[27:0]; state READ_RAM; end READ_RAM: pcie_tx_data ram[ram_addr]; state IDLE; endcase end这个状态机实现了最简单的PCIe事务模拟。注意pcierxvalid信号的处理——实际工程中这里需要做TLP包解析但demo版直接暴力截取数据段。ram数组模拟了目标机的内存空间通过地址映射实现读卡器的假动作这种实现虽然简陋但对理解DMA原理非常直观。两个项目对比着看挺有意思固件方案依赖硬件DMA控制器FPGA方案则是自己造轮子。实战中遇到过个坑——某些新主板的IOMMU会拦截DMA请求这时候就得像PCILeech那样在初始化时插入个内核模块// 绕过IOMMU的祖传秘方 wrmsr(MSR_IVT_BASE, (u64)original_ivt); __asm__ volatile(invlpg (0));这段骚代码直接操作模型特定寄存器MSR通过重映射中断向量表来绕开内存保护。不过得注意CPU微码版本英特尔从Ice Lake之后这招就不太好使了这时候FPGA方案的优势就出来了——它从物理层模拟PCIe设备防不胜防。最后给新人提个醒玩DMA记得做好静电防护。上次拿自己开发的读卡器怼服务器结果手滑静电击穿了个MOS管三千块的FPGA开发板当场变砖。血的教训告诉我们——装逼需谨慎操作要接地。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2476753.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!