2011-09-11 24 views
1

私はクラスオブジェクト内の仮想関数を適切にフック/迂回しようとしていましたが、別の関数を呼び出すという点では成功しましたが、間違ったことをする必要があります関数にキーワードがどのように渡されるかの条件。仮想関数のフック/ディテール

同様の方法でD3D関数をフックする方法についての記事を読んで、コンパイラがint Class::method(int)などの関数をint method(Class* this, int)に変換すると述べましたが、vtableのアドレスをそのように定義された関数、 'this'のアドレスが間違っているため、おそらく正しくありません。

メンバー関数はコンパイラによってどのようにレイアウトされているのですか?メンバー関数ではない形式で表現でき、vtableのアドレスをそのような関数に設定し、適切な関数を参照できるようになりますオブジェクト?

答えて

1

あなたの関数をthiscallと定義する必要があります。これはecxレジスタにthisを渡します。あなたがそれをやったやり方では、関数はスタック上にthisがあり、おそらく別の引数に属する間違った値を読んでいると予想していました。

+0

私は以前これをやろうとしましたが、コンパイラーはthiscallで非静的非メンバー関数を指定することができないと言いました。私が言及したように関数を指定したとき、私は実際に引数名として 'this'キーワードを使用しませんでした。ローカル変数を指定し、その値を 'ecx'レジスタからrawアセンブリ作業まで設定するのですか?私は実際のメンバ関数で 'Class * obj = this'のようなもののアセンブリがどのように見えているのかを見て、それを複製しようとします。 – Jengerer

+0

うーん、期待通りに動作しませんでした。なぜなら、 'thiscall'規約のない関数は、最初に' ecx'レジスタをクリアしているからです。私は別のクラスを定義し、より良い方法がない限り、代わりに 'thiscall'を保持するためにvtableでその関数を使用しなければならないと思います。 – Jengerer

+0

これでうまくいかない場合は、ダミークラスを作成して後でキャストすることができます。あなたが言ったように、もう一つのオプションは、すべてのアセンブリコードを入れています。これは、[裸](http://msdn.microsoft.com/en-us/library/5ekezyy2(v = VS.71).aspx)関数で行うことができます。 – kichik