问题标签 [kernel-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1814 浏览

c++ - 为什么这个键盘拦截内核扩展不起作用?

我的开发者伙伴们!我非常希望至少你们中的一些人不会被这个问题所包含的文本数量吓到(我只是尽我所能尽可能人性化地进行描述)。:)

对于那些认为我问这个问题是为了编写恶意软件或其他东西的人。我想编写一个应用程序,允许用户在操作系统完成启动后选择要启动的应用程序。整个想法是允许用户在操作系统完成启动之前通过按下先前绑定到应用程序的热键来选择这些应用程序。例如,用户打开他的 Mac,键入 SMTV 并离开,当系统完成启动我的应用程序时,恢复输入并启动 Safari、Mail、Tweetie 和 Vuze。我是 SO 的新手,但我尽我所能通过回答他们的问题来帮助他们——我想我可以期待同样的回报。检查我的个人资料和活动,然后开始对恶意软件大喊大叫。

这个问题是对问题是否可以恢复 Mac OS 启动时完成的键盘输入的后续问题?.

Pekka 的建议的指导下,我偶然发现了 Christian Starkjohann 的文章Intercepting Keyboard Events ,该文章描述了他和Objective Development 团队如何成功地将 iBook 的 CDROM 弹出键从 F12 重新分配为 Shift+F12。主要部分是他们实际上截获了键盘事件,这正是我所需要的。最后,Christian 写这篇文章正是为了像我这样的开发人员使用 iJect 的想法作为类似功能的原型。

首先,我决定创建一个简单的内核扩展来简单地将用户的键盘输入记录到/var/log/kernel.log. 我已经在 XCode 中启动了一个新的通用内核扩展项目,按照Hello Kernel:Creating a Kernel Extension With Xcode教程在Mac Dev Center 的内核扩展概念中找到的说明创建了一个 Hello World 项目,然后用来自的代码填充它iJect 来源。结果如下:

测试KEXT.c

HIDhack.h

HIDhack.cpp

生成的内核扩展被 kextload/kextunload 程序成功加载/卸载,但实际上并没有拦截任何键盘事件。我已经尝试做很多事情来让它工作,但是没有任何错误或其他问题,我无法谷歌搜索任何有用的东西并寻求你的帮助。

0 投票
1 回答
643 浏览

macos - Mac OSX 中的网络数据包检查器

我正在尝试创建一个网络数据包检查器。

我知道你可以用 libpcap 做到这一点,但它不是嗅探器,我需要伪造网络数据包,然后才能将其发送到网络上。(通过 socks 服务器发送)

我找到了两种方法来做到这一点:

  • 使用 NKE。(网络内核扩展)
  • 使用 DYLD_INSERT_LIBRARIES 插入库以挂钩网络功能。

你认为哪种方法最好?

0 投票
1 回答
671 浏览

c - 实现一个拦截文件系统使用的 kext

如果文件被感染,大多数防病毒软件如何阻止文件系统 io?我想所有的魔法都存在于一些自定义的 kext 中来做到这一点。谁能指出我有关此的一些主题?一些工作示例也会很棒。我已经阅读了关于 kext 开发的苹果文档,但大部分都是关于硬件驱动程序的,我找不到我需要的东西。

0 投票
3 回答
18674 浏览

c++ - 在 Mac 上读取和写入 USB (HID) 中断端点

我正在尝试与一个相当特定的 USB 设备进行通信,并为此开发 Windows 和 Mac 代码。

该设备是具有 HID 接口(3 类)的 USB 设备,具有两个端点,一个中断输入和一个中断输出。设备的性质是,只有当主机请求数据时,才在输入端点上从设备发送数据:主机向其发送数据,设备在其输入中断端点上响应该数据。将数据获取到设备(写入)要简单得多......

Windows 的代码相当简单:我得到设备的句柄,然后调用 ReadFile 或 WriteFile。显然,许多底层异步行为都被抽象出来了。它似乎工作正常。

然而,在 Mac 上,它有点粘。我尝试了很多事情,没有一个是完全成功的,但这里有两件看起来最有希望的事情......

1.) 尝试通过 IOUSBInterfaceInterface 访问设备(作为 USB),遍历端点以确定输入和输出端点,并(希望)使用 ReadPipe 和 WritePipe 进行通信。不幸的是,一旦我拥有它,我就无法打开界面,返回值 (kIOReturnExclusiveAccess) 指出某些东西已经让设备独占打开。我曾尝试使用 IOUSBinterfaceInterface183,以便可以调用 USBInterfaceOpenSeize,但这会导致相同的返回错误值。

--- 更新 2010 年 7 月 30 日 ---
显然,Apple IOUSBHIDDriver 与设备早期匹配,这可能是阻止打开 IOUSBInterfaceInterface 的原因。从一些挖掘看来,阻止 IOUSBHIDDriver 匹配的常用方法是编写一个具有更高探测分数的无代码 kext(内核扩展)。这将尽早匹配,阻止 IOUSBHIDDriver 打开设备,并且理论上应该允许我打开接口并直接写入和读取端点。这没关系,但我更希望不必在用户机器上安装额外的东西。如果有人知道可靠的替代方案,我将不胜感激。

2.)将设备作为 IOHIDDeviceInterface122(或更高版本)打开。为了阅读,我设置了一个异步端口、事件源和回调方法,以便在数据准备好时调用 - 当数据从输入中断端点上的设备发送时。但是,要写入设备需要的数据来初始化响应,我找不到方法。我难住了。setReport 通常写入控制端点,另外我需要一个不期望任何直接响应、不阻塞的写入。

