電子書籍の厳選無料作品が豊富!

関数をメモリにマッピングしてみたいのですが質問させてください。

C言語で以下のようなプログラムを完全に趣味で作って遊んでみました。

まぁ当然のことながらエラーで落ちてしまうのですが(関数ポインタと変数のポインタはメモリの位置が違うので当然と言えば当然なのですが)どうにかしてこんな感じのことをやる方法ってないですかね?



#include <memory.h>

typedef void ( *LPTESTFUNC )();

void test(){}

main()
{
#define BUFFER_SIZE 100

  char buffer[BUFFER_SIZE]={0};

  memcpy( buffer, test, BUFFER_SIZE );

  ( ( LPTESTFUNC )buffer )();
}


/**
VisualStudio2008 AcademicEdition
Windows7 64bit UltimateEdition
Core i7 920(2.67GHz)
メモリ:12GB
言語:C言語
*/

A 回答 (5件)

 こんにちは。



 「VirtualAllocEx(), PAGE_EXECUTE_READWRITE, マシン(機械)語実行」のキーワードで検索すればある程度は出てくるかと。
 http://d.hatena.ne.jp/kenjiaiko/20071126

 この他にも色々出てきますが、大抵の場合はDLLインジェクションを目当てとして外部プロセスに実行させるコードです。
 気長に探せば、もっと見つかるかもしれません。
    • good
    • 0

組込系ではよくやることです


なぜなら限られた空間(メモリ)の中で
効率よく配置しなければならないですから

しかしそうでもなければ
OSが勝手に配置します
それに反するようなやり方は蹴られて当然でしょう 笑
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/21 17:25

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/21 17:26

関数プログラムの実体を別のメモリ領域にコピーして、


そこで実行したいということですか?

このままでは無理だと思いますが、なぜこのようなことをしたいのか
(このようなことをすると何が便利になるのか)を説明してもらうと、
その目的を実現するための他のよい方法をアドバイスをしてくれる人が
現れるかもしれません。

少なくとも質問の例は、コピー前と同じ関数を実行するだけなので、
もしこれができたとしても、元の関数ポインタを使って呼び出すのと
比べて何もメリットがありません。
    • good
    • 0
この回答へのお礼

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

DLLをメモリからマッピングできればいいのですが見つからなくて・・・

お礼日時:2010/02/21 17:28

OSの機能を借りずにやるのは…ムリじゃないですかね。


# WindowsのLoadLibrary()などが、ロードしようとした先のメモリアドレスが使用中だった場合に
# 別のアドレスに読み込むことがある。

各種アドレスを書き換えないといけませんが、ロード済みのメモリに配置された状態ではその情報が……既に失われている…かと。
# 相対アドレッシングで全て済めば…あるいは……。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/21 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!