Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个要修补的设备驱动程序。此设备驱动程序调用 IOLog,我想摆脱日志记录。
如果我用设备驱动程序 (kext) 中的(相应数量的)NOP 替换 CALLL 到 IOLog,内核会崩溃,看起来像一个破碎的堆栈(“Backtrace 终止 - 无效帧指针 0”)。
然而,相同的技术在用户空间中工作得很好(例如,在 OS X 二进制文件中 NOPping NSLogs)。
我在这里想念什么?
您没有解释您是进行冷补丁(磁盘上的驱动程序)还是热补丁(内存中的驱动程序)。对于内存中的修补,可能存在各种问题,例如修补时正在执行的驱动程序、具有缓存部分代码的 CPU 等。请参阅 Intel 手册中有关自修改代码的部分。
对于磁盘上的修补,可能是您有目标地址的重定位记录。所以当驱动加载时,动态模块加载器会在代码中修复IOLog的地址,替换为真实地址。这将覆盖您的 nop 指令。