如何找到C 接口指针的地址

How to find address of pointer to interface in C++?

本文关键字:指针 地址 接口 何找      更新时间:2023-10-16

接口,方法称为:

IFileOpenDialog *pFileOpen;
CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pFileOpen));
pFileOpen->Show(NULL);

在组装中是:

mov         eax,pFileOpen
mov         ecx,dword ptr [eax]  
mov         edx,pFileOpen
push        edx  
mov         eax,dword ptr [ecx+ offset_Show]
call        eax  

那就是eCX是指向VMT的指针,[ECX OFFSET_SHOW]是方法显示。如何在高水平上尽可能地获得Offset_show。pfileopen->显示为指针是不可编译的。

找到的解决方案。对于编译性,需要单独的c源才能在VMT中取代。

C 来源:

#include <shobjidl.h> 
#include <atlbase.h>
extern "C" int getOffsetIFileDialogVtblShow();
IFileOpenDialog *pFileOpen = ...; //get from somewhere
//pointer to VMT
unsigned char *pcFileOpen = (unsigned char *)(*(DWORD*)(unsigned char *)pFileOpen);
pcFileOpen = (unsigned char *)(*(DWORD*)pcFileOpen);
int offs = getOffsetIFileDialogVtblShow();
//pointer to Show() at pcFileOpen + offs, put hook here
fprintf(fLog,"nFileOpenDialog::IFileOpenDialog->Show at %.8X value %.8X",pcFileOpen + offs,*(DWORD*)(pcFileOpen + offs));      

c源

#include <stddef.h> //for offsetof
#define CINTERFACE
#include <shobjidl.h> 
int getOffsetIFileDialogVtblShow()
{
    return = offsetof(IFileDialogVtbl, Show);
}

要获取普通函数的地址,您可以使用功能指针。另请参见有关获取函数指针指向类方法的此堆叠式帖子。

指向接口的地址恰好是您在代码中所做的: &pFileOpen