c++ - 如何正确调用 thiscall 函数,这是一个 mfc 控件

标签 c++ mfc function-pointers dll-injection

所以我有一个注入(inject)的 DLL,并且我正在尝试使用以下签名调用 thiscall 函数:

int __thiscall sub_76FDF3(CMFCTabCtrl *this, int, int)

根据我读到的内容,我可以创建一个函数指针并直接调用它,因此我为该函数创建了一个 typedef:

#include <afxtabctrl.h>

typedef int(__thiscall *TestFuncDef)(CMFCTabCtrl, int, int);
TestFunc = (TestFuncDef)0x76FDF3;

现在我挠头想知道我是否必须找到真正的 tabctrl 'this',然后以某种方式将其转换为 CMFCTabCtrl 以便能够实际调用传递我自己的 int 参数的函数?

对于这一切都是新手,所以如果这是一个愚蠢的问题,我深表歉意。谢谢。

最佳答案

您的代码对于调用 _thiscall 函数是正确的,通过将函数指针定义为 __thiscall 并将 this 指针作为第一个参数传递,它将正确地将其放入 ECX 中,并且只要 this 指针指向,一切都应该正常工作到正确类型的有效对象。

您需要在内存中找到一个对象并将其地址作为 this 指针传递。如果找不到正确的对象,那么您可以尝试找到正确的构造函数,调用构造函数并将返回值作为 this 指针传递。

要找到构造函数,请对该类的其他虚拟表函数进行逆向工程,并尝试查找看起来像是初始化成员变量的代码行。

如果你想找到真实的对象,你可以挂接 vtable 函数并复制 this 指针,本质上是创建该类型的对象列表。然后您可以尝试使用这些。

您还可以创建一个大约正确大小的结构,然后将其作为 this 指针传递,看看会发生什么,只需确保 vtable 指针指向正确的 vtable,以便这些函数正确解析。有时,如果它不依赖于具有正确值的成员变量,则效果很好。

关于c++ - 如何正确调用 thiscall 函数,这是一个 mfc 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205986/

相关文章:

C++ - enum vs. const vs. #define

c++ - 获取引用指向的对象的地址

visual-c++ - 如何中止使用 wininet 发送的请求?

c++ - C函数指针参数打印问题

c++ - 结构体中的函数指针

c++ - 我可以在预处理器和编译器之间压缩我自己的程序吗?

c++ - 涵盖接口(interface)的Makefile(.h文件)

c++ - 如何在MFC中的每个CPropertyPage上OnInitDialog?

c++ - ON_BN_CLICKED 调用非成员函数

c++ - 为什么不对这些函数签名进行相同的处理?