如何正确调用 thiscall 函数,并将其作为 mfc 控件

How to properly call a thiscall function with this being an mfc control

本文关键字:mfc 控件 调用 何正确 thiscall 函数      更新时间:2023-10-16

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

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

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

#include <afxtabctrl.h>
typedef int(__thiscall *TestFuncDef)(CMFCTabCtrl, int, int);
TestFunc = (TestFuncDef)0x76FDF3;

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

所有这些都是新的,所以如果这是一个愚蠢的问题,我深表歉意。谢谢。

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

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

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

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

您也可以创建一个大小大致正确的结构,并将其作为 this 指针传递并查看会发生什么,只需确保 vtable 指针指向正确的 vtable,以便这些函数正确解析即可。 有时,如果它不依赖于具有正确值的成员变量,则此方法可以正常工作。