我有几个Solaris 2.6时代的驱动程序,我想对其进行反向工程。 。

驱动程序用于我拥有的Sbus图形加速器。即ZX aka Leo是早期3d加速器之一。我可以反汇编它,但不确定输出内容如何。我当然也有Solaris,所以也许有些事情我也可以做。

最终的目标是拥有足够的信息来为操作系统设计驱动程序。有一些NetBSD驱动程序,尽管不完整,因为确实存在(无法免费访问)的硬件文档没有Window ID编码,因为缺少它。另外,由于硬件在双倍宽的夹层卡上使用Sbus接口,因此在SparcStation或早期的UltraSparc机器以外的任何设备上都无法使用它。

评论

您可能应该添加最终目标。您要在另一台机器上使用该卡吗?在同一盒子上制作另一个操作系统的驱动程序?只是好奇吗?

@Igor Skochinsky很好的建议,我已经把你带上了!是的,只是出于好奇和乐趣。您可能会说,老式SparcStation是我的爱好。

如果您有NetBSD的驱动程序,建议您查看一下它们,并尝试找到与Solaris驱动程序的匹配项。这样可以加快处理过程。

然而确实的确,正如我说的那样... ZX的NetBsd驱动程序不完整,并且肯定不包括该设备具有的opengl 1.1功能,因此我几乎肯定要获得IDA的副本或让朋友转储该文件。为我集会。我也有一个TGS opengl驱动程序,该驱动程序很有趣,我确定但是它需要flexlm许可证,可惜我没有。
我还发现了某种可能有用的Linux驱动程序。

#1 楼

好吧,因为它是Solaris驱动程序,所以首先您需要找到一些有关Solaris驱动程序与内核(或内核与内核)通信的文档。快速搜索显示以下内容:


_init()初始化可加载模块。它在可加载模块中的任何其他例程之前被调用。 _init()返回
mod_install(9F)返回的值。在执行mod_install(9F)调用之前,模块可以选择执行其他一些工作。如果模块在调用mod_install(9F)函数之前已经完成了一些设置,则应该准备好
,如果mod_install(9F)返回
错误,则撤消该设置。返回有关可加载模块的信息。 _info()返回_info()返回的值。

mod_info(9F)准备要装载的可装载模块。当系统要卸载模块时调用它。如果模块确定可以卸载
,则_fini()返回
_fini()返回的值。从mod_remove(9F)成功返回后,在调用_fini()之前不会调用模块中的其他例程。


下面有一个不错的代码示例。

该指南似乎也很相关。

找到入口点后,只需遵循调用和指针即可。

这是IDA中的外观:在那里,看看这些字段指向什么。

但是您甚至不必一直这样做。在这种情况下,程序员非常周到地保留了所有符号和调试输出。这应该对您的工作有所帮助:)

根据情况,您可以直接跳到诸如_init()mod_install之类的有用功能。我个人更喜欢自上而下的第一种方法,但又各取其用。

编辑:您可以做的一件相当简单的事情是将modlinkage部分开始处的leo_blit_sync_start变量修补到5左右。这将产生有关驱动程序正在执行的操作的大量调试输出。

评论


显然,IDA专业人士不言自明:) ...那说我现在买不起许可证。这个话题有点离题,但是对于像我这样的人,按体系结构许可可能会很有趣。

–cb88
13年3月20日在13:04

@ cb88:我认为它仍然会比您想要的贵。 IDA是独一无二的。价格公道,但不是每个人都可以。他们有学生许可证。但我认为您需要有人认识您并担保您(如果他们仍然这样做)。在过去,太多的泄漏对DataRescue和后来的Hex-Ray造成了财务损失。

– 0xC0000022L♦
13年4月4日在17:35

0xC0000022L $ 75将是他们在完整软件中每个拱门收取的价格的3倍,如果您以后能以全价将其升级到完整版本-单拱门价格将是相当公平的,但是我想问的太多了。我毫不怀疑每一分钱的价值,我只是不需要一艘战舰来完成我的桨船工作:D

–cb88
13年4月4日在21:56