• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:関数をメモリにマッピングしてみたいのですが質問させてください。)

関数をメモリにマッピングする方法はあるか?

このQ&Aのポイント
  • C言語で関数をメモリにマッピングし、実行する方法はあるのか?
  • エラーで落ちてしまうが、関数ポインタと変数のポインタのメモリ位置の違いを考慮した方法があるのか気になる。
  • VisualStudio2008 AcademicEdition、Windows7 64bit UltimateEdition、Core i7 920(2.67GHz)、12GBのメモリを使用して、C言語での関数メモリマッピングの方法を探している。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

 こんにちは。  「VirtualAllocEx(), PAGE_EXECUTE_READWRITE, マシン(機械)語実行」のキーワードで検索すればある程度は出てくるかと。  http://d.hatena.ne.jp/kenjiaiko/20071126  この他にも色々出てきますが、大抵の場合はDLLインジェクションを目当てとして外部プロセスに実行させるコードです。  気長に探せば、もっと見つかるかもしれません。

その他の回答 (4)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.4

組込系ではよくやることです なぜなら限られた空間(メモリ)の中で 効率よく配置しなければならないですから しかしそうでもなければ OSが勝手に配置します それに反するようなやり方は蹴られて当然でしょう 笑

0xEF
質問者

お礼

OSに逆らう事はできないのですね(笑) 組み込み系の参考書を買って少し見てみます!ありがとうございました。

回答No.3

データ領域に実行可能なコードを配置したとしても、最近のOS・CPUでは「データ実行防止」の機能があるので、実行できないでしょう。

0xEF
質問者

お礼

OSだけでなくCPUにまでそういう機能が備わっているのですね・・・ もう少し勉強してみます。 ありがとうございました。

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.2

関数プログラムの実体を別のメモリ領域にコピーして、 そこで実行したいということですか? このままでは無理だと思いますが、なぜこのようなことをしたいのか (このようなことをすると何が便利になるのか)を説明してもらうと、 その目的を実現するための他のよい方法をアドバイスをしてくれる人が 現れるかもしれません。 少なくとも質問の例は、コピー前と同じ関数を実行するだけなので、 もしこれができたとしても、元の関数ポインタを使って呼び出すのと 比べて何もメリットがありません。

0xEF
質問者

お礼

たとえば、DLLをLoadLibraryなどつかわなわないでデータだけ引き抜いて自分で配置することができれば、暗号化したDLLなどがつかえて楽しいとかなんかちょっと調子にのっちゃっただけです。 DLLをメモリからマッピングできればいいのですが見つからなくて・・・

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

OSの機能を借りずにやるのは…ムリじゃないですかね。 # WindowsのLoadLibrary()などが、ロードしようとした先のメモリアドレスが使用中だった場合に # 別のアドレスに読み込むことがある。 各種アドレスを書き換えないといけませんが、ロード済みのメモリに配置された状態ではその情報が……既に失われている…かと。 # 相対アドレッシングで全て済めば…あるいは……。

0xEF
質問者

お礼

あるいは可能になるかもしれないという可能性が残っているかもしれないのですね! もう少ししらべてみます。 ありがとうございました。

関連するQ&A