zoukankan      html  css  js  c++  java
  • 滴水逆向-数据类型-函数调用约定

     测试练习

    常见的几种调用约定
    前缀:__cdecl 参数压栈顺序:从右至左入栈 平衡堆栈:调用者清理栈(外平栈)
    前缀:__stdcall 参数压栈顺序:从右至左入栈 平衡堆栈:自身清理栈(内平栈)
    前缀:__fastcall 参数压栈顺序:ECX/EDX传送前两个,剩下:从右至左入栈 平衡堆栈:自身清理栈(内平栈)
    
    外平栈,通过在函数外进行堆栈平衡操作,add esp,8
    
    反汇编代码
    
    0040B7D8   push        2
    0040B7DA   push        1
    0040B7DC   call        @ILT+25(plus1) (0040101e)
    0040B7E1   add         esp,8
    
    C代码
    
    int __cdecl plus1(int a,int b)
    {
        return a+b;
    }
    
    
    内平栈,通过在函数里进行堆栈平衡操作, ret 8
    
    反汇编代码
    
    0040B7D8   push        2
    0040B7DA   push        1
    0040B7DC   call        @ILT+30(plus2) (00401023)
    
    函数内部
    00401074   ret         8
    
    C代码
    
    int __stdcall plus2(int a,int b)
    {
        return a+b;
    }
    
    2个参数,快速内平栈,简单点理解是就放在寄存器快速执行,执行速度快,在两个参数的情况下不进行堆栈压入栈,直接从右到左将参数放入寄存器edx和ecx
    
    反汇编代码
    
    0040B808   mov         edx,2
    0040B80D   mov         ecx,1
    0040B812   call        @ILT+35(plus3) (00401028)
    
    函数内部
    
    0040B7EC   ret
    
    C代码
    
    int __fastcall plus3(int a,int b)
    {
        return a+b;
    }
    
    4个参数,快速内平衡
    
    反汇编代码
    
    0040B848   push        4
    0040B84A   push        3
    0040B84C   mov         edx,2
    0040B851   mov         ecx,1
    0040B856   call        @ILT+40(plus4) (0040102d)
    
    函数内部
    
    0040B822   ret         8
    
    C代码
    
    int __fastcall plus4(int a,int b,int c,int d)
    {
        return a+b+c+d;
    }
    
    全部原始代码
    
    int __cdecl plus1(int a,int b)
    {
        return a+b;
    }
    
    //内平栈
    
    int __stdcall plus2(int a,int b)
    {
        return a+b;
    }
    
    //2个参数快速内平栈
    
    int __fastcall plus3(int a,int b)
    {
        return a+b;
    }
    
    //4个参数快速内平栈
    
    int __fastcall plus4(int a,int b,int c,int d)
    {
        return a+b+c+d;
    }
    
    int main(int argc, char* argv[])
    {
        //printf("Hello World!
    ");
        plus4(1,2,3,4);
        return 0;
    }
    迷茫的人生,需要不断努力,才能看清远方模糊的志向!
  • 相关阅读:
    Impala源码之订阅发布系统的实现
    Kylin性能调优记——业务技术两手抓
    The Beam Model:Stream & Tables翻译(上)
    手把手教你搭建hadoop+hive测试环境(新手向)
    使用 Apache Atlas 进行数据治理
    类似gitlab代码提交的热力图怎么做?
    3分钟掌握一个有数小技能:回头客分析
    3分钟掌握一个有数小技能:制作动态标题
    uva 10404 Bachet's Game(完全背包)
    POJ3771+Prim
  • 原文地址:https://www.cnblogs.com/autopwn/p/15070347.html
Copyright © 2011-2022 走看看