2017-04-20 1 views
1

인터페이스가 얻어지고, 메소드가 호출된다 : 어셈블리C++에서 인터페이스에 대한 포인터의 주소를 찾는 방법은 무엇입니까?

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

그것은이다 ECX이다

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

가 VMT 포인터이다 [ECX는 + offset_Show]에있어서 표시된다. offset_Show를 얻는 방법, 가능한 한 높은 수준을 유지하는 것이 바람직합니다. pFileOpen-> 포인터가 컴파일 가능하지 않음을 보여줍니다.

+0

를 사용하여 마이크로 소프트의을 offsetof() 매크로. https://msdn.microsoft.com/en-us/library/dz4y9b9a.aspx –

+0

shobjidl.h를 #include하기 전에 CINTERFACE를 # 정의해야합니다. 그런 다음 vtbl 선언과 offsetof (IFileDialogVtbl, Show)에 액세스 할 수 있습니다. 작동합니다. 그러나 그것은 프로그램의 나머지 부분에 매우 혼란 스럽습니다. Google은 해킹을 위해 "vtbl에서 가상 함수의 오프셋을 얻습니다." –

답변

0

주소를 정상적인 기능으로 가져 오려면 function pointers을 사용할 수 있습니다. 클래스 메소드에 함수 포인터를 가져 오는 것에 대해서는 this Stackoverflow post을 참조하십시오. compilability는 VMT 오프셋 얻을 별도의 C 소스를 필요 found.For &pFileOpen

+1

적어도 MSVC10에서는 인터페이스와 호환되지 않습니다. void * pShow = & pFileOpen-> Show; 원인 "오류 C2276 : '&': 바인딩 된 멤버 함수 식에서 잘못된 연산". Intellisence : "바운드 기능은 통화에만 사용할 수 있습니다". 주소는 실제로 호출 직전에 미리 계산되지 않고 미리 알려지지 않지만 오프셋은 하드 코드됩니다. 올바르게 작동하는 구문을 제안하십시오. – user3874158

+0

int offs = offsetof (IFileOpenDialog, Show); - 같은 오류. 유사한 기사 및 그들은 불가능하다는 것을 쓴다 : http://stackoverflow.com/questions/2125862/virtual-functions-table-offset. – user3874158

+0

문제를 올바르게 이해하면 [이 질문에 대한 답변] (http://stackoverflow.com/questions/24649208/get-the-real-addressor-index-in-vtable-of-virtual-member-function) 당신을 해결책으로 이끌 수 있습니다. – adanmoran

1

솔루션 :

인터페이스 istelf에 대한 포인터의 주소는 코드에서 무슨 짓을했는지 정확히이다.

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); 
} 
관련 문제