捕获操作系统/硬件通信/逆向工程驱动程序

逆向工程 linux
2021-06-26 23:04:21

我的主要问题是开源社区如何逆向工程 Windows 驱动程序(例如,视频卡)以在 linux 下重新编写它们。

资源链接很好,我不希望答案中有关于驱动程序开发的教程。但至少我需要指出正确的方向。

这其实在其他stackoverflow子域中也有人问过。但是,原作者没有得到正确答案,我也想了解这种逆向工程方法。我希望这个问题不被视为重复问题。

1个回答

这取决于特定接口上,但一般的概念往往是相同的,通常不会涉及拆卸的驱动程序。原因是逆向工程的反汇编方法并非在所有司法管辖区都被认为是合法的。以下是通常的步骤:

1. 联系制造商获取所需信息

显然,最直接的方法也是最容易成功的。一些制造商比其他制造商更合作。对于某些类型的设备,即使设备制造商不合作,有时设备上主要芯片的制造商也愿意分享一些信息,这会有所帮助。

2.通过观察获取设备的一般信息

很多信息可以通过简单的观察获得。例如,设备中的主要组件是什么?我们可以查找零件号并找到它们的数据表吗?这个版本是n+1吗,Linux已经有n驱动了吗?手册或 Windows 驱动程序用户界面是否提供有关寄存器、设置或功能的任何重要线索?Windows 驱动程序是否支持多个设备?这可能表明这些设备可能相似,如果其中一个已经有 Linux 驱动程序,它会有所帮助。

3. 捕获与设备的通信以进行分析

对于某些设备,例如串行端口或 USB,捕获设备驱动程序和设备之间的通信通常相当简单。(请参阅如何对简单的 USB 设备进行逆向工程 [windows -> linux])可以通过多种方式捕获视频卡的通信。一种方法是使用专有的 Linux 驱动程序,然后拦截调用,就像使用REnouveau工具一样。共享数据很重要,这也是为 Linux 成功编写了这么多驱动程序的原因之一。开源社区的主要优势之一是世界各地都有人能够并且确实与这些努力合作。

4.尝试复制Linux下的通讯

这是编写代码并尝试结果的问题。因为 Linux 已经有一套丰富的驱动程序,所以从类似的东西开始并修改它通常是最容易的。由于一切都是开源的,不仅允许而且鼓励修补!对于视频卡以外的设备,通常可以编写用户空间代码来尝试运行设备并收集数据并尝试实验。最终,编写了一个真正的驱动程序,最好是作为内核模块,以允许卸载和重新加载。这加快了开发周期,而不必在任何驱动程序更改后重新启动(我在看着,Windows!)

5. 广泛测试

测试和错误修复通常对于开源软件很重要,这当然适用于设备驱动程序以及其他任何东西。首先,为了包含在内核中,其他开发人员在有时残酷但始终有用的过程中查看代码,称为代码审查。其他有经验的开发人员查看源代码并指出代码中的弱点、假设中的缺陷,甚至注释中的错别字和格式问题。一旦有足够多的人这样做,拥有相关实际设备的人实际上会在他们的硬件上尝试并报告错误或异常情况。这通常会出现诸如版本差异(例如,物理设备有多个版本,但都作为同一个东西出售)和设备冲突(设备 A 和设备 B 单独运行良好,但在两者连接时都失败)等问题。

最终,结果是每个人都可以使用的闪亮的新的无错误的开源驱动程序。(或者这就是目标,无论如何!)