64,642
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <stdio.h>
size_t WINAPI HookVtbl(void* pObject, size_t classIdx, size_t methodIdx, size_t newMethod)
{
size_t** vtbl = (size_t**)pObject;
DWORD oldProtect = 0;
size_t oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), oldProtect, &oldProtect);
return oldMethod;
}
class A
{
public:
virtual void printa()
{
printf("print in A\n");
}
virtual void print(int i, int j, int k)
{
printf("print in A\n");
}
virtual void print2(int i, int j, int k)
{
printf("print2 in A\n");
}
};
void WINAPI print(int i, int j, int k)
{
printf("print in global name space %d %d %d\n", i, j, k);
}
void WINAPI print2(int i, int j, int k)
{
printf("print2 in global name space %d %d %d\n", i, j, k);
}
int main()
{
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(size_t) = %d\n", sizeof(size_t));
A* a = new A();
int old = NULL;
size_t oldSizeT = NULL;
size_t oldSize2 = NULL;
oldSizeT = HookVtbl(a, 0, 1, (size_t)print);
oldSize2 = HookVtbl(a, 0, 2, (size_t)print2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
HookVtbl(a, 0, 1, oldSizeT);
HookVtbl(a, 0, 2, oldSize2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
}
#include <windows.h>
#include <stdio.h>
size_t WINAPI HookVtbl(void* pObject, size_t classIdx, size_t methodIdx, size_t newMethod)
{
size_t** vtbl = (size_t**)pObject;
DWORD oldProtect = 0;
size_t oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), oldProtect, &oldProtect);
return oldMethod;
}
class A
{
public:
virtual void printa()
{
printf("print in A\n");
}
virtual void print(int i, int j, int k)
{
printf("print in A\n");
}
virtual void print2(int i, int j, int k)
{
printf("print2 in A\n");
}
};
void WINAPI print(
#ifdef _WIN64
int t,
#endif
int i, int j, int k)
{
printf("print in global name space %d %d %d\n", i, j, k);
}
void WINAPI print2(
#ifdef _WIN64
int t,
#endif
int i, int j, int k)
{
printf("print2 in global name space %d %d %d\n", i, j, k);
}
int main()
{
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(size_t) = %d\n", sizeof(size_t));
A* a = new A();
int old = NULL;
size_t oldSizeT = NULL;
size_t oldSize2 = NULL;
oldSizeT = HookVtbl(a, 0, 1, (size_t)print);
oldSize2 = HookVtbl(a, 0, 2, (size_t)print2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
HookVtbl(a, 0, 1, oldSizeT);
HookVtbl(a, 0, 2, oldSize2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
}
#include <stdio.h>
#include <windows.h>
size_t WINAPI HookVtbl(void* pObject, size_t classIdx, size_t methodIdx, size_t newMethod)
{
size_t** vtbl = (size_t**)pObject;
DWORD oldProtect = 0;
size_t oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), oldProtect, &oldProtect);
return oldMethod;
}
class A
{
public:
A(int i)
{
m_i = i;
}
virtual void print(int a, int b, int c)
{
printf("in A: %d %d %d %d\n", a, b, c, m_i);
}
int m_i;
};
void WINAPI print(
#ifdef _WIN64
A* pa,
#endif
int a, int b, int c)
{
#ifndef _WIN64
A* pa = NULL;
_asm mov pa, ecx;
#endif
printf("global print: %d %d %d %d\n", a, b, c, pa->m_i);
}
int main()
{
A* a = new A(56);
a->print(12, 34, 78);
size_t old = HookVtbl(a, 0, 0, (size_t)print);
a->print(12, 34, 78);
HookVtbl(a, 0, 0, old);
a->print(12, 34, 78);
delete a;
}