C-模拟printf堆栈弹出



我正在win32上编写X86应用程序级模拟器,该模拟程序可执行程序并挂钩其API,将它们转发到我的回调。在这些回调中,我打印了一些调试内容,然后调用实际的API,每个回调类似于:

int hook_MessageBoxA( emu_t *emu, mem_t *mem )
{
    char *pszText, *pszTitle;
    DWORD hwnd, text, title, button;
    // pop arguments from the stack
    STACK_POP(emu, &hwnd);
    STACK_POP(emu, &text);
    STACK_POP(emu, &title);
    STACK_POP(emu, &button);
    // read actual strings from process memory
    mem_read( mem, text,  &pszText, 256 );
    mem_read( mem, title, &pszTitle, 256 );
    printf( "* MessageBoxA( %p, %s, %s, %d )n", hwnd, pszText, pszTitle, button );
    // call the real API
    int ret = MessageBoxA( hwnd, pszText, pszTitle, button );
    // store return value into EAX register
    emu->regs->eax = ret;
    return 0;
}

这对于每个API都可以完美地工作,但是我在MSVCRT内部挂接 printf API时遇到了问题,因为我不知道除了szformat以外,我必须从堆栈中弹出多少个参数。如何确定我必须弹出的参数数量?printf东西如何工作低水平?

谢谢

您不需要需要 pop printf()的参数,如果您不首先将它们放在堆栈上。

不管召集惯例如何,所有variadic函数均已调用,因此他们在不弹出的情况下阅读了自己的论点。

最新更新