-
Notifications
You must be signed in to change notification settings - Fork 4
What is **(void***)originalPresentAddress?
basicHook.cpp
の中に以下のような行があります。
REGISTER_HOOKはマクロですが、第一引数のオブジェクトはMH_CreateHook関数の第一引数に渡される、いわゆる「フックのターゲット関数」となります。
結論から言うと、第一引数はターゲット関数のベースアドレスです。
// Macro in order for hooking and saving original function.
REGISTER_HOOK(**reinterpret_cast<void***>(originalPresentAddress), &hkPresent, &oPresent)
REGISTER_HOOK(**reinterpret_cast<void***>(originalResetAddress), &hkReset, &oReset)
この**reinterpret_cast<void***>(originalResetAddress)
などというのは何を表してるのかをメモリービューで見てみましょう。
まず以下の3つを出力してみました。
ちなみに1行目のreinterpret_cast<void***>(originalResetAddress)
というのは、originalResetAddressをvoid***でキャストした物です。void***にキャストした段階では、「2回までデリファレンス可能な何か」というただの定義であり、void*でキャストした物と価は何ら変わりありません。
//std::cout << reinterpret_cast<void*>(originalResetAddress) << std::endl; // 0x709FBA49
std::cout << reinterpret_cast<void***>(originalResetAddress) << std::endl; // 0x709FBA49
std::cout << *reinterpret_cast<void***>(originalResetAddress) << std::endl; // 0x70ADA728
std::cout << **reinterpret_cast<void***>(originalResetAddress) << std::endl; // 0x714E0700
まず1つめの出力結果0x709FBA49
をメモリビューで見てみましょう。
以下の紫のラインが該当の箇所です。
これをデリファレンスした結果が以下です。0x70ADA728
は0x709FBA49
が保持していたアドレスでしたね。そしてどうやらこれはv-tableっぽいです。
余談ですが実は二個目の0x70ADA72C
はPresent関数のポインタです。
もう一度デリファレンスしてみます。 少し空白が目立ちますが、これは関数のようです。
この0x714E0700
というアドレスが、今回REGISTER_HOOKの第一引数に渡しているもの、つまり**reinterpret_cast<void***>(originalResetAddress)
ですね。最初に言った通り、関数のベースアドレスでした。
void***を二回キャストしているのでこれはvoid*型のオブジェクトです。このベースアドレスから始まる関数の大きさが不明だからだと思います。
ちなみにPresent関数の方も全く同じような構造です。