C++ 如何从二进制数据调用函数

C++ 如何从二进制数据调用函数,c++,function-pointers,C++,Function Pointers,我有一些二进制数据,其中包含一组函数,我想调用其中一个。 我知道这些函数的签名以及相对于文件开头的偏移量。调用约定是默认约定:\uu cdecl。 该文件已加载到具有执行权限的内存页中 例如(A,B,C是一些类型) 如何指定myOffset指向myFunction ( (void(*)(A*,B,C))0x42 )(a,b,c); 或者类似的。在第一次得到它时总是有困难。无论如何,如果我对你的问题理解正确的话。我不太清楚你在问什么。我假设您试图声明一个函数指针,并将一个函数指针分配给某个任意地

我有一些二进制数据,其中包含一组函数,我想调用其中一个。 我知道这些函数的签名以及相对于文件开头的偏移量。调用约定是默认约定:
\uu cdecl
。 该文件已加载到具有执行权限的内存页中

例如(
A
B
C
是一些类型)

如何指定
myOffset
指向
myFunction

( (void(*)(A*,B,C))0x42 )(a,b,c);

或者类似的。在第一次得到它时总是有困难。无论如何,如果我对你的问题理解正确的话。

我不太清楚你在问什么。我假设您试图声明一个函数指针,并将一个函数指针分配给某个任意地址

要声明函数指针

void (*p)(A*,B,C);
为了分配它

p = (void (*)(A*,B,C)))0x42;
要调用函数

p(a,b,c) or (*p)(a,b,c);

对于问题本身:您只需要在加载二进制文件的内存中添加地址。也就是说,如果您将二进制文件加载到地址
myLoadAddress
,只需将其添加到
myOffset
。然而,这并不能使您轻松地调用该函数。如果要这样做,应将其视为库文件(如果它实际上是一个库文件,请检查是否有系统函数用于在Windows上加载库,然后使用以检索指向该函数的指针)

加载DLL时,使用LoadLibrary加载它,然后使用GetProcAddress并键入返回到函数指针的地址——即
myFuncPointer=(myFunc)GetProcAddress(hmodule,“myFunc”)


在POSIX上,其工作原理基本相同,但功能略有不同:使用
dlopen
加载动态库,使用
dlsym
检索符号。将对此进行更详细的描述,或参阅和的手册页。基本原理是一样的。

我不是专家,但我认为如果调用_cdecl函数,如果您的程序需要_stdcall,堆栈将泄漏。默认值应为u stdcall u stdcall用于WINAPI函数__cdecl是其他功能的标准。请看@Etan我也有类似的问题,想知道你是如何得到所有例程的偏移量的。。。请帮忙@达拉·达吉:例如,您可以对例程的有效负载执行模式扫描。为了更准确地回答您的问题,您需要提供更多的上下文。@Etan谢谢。。。我发现在我的定义中。。很抱歉,在+1之前没有看到这是一个很好的例子,如果您熟悉posix,您应该更新您的答案
p(a,b,c) or (*p)(a,b,c);
// 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
// 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);