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

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

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

评论

疯狂猜测:.sys文件的静态分析?就像其他任何软件一样

回到尚未集成cpu和其他第三方硬件的时间。我想知道他们如何对硬件进行逆向工程,以捕获硬件中的某些信号或输出并将其用作中断。它不像逆向工程通用软件AcidShout

好吧,您可以在软件方面进行反向转换的是用于将系统与GPU进行通信的驱动程序……实际上,它描述了您与驱动程序进行通信的方式,以便它可以执行您想要的操作。您只需检查驱动程序对其收到的每个信号的代码做了什么,以及为了使其发送信号需要进行什么操作。我认为您不能再走了。还是我误会你了? (考虑到您已经拥有了解内部驱动程序所需的全部Windows驱动程序,因此反转硬件本身不是一个好主意)
我的问题是,是否有一种专有设备,供应商没有公开某些指令寄存器或中断代码。我如何获得该IR,到目前为止,我所了解的是,我必须手动点击该设备上的每个I / O系统并监视答复(实时内核调试)。根据回复代码,然后我就可以开始构建驱动程序了。当然,您必须精通EE,才能触发设备本身的输出。了解如何通过向电路板提供直流电来为设备加电。我认为能够理解电子零件至关重要。

#1 楼

它取决于特定的接口,但是总体思路通常是相同的,并且通常不涉及拆卸驱动程序。原因是,并非在所有辖区都认为反向工程的拆卸方法是合法的。以下是通常的步骤:

1。请与制造商联系以获取所需的信息

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

2。通过观察获得有关设备的一般信息

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

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

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

4。尝试在Linux下复制通信

这是编写代码并尝试结果的问题。由于Linux已经具有丰富的驱动程序集,因此通常最容易从类似的东西开始进行修改。由于所有内容都是开源的,因此不仅可以进行修补,而且可以鼓励!对于除视频卡以外的设备,人们通常可以编写用户空间代码来尝试使用该设备并收集数据并进行实验。最终,编写一个真正的驱动程序,最好是将其作为内核模块,以允许卸载和重新装载。

5.这可以加快开发周期,而无需更改任何驱动程序(我在看Windows,就是您!)后必须重新启动。广泛测试

通常,测试和错误修复对于开源软件很重要,并且肯定适用于设备驱动程序以及其他任何设备。首先,为了包含在内核中,其他开发人员会在有时残酷但始终有用的过程(称为代码审查)中查看代码。其他经验丰富的开发人员会查看源代码,并指出代码中的弱点,假设中的缺陷,甚至注释和格式问题中的错字。一旦有足够多的人这样做,拥有实际设备的人就会在其硬件上实际尝试该设备并报告错误或异常。这通常会引发一些问题,例如版本差异(例如,物理设备有多个版本,但全部作为同一产品出售)和设备冲突(设备A和设备B都可以单独使用,但在连接时会失败)。

最终,结果是每个人都可以使用的崭新的,无错误的开源驱动程序。 (还是那是目标!)

评论


我希望获得技术上的解答,但这使我对过程有所了解。我想我明白了,非常感谢爱德华。愿上帝保佑你:D

–法赫里·祖尔基弗利(Fakhri Zulkifli)
15年8月19日在9:35

很难给出详细的技术答案,因为问题非常广泛,并且适用工具和技术的范围非常广泛。如果再问一个范围更广的问题,您可能会得到更具体,更技术性的答案。

–爱德华
15年8月19日在19:05