C++ では、メンバー関数のアドレスを取得することで関数ポインターを簡単に作成できます。しかし、そのローカル関数のアドレスを変更することは可能ですか?
つまり、同じクラスに funcA() と funcB() があり、定義が異なるとします。funcA() のアドレスを funcB() のアドレスに変更して、実行時に funcA() を呼び出すと実際に funcB() が呼び出されるようにしようとしています。私はこれが醜いことを知っていますが、私はこれを行う必要があります、ありがとう!
編集 - - - - -
私がやろうとしていることの背景:
既存のコード ベースの単体テストを実装したいと考えています。すべてのモジュールが継承している基本クラスのメソッドの一部は非仮想です。製品コードを編集することは許可されていません。ビルドプロセスをいじって、関連するメソッドを仮想に設定した基本クラスに置き換えることができますが、このようなハックを使用したいと思いました(可能だと思いました)。
また、私は技術的な好奇心からこのトピックに興味があります。この問題をハックしようとするプロセスを通じて、コード生成や関数検索などの仕組みが内部でどのように機能するかについてかなりのことを学んでいるからです。大学2年を終えたばかりで、学校で学ぶ機会がありませんでした。私はCSではなくコンピュータ工学プログラムにいるので、学校でそのようなことを教えられるかどうかはわかりません.
トピックに戻る メソッド funcA() と funcB() は確かに同じ署名を持っているため、問題は & 演算子を使用して関数のアドレスしか取得できないことです? 関数のアドレスを変更したり、メモリの一部を破損することなくそのアドレスの内容をスワップアウトしたりできないというのは正しいでしょうか? 関数が dll にエクスポートされている場合、DLL インジェクションはこのような状況に適したアプローチでしょうか?