몇 가지 인터넷 검색 후 클래스의 VTable을 수정하는 방법을 찾았지만 제 경우에는 클래스를 가리키는 포인터와 함께 캐스팅 할 인터페이스가 있습니다. DLL (소스 코드 없음)에서 이러한 함수 중 하나를 내 함수 중 하나로 리디렉션해야합니다. 문제는 어떤 인덱스에 함수가 있는지 모르기 때문에 그것을 찾으려면 VTable에서 해당 함수에 대한 포인터를 검색해 보았습니다.외부 클래스의 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);
}
당신이 그 외부 클래스의 소스가없는 대신 실행됩니다 호출? – greatwolf
아니요, 저는 인터페이스와 DLL을 가지고 있습니다 – JINX
함수 검사가 작동해야합니다. 물론, 그것은 사실상 가상 함수라고 가정합니다. 당신이 신경 쓰는 곳은 가상 함수라고하며, 직접적으로는 아닙니다. –