我在网上环顾四周并尝试了很多东西,但没有一个能让我成功。有什么建议吗?我不能使用很多 Apple HIDManager 代码,因为其中大部分是 10.5+,而且我的应用程序也必须在 10.4 上运行。

0 投票
1 回答
843 浏览

macos - 杀死WindowServer的低级热键kext?

我需要制作一个功能非常简单的 kext。每当按下组合键时,kext 应该终止一个恰好是“WindowServer”的进程

由于问题的性质,它必须是一个 kext。它必须独立于系统的 UI,所以如果它挂断,我可以按下这个组合并重新启动它。

有人可以提供一个起点吗?就像如何制作密钥处理程序一样?

0 投票
4 回答
333 浏览

linux - 在内核模块中实现 CPU 扩展

我正在寻找有关在内核模块中实现某些 CPU 扩展的信息。我发现了一些相关的东西:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c事实上,这是我能找到的唯一接近的源代码.

基本上,我有一个使用某些 CPU 扩展构建的仅二进制共享对象,我需要在具有大部分指令集但不是花哨的新东西的稍旧的 CPU 上运行它。是的,我知道这会很慢,但总比因为 SIGILL 崩溃要好。

0 投票
1 回答
639 浏览

xcode - 在 Kexts 中链接 Dylib?

我为 OS X 编写了一个 kext,它使用 (IOKit) libusb 和 jpeglib 实现了一个基于 USB 的帧缓冲区。这两个都是 dylib,由于某种原因,它们无法在 XCode 中正确链接,并且操作系统在尝试加载 kext 时不会解决依赖关系。

整个事情的背景是三星制造了一个液晶相框,可以作为第二个显示器;唯一的问题是它不是 DisplayLink 或任何其他已知协议——仅限 Windows 的驱动程序会输出一个自定义标头,并且每个帧都被编码为 JPEG 并发送到设备。我的实现是为 OS X 做的,但我使用了 libusb,因为它是一个帧缓冲设备,需要在启动时加载——想要更多地处理驱动显示器而不是热插拔检测和 IOKit 的 USB 设备要求。

谢谢你的帮助!你们真棒。

0 投票
1 回答
678 浏览

macos - 在 OS X 中使用 launchd 加载和配置内核扩展

我正在为套接字过滤编写网络内核扩展。为了使其可配置,用户态程序读取配置文件并通过PF_SYSTEM套接字将信息传递给 kext。

如果我想在系统启动时尽快启动并运行套接字过滤器,我将如何设计启动?

我目前的想法是使用 launchd 来启动一个小的用户空间初始化程序。该程序将用于kextload启动 kext。之后,它将读取配置文件并通过PF_SYSTEM套接字与 kext 对话。完成工作后,它会迅速退出。

另一种选择是有两个launchd项目,一个用于 kext(使用kextload),另一个用于用户区配置文件阅读器。这将避免分叉,但否则将是相同的。无论哪种方式,launchd都必须运行一个快速的非守护程序用户空间程序。

然而,launchd似乎是为了启动实际的守护进程,而不是为了完成工作和退出的快速任务。开发人员库文档说:

重要提示:如果您的守护程序在启动后关闭得太快,launchd 可能会认为它已经崩溃。继续这种行为的守护进程可能会被挂起,并且在未来的请求到达时不会再次启动。为避免此行为,请在启动后至少 10 秒内不要关闭。

这给我的印象launchd是这样做不是正确的方法。我应该如何组织发布?我的整个想法是否朝着错误的方向发展?

(作为旁注,我想让用户也可以在运行时更改过滤选项。我想这可以通过在需要更改时打开到 kext 的新 PF_SYSTEM 套接字连接来完成。)

0 投票
0 回答
298 浏览

macos - 从 Lion 中的 IOAudio kext 调用 proc_selfppid()

我有一个基于 Apple 的 AudioReflectorDriver 示例代码的 kext(它拦截音频输出并制作副本)。

在 <= 10.6 上,当您在 IOAudioEngine 子类中调用 proc_selfpid() 时,它会报告生成音频的进程的 PID。在 10.7 上,它始终将 coreaudio_d 报告为进程。

发生了什么变化?有谁知道苹果在哪里记录了这一变化?有什么方法可以在 Lion 中获取原始进程 ID?

更新……一位 Apple DTS 工程师告诉我:

Audio HAL 完全用 Lion 重写,这种变化几乎可以肯定是这种努力的副作用。我不认为这是故意的更改,而是由 CoreAudio 中更大的架构更改驱动的。严格来说,我不相信 proc_selfpid 曾被记录为在音频上下文中返回有用的东西,因此完全有可能这些信息不再可用。

[……]

问题不在于内核返回了错误的 pid,而是 CoreAudio 的架构发生了变化,使得音频来自不同的进程。

如果有任何方法可以在 10.7 中获取此信息,仍在等待他的回复。

我现在怀疑它没有被记录,因为重写没有改变 API。

0 投票
1 回答
320 浏览

c++ - 覆盖另一个kext定义的方法?

我需要重写一个由 kext 定义的方法来进行我自己的处理并返回我自己的值,所以每当 kext 调用该方法时,它都会被路由到我的。所以我要做的就是在我自己的内核扩展中定义这个方法,然后加载它。问题是我不知道如何交换方法,所以我的方法被调用了

是否有捷径可寻?我知道有一种方法可以通过VTables来实现,因为所有内核扩展都在同一个地址空间中运行(我认为这是唯一的方法,但我不确定如何去做)。