web-dev-qa-db-ja.com

C / C + +のメモリ内のアドレスを介して関数を呼び出す

関数のプロトタイプとそのメモリ内のアドレスについての知識があれば、この関数を、プロトタイプとメモリアドレスしか知らない別のプロセスまたはコードの一部から呼び出すことはできますか?可能であれば、返された型をコードでどのように処理できますか?

29
dtech

最新のオペレーティングシステムでは、各プロセスに独自のアドレススペースがあり、アドレスはプロセス内でのみ有効です。他のプロセスでコードを実行する場合は、injected a shared libraryまたはデバッガとしてプログラムをアタッチします

他のプログラムのアドレス空間に入ると、このコードは任意のアドレスで関数を呼び出します

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
48
sbi

はい-関数ポインタを記述しています。これが簡単な例です。

int (*func)(void) = (int (*)(void))0x12345678;
int x = func();

プロセス間では機能しない可能性があります。ほとんどのオペレーティングシステムでは、プロセスは互いのメモリにアクセスできません。

14
Carl Norum

直接電話が必要な場合:

((void(*)(void))0x1234)();
7
Ulfhetnar

以前のすべての答えはいいですが、長すぎます;-):

int i = ((int (*)(void))0xdeadbeef)();
2
Fuujuhi

ほとんどのOPでは、すべてのプロセスに独自のメモリがあるため、それはできません。

サンプルコード:a.c:

#include <stdio.h>

int r() {return 2;}
int main() {
    printf("%p\n",r);
    while(1);
}

紀元前:

#include <stdio.h>

int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d\n",a);
return 0;
}

これはセグメンテーション違反を取得します。

1
asaelr

間違いなく可能ですが、制限があります。各プロセスには、他のプロセスが干渉できない独自のメモリブロックがあります。今、あなたは気づくでしょう、私はそれが間違いなく可能であると書いた、これはDLLインジェクション(またはコードインジェクション)によるものです。

Typedefキーワードを使用してこれを実現できます。回答を「回答済み」とマークしました。問題は解決したようです。これは、興味を持つ可能性のある他の人への通知にすぎません。

0
XxMulti GamerxX