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