- ベストアンサー
関数をメモリにマッピングする方法はあるか?
- C言語で関数をメモリにマッピングし、実行する方法はあるのか?
- エラーで落ちてしまうが、関数ポインタと変数のポインタのメモリ位置の違いを考慮した方法があるのか気になる。
- VisualStudio2008 AcademicEdition、Windows7 64bit UltimateEdition、Core i7 920(2.67GHz)、12GBのメモリを使用して、C言語での関数メモリマッピングの方法を探している。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 「VirtualAllocEx(), PAGE_EXECUTE_READWRITE, マシン(機械)語実行」のキーワードで検索すればある程度は出てくるかと。 http://d.hatena.ne.jp/kenjiaiko/20071126 この他にも色々出てきますが、大抵の場合はDLLインジェクションを目当てとして外部プロセスに実行させるコードです。 気長に探せば、もっと見つかるかもしれません。
その他の回答 (4)
- phoenix343
- ベストアンサー率15% (296/1946)
組込系ではよくやることです なぜなら限られた空間(メモリ)の中で 効率よく配置しなければならないですから しかしそうでもなければ OSが勝手に配置します それに反するようなやり方は蹴られて当然でしょう 笑
- m-take0220
- ベストアンサー率60% (477/782)
データ領域に実行可能なコードを配置したとしても、最近のOS・CPUでは「データ実行防止」の機能があるので、実行できないでしょう。
お礼
OSだけでなくCPUにまでそういう機能が備わっているのですね・・・ もう少し勉強してみます。 ありがとうございました。
- Lchan0211
- ベストアンサー率64% (239/371)
関数プログラムの実体を別のメモリ領域にコピーして、 そこで実行したいということですか? このままでは無理だと思いますが、なぜこのようなことをしたいのか (このようなことをすると何が便利になるのか)を説明してもらうと、 その目的を実現するための他のよい方法をアドバイスをしてくれる人が 現れるかもしれません。 少なくとも質問の例は、コピー前と同じ関数を実行するだけなので、 もしこれができたとしても、元の関数ポインタを使って呼び出すのと 比べて何もメリットがありません。
お礼
たとえば、DLLをLoadLibraryなどつかわなわないでデータだけ引き抜いて自分で配置することができれば、暗号化したDLLなどがつかえて楽しいとかなんかちょっと調子にのっちゃっただけです。 DLLをメモリからマッピングできればいいのですが見つからなくて・・・
- Wr5
- ベストアンサー率53% (2173/4061)
OSの機能を借りずにやるのは…ムリじゃないですかね。 # WindowsのLoadLibrary()などが、ロードしようとした先のメモリアドレスが使用中だった場合に # 別のアドレスに読み込むことがある。 各種アドレスを書き換えないといけませんが、ロード済みのメモリに配置された状態ではその情報が……既に失われている…かと。 # 相対アドレッシングで全て済めば…あるいは……。
お礼
あるいは可能になるかもしれないという可能性が残っているかもしれないのですね! もう少ししらべてみます。 ありがとうございました。
お礼
OSに逆らう事はできないのですね(笑) 組み込み系の参考書を買って少し見てみます!ありがとうございました。