我有一个想要修补的设备驱动程序。 该设备驱动程序调用 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/