zoukankan      html  css  js  c++  java
  • 9.逆向-函数调用约定

    函数调用约定:是对函数调用时参数如何传递的一种约定。调用函数先把参数压入栈然后再传递给函数。栈就是定义在进程中的一段内存空间。向下(低地址方向)扩展。且其大小被记录在PE头中。也就是说,进程运行时确定占内存的大小。

     

    函数执行完成后,栈中的参数如何处理? 不处理。

    函数执行完毕后,ESP值如何变化? 恢复到调用之前。

    调用约定分三种 cdecl/stdcall/fastcall

     

    cdecl:调用者负责处理栈

    VS2015 C++ 控制台程序 默认是cdecl

    #include "stdafx.h"
    
    #include <iostream>
    
    #include <windows.h>
    
    #include <string>
    
    using namespace std;
    
    DWORD  Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {
    
    return dwNumberFirst + dwNumberSecond;
    
    }
    
    int main(){
    
    
    
    DWORD dwSum = Add(1 ,2);
    
    cout << dwSum << endl;
    
    getchar();
    
        return 0;
    
    }

    ADD函数(被调用函数)

     

    MAIN函数(调用函数)

     

     

    Stdcall:被调用者负责处理栈

    #include "stdafx.h"
    
    #include <iostream>
    
    #include <windows.h>
    
    #include <string>
    
    using namespace std;
    
    DWORD _stdcall Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {
    
    return dwNumberFirst + dwNumberSecond;
    
    }
    
    int main(){
    
    
    
    DWORD dwSum = Add(1 ,2);
    
    cout << dwSum << endl;
    
    getchar();
    
        return 0;
    
    }

    ADD函数(被调用函数)

     


    MAIN函数(调用函数)

     

    虽然Win32API是使用C语言写的库,但它使用的是stdcall方式,而不是C语言默认的cdecl方式。这是为了获得更好的兼容性,使C语言之外的其他语言也能直接调用API。

    Fastcall:与stdcall方式基本类似,但该方式通常是使用寄存器(非栈内存)去传递那些需要传递给函数的部分参数(前两个)。若某函数有4个参数,则前2个参数分别使用ECX、EDX寄存器传递。使用过程中注意ECX和EDX已经包含参数了。Fastcall的目的是为了加大执行速度用的。

  • 相关阅读:
    为 WordPress 标签添加 rel="nofollow" 属性
    Discuz X3.2 SEO设置 title 不支持空格的解决方法
    LANMP 如何禁止访问 .htaccess 文件
    Discuz 哪些文件和文件夹需要777权限
    WordPress 模板常用函数
    CSS控制 table 的 cellpadding,cellspacing
    从 Typecho 自定义字段的调用代码看去
    Linux 服务器如何修改 DNS
    Linux 服务器如何禁止 ping 以及开启 ping
    Asp.Net 加载不同项目程序集
  • 原文地址:https://www.cnblogs.com/csnd/p/12061872.html
Copyright © 2011-2022 走看看