代码之家  ›  专栏  ›  技术社区  ›  sswwqqaa

确定函数参数起始地址

  •  3
  • sswwqqaa  · 技术社区  · 6 年前

    我有一个“c”程序,它为外部x86函数提供以下参数:

    extern "C" int fun(unsigned char *par1, unsigned char *par2, unsigned int par3);
    

    定义par1的长度。

    如何确定参数的起始地址?

    我知道par1开始于 [ebp+8] 例如,par2开始于 [ebp+16]

    我不知道如何确定par3从哪里开始?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Rafael    6 年前

    调用方按照x86 ABI的相反顺序推送参数,然后调用 fun . 这个 call 指令推送 eip 在跳到 乐趣 . 然后,设置堆栈帧,使 ebp 堆栈顶部,因此arg1必须比堆栈帧高8个字节:

          higher mem
    +----------+---------+
    | arg 3    | 4 bytes | push arg 3
    +----------+---------+           (ebp + 16)
    | arg 2    | 4 bytes | push arg 2
    +----------+---------+           (ebp + 12)
    | arg 1    | 4 bytes | push arg 1
    +----------+---------+           (ebp + 8)
    | ret addr | 4 bytes | call fun
    +----------+---------+           (ebp + 4)
    | old ebp  | 4 bytes | push ebp; mov ebp, esp
    +----------+---------+ <-------- (ebp + 0) STACK FRAME START
           lower mem 
    
    推荐文章