通过替换NOP来修补CALLL可以在用户空间中工作,但不能在内核空间中工作

StackOverflow https://stackoverflow.com/questions/261021

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

如果我用设备驱动程序(kext)中的(相应数量的)NOP替换CALLL到IOLog,内核会崩溃,看起来像一个破碎的堆栈(“Backtrace terminate-invalid frame pointer 0”)。 / p>

然而,相同的技术在用户空间中工作正常(例如,OS X二进制文件中的NOPping NSLog)。

我在这里缺少什么?

有帮助吗?

解决方案

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top