这个__usercall包装有什么问题?

时间:2010-11-05 01:48:54

标签: c assembly reverse-engineering wrapper usercall

/*
 * Wrapper from
 * int func(int a, int b, int c, unsigned int d, signed int e);
 * to
 * int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);
 */
int func(int a, int b, int c, unsigned int d, signed int e)
{
    __asm
    {       
        push e
        push d
        push c
        mov ecx, b
        mov eax, a
        call __usercall_func // access violation somewhere inside here
        add esp, 12
    }
}

1 个答案:

答案 0 :(得分:1)

你不能在内联asm块中自己执行ret,因为你不知道外部函数对堆栈指针做了什么。相反,您需要安排汇编代码将返回值保留在局部变量中,包装函数可以使用正常的C return语句返回。

你可能还需要在从__usercall_func返回后修复堆栈指针,除非它使用一个反常的调用约定,它会从堆栈中弹出自己的参数。