从调用者那里获取 ecx 寄存器

逆向工程 汇编
2021-07-07 15:16:28

我需要从调用我的函数的函数中获取 ecx 寄存器(__fastcall 约定)

我一直试图通过将 0x8 添加到 ebp 来获得 ecx,因为根据我的理解 ebp + 0x4 = 返回地址,并且从它的堆栈参数向上。

这是我一直在做的事情

uintptr_t _framePointer, _framePointerOld;
__asm
{
    mov _framePointer, ebp
}

_framePointerOld= *reinterpret_cast< uintptr_t* >( _framePointer);

void* ecx_of_caller = *reinterpret_cast< void** >( _framePointerOld+ 0x12 );
1个回答

这没有什么意义。

如果您是 __factcall 函数,则您的 ECX 寄存器中的第一个参数只需使用它即可。不是 __fastcall 函数如何保存或存储该值。

除非你反汇编了他们的代码,否则你应该能够准确地告诉你必须阅读什么才能获得该值……只要它尚未被销毁。

__fastcall func(int parm1){
    int local = parm1+1;
    int result = call_your_fucntion(local);
    int do_some_thing_else = parm1 + result;
    ...
}

在这种情况下,因为在调用后使用 parm1,它必须以某种方式保存,如果在调用后不需要它,则该寄存器可能已经被重新分配以存储其他一些瞬态值。