gpt4 book ai didi

c - 通过 func ptr 间接将参数推送到函数

转载 作者:行者123 更新时间:2023-11-30 16:53:09 27 4
gpt4 key购买 nike

假设我有一个函数

inline PVOID CallFunc(PVOID Dll, PCHAR Name, INT nArgs, ...)
{
va_list Args;
va_start(Args, nArgs);
ULONG_PTR *Params = (ULONG_PTR *) malloc(nArgs);

for(INT n = 0; n < nArgs; ++n)
Params[n] = va_arg(Args, ULONG_PTR);

PVOID Func = (PVOID)GetProcAddress(Dll, Name);

typedef PVOID (WINAPI *MyFunc)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);

MyFunc FuncPtr = (MyFunc)Func;

va_end(Args);

return ERROR;
}

基本上我想做的是创建一个可以动态调用的函数,以按函数名称调用给定 DLL 偏移量中的任何其他函数。我知道以前有通过模板实现此功能的方法,但人们制作多个模板来获取多个参数。我想要弄清楚如何做是根据需要将我想要的参数传递给函数并相应地填充它。

假设我正在调用 MessageBoxA

例如,我将以下内容传递给此函数

CallFunc(User32Address, "MessageBoxA", 4, (ULONG_PTR) NULL, (ULONG_PTR) "World", (ULONG_PTR) "Hello", (ULONG_PTR) NULL);

现在,您会看到我已经在函数本身的 typedef 中初始化了函数类型定义。我这样做是因为我不知道函数本身将采用多少个参数,如果我知道的话,我将能够通过仅分配我需要的参数数量(在本例中为 4)来初始化 typedef。

我的问题是,在通过 GetProcAddress(Dll, Name) 加载 MessageBoxA 并分配给 PVOID Function 后。使用Function中的函数偏移量,如何确定MessageBoxA包含4个参数,然后如何动态初始化typedef;知道我只需要将 4 个 ULONG_PTR 参数分配给 FuncPtr

我知道这个问题可能会让某些人感到困惑,但如果我需要澄清它的任何方面,请告诉我。

最佳答案

这是可能的,但很难做到。您所要求的内容无法直接用 C++ 完成,您必须下降到程序集层。假设您正在使用 32 位 x86(64 位 x64 更难处理),您必须:

  1. PUSHCallFunc()的每个参数值的副本放入调用堆栈,然后CALL指向的函数,然后最后从调用堆栈中删除重复的参数,如果指向的函数使用 cdecl(或类似)调用约定,要求调用者执行调用堆栈清理(您必须知道这一点)提前)。

  2. CallFunc()简单地JMP插入指向的函数中,以便它读取CallFunc()参数,就好像它们是它自己的,然后让它RET直接转到调用CallFunc()的代码。但是,CallFunc() 必须使用与指向的函数完全相同的调用约定才能使其正常工作。因此,您需要为不同的调用约定提供多个 CallFunc() 样式函数。

关于c - 通过 func ptr 间接将参数推送到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40968870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com