代码之家  ›  专栏  ›  技术社区  ›  diciu

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

  •  2
  • diciu  · 技术社区  · 17 年前

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

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

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

    我在这里错过了什么?

    1 回复  |  直到 17 年前
        1
  •  3
  •   Martin v. Löwis    17 年前

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

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

    推荐文章