有哪些方法可以反转 .kext?

逆向工程 操作系统
2021-06-12 01:57:35

我最近发现我的计算机中没有用于网络摄像头的本地 Linux 驱动程序。然而,有一个人已经主动为一个驱动程序启动了一个github项目话虽如此,我能够让网络摄像头在运行 OS X (10.10) 的 qemu 来宾操作系统中工作,现在我想开始分析 .kext 问题。

快速谷歌搜索揭示了这一点,但我不确定这种方法是否仍然适用于 OS X (10.10)。

我应该尝试在正在运行的系统上调试 .kext,还是应该将 .kext 复制到我的主机操作系统 (Linux) 并开始在诸如 Hopper / Radare2 之类的反汇编程序中进行分析?

另外我应该注意,据我所知,大多数 OS X 内核扩展都是用 C++ 编写的,而大多数(如果不是全部)Linux 驱动程序都是用 C 编写的。那么我会浪费时间来反转/分析这个 .kext 吗?对此主题的任何帮助将不胜感激。

1个回答

直接回答您的问题

您可以使用 IDA Pro、Radare2、GDB 或任何您喜欢的反汇编程序来反转内核扩展。是的,您必须了解反汇编后的 C++ 结构是什么样的。我无法回答“静态分析还是动态分析?” 直接提出问题,因为答案通常是“两者都可以,具体取决于您想要什么”。有些逆向工程师从静态开始,有些从动态开始。

个人会从静态分析工具开始,因为:

  • 我想司机是相当大的。如果你不知道你在找什么,你可能会花很长很长的时间单步走。
  • 通过搜索和分析驱动程序中的特定函数调用,您将获得更多收益。一旦您看到它们与其他功能的关系,它们的使用很可能会在驱动程序中不言自明
  • 这里没有混淆的元素。您也不需要检查内存中任何内容确切位置。
  • 无论如何,您都试图以此重写驱动程序,以类似于源代码的格式查看内容将有助于该过程。

但每一个他自己。如果有足够的时间,我会为了了解而经历这两个过程。此外,要正确完成此操作,您将需要了解一些有关 Macintosh 系统编程的知识。

今年有一个关于这个主题的recon课:http : //www.recon.cx/2015/trainingosx.html(一旦白皮书发布,它应该在这个答案中链接)

这是一本关于内核开发的书中的片段,它带您了解使用 IDA pro 反转 kext 的基础知识:

https://books.google.com/books?id=G6Zeh_XSOqUC&pg=PA215&lpg=PA215&dq=IDA+pro+kernel+extension+mac&source=bl&ots=0y3XXMAgqH&sig=6HkJnGKmW7OugZiHo42DwOYtaY8&hl=en&sa=X&ei=93nbVIe_BYWVyQT4z4HgDw&ved=0CEIQ6AEwBQ#v=onepage&q=IDA% 20pro%20kernel%20extension%20mac&f=false

关于这个特定的相机:

似乎在此处找到的对话中引用了有问题的相机:https : //bugzilla.kernel.org/show_bug.cgi?id=71131

本质上,该摄像机通过PCI 进行通信,因为它在发送到系统之前不会压缩其视频。该线程指出,已经有一个项目正在进行中,可以为相机制作驱动程序,可以在https://github.com/patjak/bcwc_pcie上找到

此站点上的 wiki 内容丰富,并列出了对此类驱动程序进行逆向工程的一些问题。在以下位置找到的 wiki 页面:https : //github.com/patjak/bcwc_pcie/wiki/Mac-OS-X-driver提供了一些关于您应该从哪里开始使用 Mac 方面的好主意。

根据他们的待办事项列表,您可能希望专注于帮助从设备本身获取设备固件。

关于开发自己的驱动程序:

我会从不同的方向开始,对相机本身进行逆向工程。根据您的相机的复杂程度,您可以直接与它通话,而无需通过串行连接的驱动程序。您也可以打开相机,并通过调试端口直接与它对话(想想 JTAG,甚至更简单。)

我第一次阅读您的问题时,我以为您指的是计算机外的小型摄像头,但我猜您指的是笔记本电脑内置的摄像头。我认为在这种情况下,你可以从现有的网络摄像头中调整一个驱动程序,然后看看它在哪里消失。我相信这些相机在这一点上是相当通用的硬件。

Linux 上的大多数网络摄像头都使用此驱动程序:https : //help.ubuntu.com/community/UVC,您可能只需运行此驱动程序即可查看它在哪里死亡/无法与相机通信。无论如何,观看与相机的实际通信将使您更好地了解您需要做什么。

关于反转 Macintosh 内核扩展的实用程序:

我不会担心 c++/C 的差异与系统库和系统调用接口的差异。为您自己的启蒙分析驱动程序当然不会有什么坏处,但是您可能会发现它通过调用 mac 系统库来完成大部分工作,这些库在 linux 中的工作方式不同。您将最感兴趣的是阅读定义与相机通信的驱动程序部分。无论如何,您将无法直接将 KeXT 转换为 Linux 内核模块。

我的最终建议:

相反,如果您当前的网络摄像头不适用于您的 linux 发行版,我会首先确认您拥有合适的通用驱动程序,然后编辑通用驱动程序以支持您的相机。您可以对通用驱动程序执行拉取请求。

在大多数情况下,与这些相机的通信是非常简单的串行通信。我怀疑从通用驱动程序触发错误会比尝试破译 mac 驱动程序更快。