パッチを適用したいデバイスドライバがあります。このデバイスドライバーはIOLogを呼び出し、ログを削除したいと思います。
CALLL to IOLogをデバイスドライバー(kext)内の(対応する数の)NOPに置き換えると、カーネルがクラッシュし、スタックが破壊されたように見えます(「バックトレースが終了しました-無効なフレームポインター0」)。
ただし、同じ手法がユーザースペースで正常に機能します(たとえば、OS Xバイナリ内のNSLogをNOPpingします)。
ここで何が欠けていますか?
コールド パッチ (ディスク上のドライバー) を行うのか、ホット パッチ (メモリ内のドライバー) を行うのかについては説明していません。インメモリ パッチの場合、パッチを適用したときにドライバーが実行される、コードの一部がキャッシュされている CPU など、あらゆる種類の問題が存在する可能性があります。自己修正コードに関する Intel マニュアルのセクションを参照してください。
オンディスク パッチの場合、ターゲット アドレスの再配置レコードがある可能性があります。そのため、ドライバーがロードされると、動的モジュール ローダーがコード内の IOLog のアドレスを修正し、実際のアドレスに置き換えます。これにより、nop 命令が上書きされます。