Skip to content

What is **(void***)originalPresentAddress?

S3pt3mb3r edited this page Feb 26, 2021 · 1 revision

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をメモリビューで見てみましょう。 以下の紫のラインが該当の箇所です。 figure1

これをデリファレンスした結果が以下です。0x70ADA7280x709FBA49が保持していたアドレスでしたね。そしてどうやらこれはv-tableっぽいです。

余談ですが実は二個目の0x70ADA72CはPresent関数のポインタです。 figure2

もう一度デリファレンスしてみます。 少し空白が目立ちますが、これは関数のようです。

この0x714E0700というアドレスが、今回REGISTER_HOOKの第一引数に渡しているもの、つまり**reinterpret_cast<void***>(originalResetAddress)ですね。最初に言った通り、関数のベースアドレスでした。

void***を二回キャストしているのでこれはvoid*型のオブジェクトです。このベースアドレスから始まる関数の大きさが不明だからだと思います。 figure3

ちなみにPresent関数の方も全く同じような構造です。

Clone this wiki locally