2017-10-31 18 views
0

オブジェクトファイル(msvcコンパイラによって単一のソースファイルから生成されたもの)をロードするステップは何ですか?私のプログラムのメモリにロードしてください例)、内部でコードを実行します。実行するオブジェクトファイルの動的ロード

私は大量のプログラムをロードするのに時間がかかり、ソースコードからリアルタイム修正を行いたいというケースがあります。オブジェクトファイルをロードするだけでなく、このオブジェクトファイル内のいくつかのアドレスを修正し、-hotpatch関数を使用して、すでに実行中のプロセスでコールをインターセプトし、オブジェクトファイルにリダイレクトします。

オブジェクトファイルのインポートテーブルを解決して、すでにロードされているプログラムを指すようにして、変更された関数の呼び出しを代行する必要があります。

何か不足していますか?私はそれが不可能かもしれない何かに時間を無駄にしようとする前に尋ねたいと思います!

ありがとうございます!

+0

私の理解は、オブジェクトファイルは中間表現であり、必ずしも実行可能ではないということです。オブジェクトファイルには、リンカによって解決される未解決のシンボルが含まれている場合があります。オブジェクト・ファイルを静的または動的ライブラリーと混同していますか? –

+0

ダイナミックライブラリを使用する必要があります。オペレーティングシステムは、オンデマンドで、または起動時にこれらをプログラムにロードできます。ライブラリには実行可能コードが含まれており、一般的に未解決の外部参照はありません。 –

+0

実際には、すでにロードされているプログラム内のアドレスへの参照を解決したいのです。私は実行可能ファイル全体を再リンクしたくありません。そして、私はLoadLibrary関数を使いたくありません。 – GuillaumeGwi

答えて

0

直接質問(objファイルの読み込みと実行について)に答えるには、本質的にリンカを書き直すことになります。それは不可能ではありません。

目的の使用方法:objファイルを動的にロードして実行しても、すでに実行中のプロセスでコールを傍受することはありません。あなたが欲しいのはおそらくフックです。多くの方法があります(真剣には、たくさんあります)。 Detoursはこれを達成するための多かれ少なかれ公式な方法ですが、ここではスペクトルのエキゾチックな側面からいくつかの方法のpresentationです。

+0

フックについてはかなり簡単ですが、試したことはありませんが、古い関数のjmpを新しい関数に書き込むようです。私は、このトリックを行うと思われるInterceptAPIという名前のコードをいくつか持っています。しかし、再びそれをテストしたことはありませんので、うまくいきたいと思います。D – GuillaumeGwi

+0

オリジナルの関数をパッチ(または他の場所)から呼び出すつもりがない場合には簡単です。もしあなたがそうであれば、おそらく話題についてもう少し読むべきです –

+0

トランポリンと呼ばれるいくつかのテクニックを見たことがありますが、私は古い機能を更新されたコードに置き換えたいからです。 – GuillaumeGwi

関連する問題