经过一番谷歌搜索后,我找到了一种修改类的 VTable 的方法,但在我的情况下,我只有一个指向我的类的指针以及一个将其转换为的接口。我需要将其中一个函数(在 DLL 中;没有源代码)重定向到我的一个函数。问题是我不知道函数在哪个索引上,所以为了找到它,我尝试扫描 VTable 以获取指向该函数的指针。
有没有办法做到这一点?
到目前为止,这是我的代码:
typedef DWORD (__thiscall *CW_FUNC)();
class ClassWriter
{
public:
PVOID m_hObj;
PVOID *__vfptr;
PVOID m_old[256];
void SetObj(PVOID hObj)
{
m_hObj = hObj;
__vfptr = *(PVOID **)hObj;
}
void AddOverride(int offset, PVOID newfunc)
{
DWORD dwNull;
m_old[offset] = __vfptr[offset];
VirtualProtect(__vfptr + offset * 4, 4, PAGE_EXECUTE_READWRITE, &dwNull);
__vfptr[offset] = newfunc;
}
int GetOffset(PVOID func)
{
for (int i = 0; __vfptr[i] != NULL; i++)
{
if (func == __vfptr[i]) return i;
}
}
CW_FUNC GetFunc(int offset)
{
return (CW_FUNC)m_old[offset];
}
};
void WINAPI ChangeFunc()
{
ClassWriter cw;
HMODULE hMod = GetModuleHandle("dll_to_change.dll");
IMyInterface *myObj = (IMyInterface*)GetProcAddress(hMod, "GetMyClass")();
cw.SetObj(myObj);
int d = cw.GetOffset(myObj->MyFunction);
cw.AddOverride(d, OverrideFunction);
}