![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
関数をメモリにマッピングしてみたいのですが質問させてください。
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言語
*/
No.5ベストアンサー
- 回答日時:
こんにちは。
「VirtualAllocEx(), PAGE_EXECUTE_READWRITE, マシン(機械)語実行」のキーワードで検索すればある程度は出てくるかと。
http://d.hatena.ne.jp/kenjiaiko/20071126
この他にも色々出てきますが、大抵の場合はDLLインジェクションを目当てとして外部プロセスに実行させるコードです。
気長に探せば、もっと見つかるかもしれません。
No.3
- 回答日時:
データ領域に実行可能なコードを配置したとしても、最近のOS・CPUでは「データ実行防止」の機能があるので、実行できないでしょう。
No.2
- 回答日時:
関数プログラムの実体を別のメモリ領域にコピーして、
そこで実行したいということですか?
このままでは無理だと思いますが、なぜこのようなことをしたいのか
(このようなことをすると何が便利になるのか)を説明してもらうと、
その目的を実現するための他のよい方法をアドバイスをしてくれる人が
現れるかもしれません。
少なくとも質問の例は、コピー前と同じ関数を実行するだけなので、
もしこれができたとしても、元の関数ポインタを使って呼び出すのと
比べて何もメリットがありません。
たとえば、DLLをLoadLibraryなどつかわなわないでデータだけ引き抜いて自分で配置することができれば、暗号化したDLLなどがつかえて楽しいとかなんかちょっと調子にのっちゃっただけです。
DLLをメモリからマッピングできればいいのですが見つからなくて・・・
No.1
- 回答日時:
OSの機能を借りずにやるのは…ムリじゃないですかね。
# WindowsのLoadLibrary()などが、ロードしようとした先のメモリアドレスが使用中だった場合に
# 別のアドレスに読み込むことがある。
各種アドレスを書き換えないといけませんが、ロード済みのメモリに配置された状態ではその情報が……既に失われている…かと。
# 相対アドレッシングで全て済めば…あるいは……。
あるいは可能になるかもしれないという可能性が残っているかもしれないのですね!
もう少ししらべてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
これて逆じゃないですか?
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
メモリを解放しないとどうなる?
-
C言語における再帰呼び出しの...
-
main関数内のローカル変数につ...
-
recvfrom関数の戻り値について
-
クイックソート
-
バッチファイルでの実行EXEのメ...
-
マインスイーパ、自動解析プロ...
-
プログラムが偶然動く
-
「ヒープサイズの設定」て何?
-
プログラムの最大メモリ消費量...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
TCP/IP通信時のサーバーからの受信
-
英語を原型で表示するプログラ...
-
VBSの処理中一旦処理を止めて再...
-
Excelでのセル内容の高速消去方法
-
プロセスIDからウィンドウハ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
ファイルマッピング関数で失敗
-
動的メモリとexit(C言語)
-
エクセルVBA 大容量CSVファイル...
-
メモリの解放の仕方
-
「ヒープサイズの設定」て何?
-
EXCEL-VBAにてADOのレコードセ...
-
LoadLibraryしたらFreeLibrary
-
マインスイーパ、自動解析プロ...
-
バッチファイルでの実行EXEのメ...
-
C言語:関数のメモリ上でのサイ...
-
エクセルのメモリ使用状況/Appl...
-
大容量のメモリ確保をスワップ...
おすすめ情報