33

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

4

6 に答える 6

57

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

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

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
于 2012-01-18T19:10:28.310 に答える
14

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

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

プロセス間ではおそらく機能しません。ほとんどのオペレーティングシステムでは、プロセスは互いのメモリにアクセスできません。

于 2012-01-18T19:09:09.453 に答える
8

直接電話が必要な場合:

((void(*)(void))0x1234)();
于 2017-11-03T17:34:20.563 に答える
7

以前の回答はすべて素晴らしいですが、長すぎます。

int i = ((int (*)(void))0xdeadbeef)();
//                      ==========     --> addr of the function to call
//        =============                --> type of the function to call
//       =========================     --> ... we get a ptr to that fct
//      =============================  --> ... and we call the function
于 2017-06-19T17:01:29.450 に答える
1

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

サンプルコード:ac:

#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;
}

これはセグメンテーション違反になります。

于 2012-01-18T19:11:46.770 に答える
0

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

typedefキーワードを使用してこれを実現できます。さて、あなたは答えを「回答済み」とマークしましたが、うまくいったようです。これは、興味を持っている可能性のある他の人への通知にすぎません。

于 2019-03-21T16:58:38.490 に答える