三种call解释(一): cdcall stdcall naked call等在hook时,保持堆栈平衡

exe调用某个函数时:  int TestFun(int a, int b);
EBP+C: second parameter
EBP+8: first parameter
EBP+4: return address
EBP:   previous EBP       ===》 旧的ebp值(调用者的ebp)
EBP-4: local variable
EBP-8: local variable

内存地址的增长方向:
对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长;

(1)cdcall  堆栈资源释放在函数执行外面,一般的c语言调用。    CALL  XXX;   ADD ESP, xxH

fun xxx(){

   push eax

   CALL  XXX;    //xxx(int)  ==>  cdcall;

   ADD ESP,04H   // 增加值由xxx函数,入栈参数个数确定;

}
(2)stdcall 在函数的里面释放堆栈,一般的windows API。                 CALL  XXX;

fun xxx(){

     push ebp
     mov  ebp,esp

     ///  插入新代码
     ...
     ///  插入新代码 end;

    mov  ebp,esp
    pop  ebp

retn

}
(3) naked call。 进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。 (这些代码称作 prolog and epilog code,一般,ebp,esp的保存是必须的). 但是naked call不产生这样的代码。  ==> 维持堆栈平衡;

你可能感兴趣的:(C语言和PE基础)