zoukankan      html  css  js  c++  java
  • 逆向工程核心原理——第十章

    函数调用约定

    函数调用约定,就是函数调用时如何传递参数的一种约定。

    *栈的大小记录在pe头中。

    主要的函数调用约定如下:

    cdecl

    stdcall

    fastcall

    1.cdecl

    cdecl主要是C语言中使用的方式,调用者负责处理栈。

    这里书本上给了一段代码:

    #include<stdio.h>
    int add(int a, int b)
    {
    	return (a+b);
    }
    
    int main()
    {
    	return add(1,2);
    }
    

    编译后放进OD查看函数调用:

    这种通过push指令将值压入栈中传递参数的方法,就是cdecl。

    2.stdcall

    stdcall这种方式常常用于Win32 API,这种方式由被调用者清理栈。

    还是利用书上的代码:

    #include<stdio.h>
    int _stdcall add(int a, int b)
    {
    	return (a+b);
    }
    
    int main()
    {
    	return add(1,2);
    }
    

    还是使用OD工具查看:

    我们看到与上面cdecl相比,缺少了一条关闭栈区的指令。因为stdcll是被调用者清理栈。

    3.fastcall

    fastcall与前面两个不一样的地方就是,fastcall不会使用push传参,而是直接使用寄存器传参。这样速度就比压栈传参更快。

  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    linux 最常用命令
    tomcat 部署 React 项目后,浏览器刷新报404问题
    Java8 ~ 特性
    React ~ 小结
    ES6 map与filter
    Idea 快捷键
    实现div可以调整高度(div实现resize)
    linux常用命令(4)
  • 原文地址:https://www.cnblogs.com/lex-shoukaku/p/13292515.html
Copyright © 2011-2022 走看看