macos - 通过替换为 NOP 来修补 CALLL 在用户空间中有效,但在内核空间中无效

标签 macos assembly x86 stack patch

我有一个想要修补的设备驱动程序。 该设备驱动程序调用 IOLog,我想摆脱日志记录。

如果我用设备驱动程序 (kext) 内的(相应数量的)NOP 替换对 IOLog 的 CALLL,则内核会崩溃,堆栈看起来像是 splinter 的(“Backtrace 终止 - 无效帧指针 0”)。

然而,同样的技术在用户空间中工作得很好(例如,在 OS X 二进制文件中 NOPping NSLogs)。

我在这里缺少什么?

最佳答案

您没有解释是否进行冷补丁(磁盘上的驱动程序)或热补丁(内存中的驱动程序)。对于内存中修补,可能存在各种问题,例如修补驱动程序时执行的驱动程序、缓存部分代码的 CPU 等。请参阅 Intel 手册中有关自修改代码的部分。

对于磁盘上修补,您可能有目标地址的重定位记录。因此,当驱动程序加载时,动态模块加载器将修复代码中IOLog的地址,将其替换为真实地址。这将覆盖您的 nop 指令。

关于macos - 通过替换为 NOP 来修补 CALLL 在用户空间中有效,但在内核空间中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/261021/

相关文章:

assembly - 获取组装说明的大小

android - OSX 小牛 : Run anddroid SDK from an external hard drive (different from the default Machintosh HD)

ios - "UserNotificationsUI"在构建 UIKit for Mac 错误时不可用

macos - SwiftUI - 更改光标

assembly - 如何将浮点常量移动到 FP 寄存器中?

assembly - 如何让 `mov rdx, symbol` 移动符号值而不是 clang intel-syntax 中符号地址处的值?

c - 反汇编函数名称后的数字是什么意思?例如<do_magic + 197>

debugging - EDB - 如何调试以 i/o 重定向作为参数的程序?

ruby-on-rails - 在OS X 10.9上安装OpenCV失败

linux - Linux如何处理TSS结构中的I/O权限位图?