2

たくさんの関数を含むバイナリデータがあり、そのうちの1つを呼び出したいと思います。これらの関数の署名と、ファイルの先頭からの相対的なオフセットを知っています。呼び出し規約がデフォルトです:__cdecl。ファイルは、実行権限のあるメモリページにすでにロードされています。

たとえば(、、、Aいくつかのタイプです)BC

void myFunction (A *arg1, B arg2, C arg3); // Signature
int myOffset = 0x42; // Offset

どうすればそのmyOffsetポイントを指定できますmyFunctionか?

4

4 に答える 4

6
// define a function pointer
typedef __cdecl void (*your_function) (A *arg1, B arg2, C arg3); 
your_function ftr;

char * memory = 0x123456; // base segment address

fptr = (your_function)(memory + 0x42); //calculate memory address

(*ftpr)(a,b,b); // call function
于 2009-10-17T09:41:36.637 に答える
4

あなたが何を求めているのかよくわかりません。関数ポインタを宣言し、関数ポインタを任意のアドレスに割り当てようとしていると仮定します。

関数ポインタを宣言するには、

void (*p)(A*,B,C);

割り当てるには、

p = (void (*)(A*,B,C)))0x42;

関数を呼び出すには、

p(a,b,c) or (*p)(a,b,c);
于 2009-10-17T09:39:43.490 に答える
3

質問自体については、バイナリをロードしたメモリにアドレスを追加するだけです。つまり、アドレスにバイナリをロードした場合は、myLoadAddressそれをに追加するだけmyOffsetです。ただし、これでは関数を簡単に呼び出すことはできません。これを行う場合は、ライブラリファイルのように扱う必要があります(実際にライブラリファイルである場合は、WindowsでLoadLibraryなどのライブラリをロードするためのシステム関数をチェックし、 GetProcAddressを使用して関数へのポインタを取得します)。

// create a type for your function signature
typedef void (*myFunc)(A *arg1, B arg2, C arg3);
// create a pointer to your function
myFunc myFuncPointer;
// set the address of the function in memory
myFuncPointer = myLoadAddress + myOffset;
// invoke function
myFuncPointer(A, B, C);

DLLをロードするときは、LoadLibraryを使用してロードし、次にGetProcAddressを使用して、関数ポインターに返されたアドレスを型キャストしますmyFuncPointer = (myFunc)GetProcAddress(hmodule, "myFunc");(例では)。

POSIXでもほとんど同じように機能しますが、関数は少し異なりますdlopen。ダイナミックライブラリのロードとdlsymシンボルの取得に使用します。プログラミングライブラリのハウツーでは、これについて詳しく説明しています。または、dlopendlsymのマニュアルページを参照してください。基本は同じです。

于 2009-10-17T09:45:34.480 に答える
1
( (void(*)(A*,B,C))0x42 )(a,b,c);

またはそのようなもの。初めてそれを取得するのにいつも問題がありました。それは、とにかく、私があなたの質問を正しく理解している場合です。

于 2009-10-17T09:38:09.980 に答える