関数のプロトタイプとそのメモリ内のアドレスについての知識があれば、この関数を、プロトタイプとメモリアドレスしか知らない別のプロセスまたはコードの一部から呼び出すことはできますか?可能であれば、返された型をコードでどのように処理できますか?
最新のオペレーティングシステムでは、各プロセスに独自のアドレススペースがあり、アドレスはプロセス内でのみ有効です。他のプロセスでコードを実行する場合は、injected a shared libraryまたはデバッガとしてプログラムをアタッチします。
他のプログラムのアドレス空間に入ると、このコードは任意のアドレスで関数を呼び出します:
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
はい-関数ポインタを記述しています。これが簡単な例です。
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
プロセス間では機能しない可能性があります。ほとんどのオペレーティングシステムでは、プロセスは互いのメモリにアクセスできません。
直接電話が必要な場合:
((void(*)(void))0x1234)();
以前のすべての答えはいいですが、長すぎます;-):
int i = ((int (*)(void))0xdeadbeef)();
ほとんどの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;
}
これはセグメンテーション違反を取得します。
間違いなく可能ですが、制限があります。各プロセスには、他のプロセスが干渉できない独自のメモリブロックがあります。今、あなたは気づくでしょう、私はそれが間違いなく可能であると書いた、これはDLLインジェクション(またはコードインジェクション)によるものです。
Typedefキーワードを使用してこれを実現できます。回答を「回答済み」とマークしました。問題は解決したようです。これは、興味を持つ可能性のある他の人への通知にすぎません。