我正在学习 vmt hooking 并遇到一些问题。
当我在可执行文件中执行此操作时,它显示了正确的地址 的功能。
代码:
Obj* obj = new Obj;
std::uintptr_t* vmt = *(std::uintptr_t**)(obj);
printf("0x%llx\n", vmt[0]);
但现在我尝试通过将我的 dll 注入到我创建的可执行文件中来实现此目的:
它打印出这样奇怪的地址:
Hello in first function, 0x000001CCDA662210
??_7Obj@@6B@ -> 0x7ff678043008
vmt[0]: 0x244c894838ec8348
代码:
std::uintptr_t address = ( ( std::uintptr_t )GetModuleHandleA( NULL ) + 0x3008 );
printf( "??_7Obj@@6B@ -> 0x%llx\n", address );
std::uintptr_t* vmt = *(std::uintptr_t**)( address );
printf( "vmt[0]: 0x%llx\n", vmt[ 0 ] );
IDA逆转:
代码:
.rdata:0000000140003008 ; const Obj::`vftable'
.rdata:0000000140003008 ??_7Obj@@6B@ dq offset sub_140007390 ; DATA XREF: sub_140007130+1D↓o
.rdata:0000000140003010 dq offset sub_1400073C0
.rdata:0000000140003018 dq offset sub_1400073E0
.rdata:0000000140003020 dq offset sub_140007400
.rdata:0000000140003028 align 10h
抱歉,如果我问了愚蠢的事情,但我想学习而不是复制和粘贴。
在你的第一段代码中,obj是一个指向该对象的指针。您取消引用它并获得了 vftable 的地址。在你的第二段代码中,address已经是vftable的地址,所以你不需要再次取消引用它