2017-02-20 7 views
1

現在、プログラムをリバースエンジニアリングして、どのように動作しているかを知り、プログラムが呼び出す関数を逆アセンブルしました。関数の開始アドレスはポインタに格納され、4つの引数をとります。私の目標は、ポインタを呼び出し可能な関数としてキャストすることです。C++はポインターを呼び出して呼び出し可能な関数に変換します

これは1年または2年前に行われたものですが、使用されたサンプルコードにアクセスできなくなりました。基本的に、私は、関数の開始を指すポインタを取り、これに変換したい:

void AddValueToMain(void* basePtr, unsigned int value, __int64 compareValue, __int64 ONE_BILLION); 

それはC++で書かれたかのように、私は関数を呼び出すことができるように、私はこのポインタをキャストすることができますどのように?

+0

が、コンパイラに依存する:

auto AddValueToMain = reinterpret_cast<void(*)(void*,unsigned int,__int64,__int64)>(m_ptr); 

今、あなたは、通常の関数のようAddValueToMainを呼び出すことができます。m_ptrは関数へのポインタを保持していると仮定すると。あなたは、ファンクタへのポインタのような何らかの代替手段が必要です。 – user1095108

答えて

4

reinterpret_castを関数ポインタに割り当てることができます。これは可能かもしれない

AddValueToMain(ptr, 42, 2, 4); 
+0

ありがとう!それに加えて、関数の基本アドレス(0xDEADBEEFDEADBEEFとしましょう)があれば、 'auto AddValueToMain = reinterpret_cast のようにキャストすることもできます0xDEADBEEFDEADBEEF) ' – w0ffen

+0

うん。整数とポインタの間のマッピングは実装定義されていますが、もしあなたのプラットフォームがそれをサポートしていれば、それはあなたが望むものを得る方法です。 – TartanLlama

関連する問題