【问题标题】:Is it possible to recover keyboard input that was done while Mac OS was starting up?是否可以恢复 Mac OS 启动时完成的键盘输入?
【发布时间】:2011-01-03 07:46:01
【问题描述】:

我想知道是否有可能找出用户在 Mac OS 启动时按了哪些键?

任何方式都可以。据我了解,没有简单的方法可以简单地挂钩应用程序/脚本以与操作系统同时开始工作和捕获击键。但也许有办法对此进行某种逆向工程?也许查看特定的日志文件或类似的东西?

任何结果都可以。基本上我感兴趣的是找出用户在操作系统启动期间按下/按住的键。可能是字符串、字符代码或十六进制,都无所谓。

更新: 在 Pekka 的建议的指导下,我找到了一个可以完成这项工作的内核扩展。在这个后续问题 - Why this keyboard intercepting kernel extension doesn’t work? 得到回答之后,它希望能够做到这一点。 :)

【问题讨论】:

    标签: macos input keyboard reverse-engineering startup


    【解决方案1】:

    我不是操作系统专家,但我认为非常、非常、非常难。我不认为这样的东西会自动记录在任何地方。

    我猜您必须查看处理startup keys 的系统部分是否可以通过某种方式访问​​,并且可以扩展以调用您定义的命令。

    想到的第二件事是让您编写某种在启动时加载的自定义设备驱动程序或启动脚本,并监听按键事件。

    【讨论】:

    • 感谢提供线索,我将开始深入研究启动脚本方向。我不会将您的答案标记为答案,我会尝试找出是否可以在操作系统启动过程中插入脚本。
    • 由于tiny.cc/TheBootProcess 在 Mac Dev 的系统启动编程主题中,设备驱动程序方法是关键。它允许尽快开始工作,只要它将与内核一起加载。虽然有些事情告诉我这并不容易,首先,捕捉所有键盘输入,其次,以某种方式将其告知系统启动后启动的应用程序。
    • 两个非常好的点 :) 我想到的另一个想法可能是查看一些可以写入系统日志并从中复制的开源低级驱动程序(与键盘无关) .要获得关于什么驱动程序是一个好主意的建议,您可以提出另一个问题。
    • 在这里和那里挖掘之后,我现在很确定所谓的“通用内核扩展”可以完成这项工作。寻找类似任务的开源实现绝对是个好主意。 Pekka 非常感谢您的指导。 :)
    • 如果您有任何兴趣,仅供参考,我已经找到了一个几乎完全满足我需要(甚至太多)的原型。虽然发现它让我问了这个问题:为什么这个键盘拦截内核扩展不起作用? (stackoverflow.com/questions/2042795/…) :D
    【解决方案2】:

    它不仅没有记录在任何地方,而且在启动过程中很长一段时间没有键盘驱动程序。所以从软件的角度来看,在这段时间里,键盘根本不存在。

    【讨论】:

    • 必须有一个非常、非常低级别的“驱动程序”(或其中一些)从一开始就运行,以便捕获启动关键命令。我记得在旧的 DOS 时代,实际上在硬件级别上听键盘非常容易。
    • 由于同一个tiny.cc/TheBootProcess,它是处理启动键命令的BootROM固件。试图侵入计算机固件本身听起来几乎是不可能的,也不是很有礼貌。 :)
    • 我认为标准键盘处理是一种中断。如果我没记错的话,应该很容易在没有任何驱动程序的情况下收听。
    • 现代 Mac 都有 USB 键盘,甚至是笔记本电脑,这比旧的 DOS 机器复杂得多。加载内核后,USB 启动还需要一段时间;观察 USB 鼠标中的 LED 一段时间,它们会熄灭很长一段时间。所以我猜在内核加载了 USB 和 HID 驱动程序并最终开始加载扩展模块之后,你就可以挂上键盘了。
    • 安德鲁,非常感谢这个提示。在我(希望)成功实现实际功能后,我还将使用外部 USB 和蓝牙键盘对其进行测试。问题是我是 MacBook Pro 用户,甚至没有考虑过外接键盘以及它们加载驱动程序链的速度可能会更慢......
    【解决方案3】:

    如何解决这个问题完全取决于您要检查 boot process 中的哪一点。

    • 如果您想尽早检查,您唯一的选择是使用 EFI(固件)环境 -- 或许您可以修改 rEFIt 来做您想做的事?
    • 固件完成后,控制权传递给 boot.efi(PPC Mac 上的 BootX)。这可能会被替换/破解,我希望源代码可以作为Darwin 的一部分提供,但我在快速检查时看不到它。
    • 之后,内核加载(您可以构建自己的内核)并使用最少的缓存驱动程序集(您可以编写驱动程序,但不确定如何将其缓存)。
    • 在那之后,各种事情或多或少地同时发生。正常驱动程序被加载,/etc/rc.local 被运行,launchd items 在 /System/Library/LaunchDaemons 和 Library/LaunchDaemons 被激活......如果你愿意等到引导过程的这个阶段,你有多种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-09
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      相关资源
      最近更新 更多