3

kextによって定義されたメソッドをオーバーライドして、独自の処理を実行し、独自の値を返す必要があるため、kextがメソッドを呼び出すたびに、メソッドは自分のメソッドにルーティングされます。ですから、私がやりたいのは、このメソッドを自分のカーネル拡張で定義してからロードすることです。問題は、メソッドを交換する方法がわからないため、代わりに私のものが呼び出されることです。

/* basically, I need to override the isPinDigital method of AppleHDAPathSet */
AppleHDAPathSet::isPinDigital(void) 
{
     /* I also need to be able to call the superclass' method */

     /* return my own value */
     return 0;
}

これを行う簡単な方法はありますか?すべてのカーネル拡張が同じアドレス空間で実行されるため、 VTableを介してそれを行う方法があることを私は知っています(それが唯一の方法だと思いますが、それを行う方法がわかりません)。

4

1 に答える 1

2

これは、vtableをハッキングすることで確実に達成できますが、具体的な方法はわかりません。C++kextのロードおよびアンロードメカニズムがvtablesとvtableのバージョン管理を管理していることを私は知っています。ソースが利用可能である必要があるので、それを見てください。

ただし、vtableパッチは実際には最後の手段である必要があります。サブクラス化によってこれを達成することはできませんAppleHDAPathSetか?これがIOKitパーソナリティクラスではないと仮定すると、それもサブクラス化し、サブクラス化されたパーソナリティのプローブスコアがベースよりも高くなるようにinfo.plistを設定する必要があります。probe()ハックをisPinDigital適用する必要があるかどうかをメソッドで決定します。次に、オブジェクトを最初にインスタンス化したメソッドをオーバーライドAppleHDAPathSetし、代わりにサブクラス化されたバージョンのインスタンスを作成します。

于 2011-08-22T15:46:17.937 に答える