VMT(vtable)在可执行文件中读取为 DLL 时出现问题

问题描述 投票:0回答:1

我正在学习 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

抱歉,如果我问了愚蠢的事情,但我想学习而不是复制和粘贴。

64-bit hook reverse-engineering x64dbg vmt
1个回答
0
投票

在你的第一段代码中,obj是一个指向该对象的指针。您取消引用它并获得了 vftable 的地址。在你的第二段代码中,address已经是vftable的地址,所以你不需要再次取消引用它

© www.soinside.com 2019 - 2024. All rights reserved.