C++反汇编-函数调用原理
VC6.0++函数调用方式有三种:
分别为:
1._stdcall 方式
int _stdcall add1(int i,int j)
{cout<<"_stdcall out"<<endl;return i+j;
}
0040158F CC INT3 ; _stdcall 被调方平衡栈
00401590 > > 55 PUSH EBP
00401591 . 8BEC MOV EBP,ESP
00401593 . 83EC 40 SUB ESP,40
00401596 . 53 PUSH EBX
00401597 . 56 PUSH ESI
00401598 . 57 PUSH EDI
00401599 . 8D7D C0 LEA EDI,DWORD PTR SS:[EBP-40]
0040159C . B9 10000000 MOV ECX,10
004015A1 . B8 CCCCCCCC MOV EAX,CCCCCCCC
004015A6 . F3:AB REP STOS DWORD PTR ES:[EDI]
004015A8 . 68 CD104000 PUSH testcall.004010CD
004015AD . 68 1C004700 PUSH OFFSET testcall.??_C@_0N@HMEN@_stdc>; _stdcall out
004015B2 . 68 A0DE4700 PUSH OFFSET testcall.std::cout
004015B7 . E8 D8FCFFFF CALL testcall.00401294
004015BC . 83C4 08 ADD ESP,8
004015BF . 8BC8 MOV ECX,EAX
004015C1 . E8 24FCFFFF CALL testcall.004011EA
004015C6 . 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
004015C9 . 0345 0C ADD EAX,DWORD PTR SS:[EBP+C]
004015CC . 5F POP EDI
004015CD . 5E POP ESI
004015CE . 5B POP EBX
004015CF . 83C4 40 ADD ESP,40
004015D2 . 3BEC CMP EBP,ESP
004015D4 . E8 D7F50100 CALL testcall.__chkesp
004015D9 . 8BE5 MOV ESP,EBP
004015DB . 5D POP EBP
004015DC . C2 0800 RETN 8
004015DF CC INT3
以上为DEBUG反汇编源码:
2._fastcall 方式
int _fastcall add2(int i, int j)
{cout<<"_fastcall out"<<endl;return i+j;
}
004015FF CC INT3 ; _fastcall 被调方 平衡栈
00401600 > > 55 PUSH EBP
00401601 . 8BEC MOV EBP,ESP
00401603 . 83EC 48 SUB ESP,48
00401606 . 53 PUSH EBX
00401607 . 56 PUSH ESI
00401608 . 57 PUSH EDI
00401609 . 51 PUSH ECX
0040160A . 8D7D B8 LEA EDI,DWORD PTR SS:[EBP-48]
0040160D . B9 12000000 MOV ECX,12
00401612 . B8 CCCCCCCC MOV EAX,CCCCCCCC
00401617 . F3:AB REP STOS DWORD PTR ES:[EDI]
00401619 . 59 POP ECX
0040161A . 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
0040161D . 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00401620 . 68 CD104000 PUSH testcall.004010CD
00401625 . 68 2C004700 PUSH OFFSET testcall.??_C@_0O@JLOO@_fast>; _fastcall out
0040162A . 68 A0DE4700 PUSH OFFSET testcall.std::cout
0040162F . E8 60FCFFFF CALL testcall.00401294
00401634 . 83C4 08 ADD ESP,8
00401637 . 8BC8 MOV ECX,EAX
00401639 . E8 ACFBFFFF CALL testcall.004011EA
0040163E . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00401641 . 0345 F8 ADD EAX,DWORD PTR SS:[EBP-8]
00401644 . 5F POP EDI
00401645 . 5E POP ESI
00401646 . 5B POP EBX
00401647 . 83C4 48 ADD ESP,48
0040164A . 3BEC CMP EBP,ESP
0040164C . E8 5FF50100 CALL testcall.__chkesp
00401651 . 8BE5 MOV ESP,EBP
00401653 . 5D POP EBP
00401654 . C3 RETN
以上为对应的DEBUG反汇编源码
3.cdecl 方式
int _cdecl add3(int i,int j)
{cout<<"_cdecl out"<<endl;return i+j;
}
00401670 > > \55 PUSH EBP ; 保存栈底指针EBP
00401671 . 8BEC MOV EBP,ESP ; 调整当前栈底指针位置到栈顶
00401673 . 83EC 40 SUB ESP,40 ; 开辟栈空间 作为局部变量的存储空间
00401676 . 53 PUSH EBX ; 保存EBX寄存器
00401677 . 56 PUSH ESI ; 保存ESI寄存器
00401678 . 57 PUSH EDI ; 保存EDI寄存器
00401679 . 8D7D C0 LEA EDI,DWORD PTR SS:[EBP-40] ; 取出此函数 可用栈空间首地址
0040167C . B9 10000000 MOV ECX,10
00401681 . B8 CCCCCCCC MOV EAX,CCCCCCCC
00401686 . F3:AB REP STOS DWORD PTR ES:[EDI]
00401688 . 68 CD104000 PUSH testcall.004010CD
0040168D . 68 3C004700 PUSH OFFSET testcall.??_C@_0L@INPI@_cdec>; _cdecl out
00401692 . 68 A0DE4700 PUSH OFFSET testcall.std::cout
00401697 . E8 F8FBFFFF CALL testcall.00401294
0040169C . 83C4 08 ADD ESP,8
0040169F . 8BC8 MOV ECX,EAX
004016A1 . E8 44FBFFFF CALL testcall.004011EA
004016A6 . 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 将EBP+8 处值 传送到EAX中
004016A9 . 0345 0C ADD EAX,DWORD PTR SS:[EBP+C] ; 将EBP+C 处值与EAX值 相加
004016AC . 5F POP EDI ; 还原EDI 寄存器
004016AD . 5E POP ESI ; 还原ESI寄存器
004016AE . 5B POP EBX ; 还原EBX寄存器
004016AF . 83C4 40 ADD ESP,40 ; 降低栈顶,此时局部变量空间被释放
004016B2 . 3BEC CMP EBP,ESP ; 检测栈平衡
004016B4 . E8 F7F40100 CALL testcall.__chkesp ; 进入栈平衡错误检测函数
004016B9 . 8BE5 MOV ESP,EBP ; 还原ESP
004016BB . 5D POP EBP
004016BC . C3 RETN
以上为对应的DEBUG反汇编源码解释。
小结:
1.默认采用_cdecl方式。
2._fastcall方式 只是前两个参数用寄存器传递,后面的都采用栈传参方式。
C++反汇编-函数调用原理相关推荐
- c语言中姓名查找的原理,搜索 C/C++ 函数调用原理
在 C/C++ 函数调用的整个过程中内存空间进行了什么操作?本文对 C/C++ 函数调用原理进行扼要说明. 一.预备知识 (一) 内存中数据的地址 地址在内存中存放时可能会跨越连续若干个存储单元(一个 ...
- 栈中函数调用原理_详解
函数调用是程序设计中的重要环节,本文就函数调用的过程进行分析. 一.eip.ebp.esp介绍 EIP,EBP,ESP都是系统的寄存器,里面存储的是些地址,我们系统中栈的 ...
- kitten编程猫里的函数定义,函数实现和函数调用原理
kitten编程猫 函数定义和函数实现: var 我的成语库 = [];function 成语初始化() {我的成语库.splice('' - 1, 1);我的成语库.push(1);我的成语库.pu ...
- 关于C语言中的RGB函数调用原理
三原色光模式(RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red).绿(Green).蓝(Blue)三原色的色光以不同的比例相加,以合成产生各种色彩光. ...
- Swift与LLVM-Clang原理与示例
Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...
- C++反汇编代码分析
C++反汇编代码分析--函数调用 代码如下: #include "stdlib.h" int sum(int a,int b,int m,int n) { return a+b ...
- c++反汇编代码分析--偷调函数
注:不知道说"偷调函数"说法合不合适,在此也就这样一说了~ 主要有两点: 一.再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者 二.在 1 的基础上,在Win ...
- 拦截图片代码 精易web浏览器_[原创]用Com HOOK实现拦截WebBrowser的alert函数调用
[原创]用Com HOOK实现拦截WebBrowser的alert函数调用 [原创]用Com HOOK实现拦截WebBrowser的alert函数调用 原理简单说一下,实际上不只是WebBrowser ...
- arm裸机【5】 --- 反汇编介绍
1.反汇编工具objdump的使用简介 反汇编的原理&为什么要反汇编 反汇编文件的格式和看法 2.初识指令地址 3.展望:反汇编工具帮助我们分析链接脚本 1.反汇编工具objdump的使用简介 ...
最新文章
- Linux压缩和解压缩命令集
- 读书:儒林外史第一回
- 观察者模式重复调用mysql问题,2、观察者模式
- 成功解决TypeError: sequence item 0: expected str instance, list found
- Shared pool内存块组成结构及4031错误原因分析
- C语言实现循环链表Circularly Linked List(附完整源码)
- 李猛:从MongoDB迁移到ES后,我们减少了80%的服务器
- 【Java】Java 集合相关的博客积累
- 在linux系统下java实现pdf导出汉字无法显示_Linux环境下iText生成pdf中文不显示问题...
- 淘口令二合一生成php_3淘口令接口的封装 工具类的打造
- 一篇关于蓝牙SDP和L2CAP协议的文章
- 想要做好SEO优化,你必须懂得SEO的核心因素
- OFFICE2003的自动保存功能。
- linux终端怎么复制粘贴某一行_超级小白帖:如何在Linux终端中复制粘贴
- 浏览器主页被篡改为hao123、360和2345解决办法
- 在OpenCV里实现直方图反向投影算法
- android 自定义图片裁剪,android 自定义比例裁剪图片(拍照 相册)方式 自定义比例...
- 怎样给蔬菜图片抠图?看看这个马路中央的紫茄子
- 修改Datagrip 2021.2.4 系统文件插件等目录的位置
- 新浪邮箱(@sina.com/@sina.cn):启用IMAP4/SMTP服务+授权码
热门文章
- 计算机三级上机题库百度云,全国计算机三级数据库等级考试全套(笔试背诵资料+笔试试题+详细答案+最新数据库技术上机试题题库).doc...
- scratch编程——画笔模块画各种同心图案
- opus 编码和解码完整demo代码,opus和wav互转(js源码)
- 例25:求1+2!+3!+...+20!的和。
- hmailserver搭建一个公网可收发的自用邮局
- 东田纳西州立大学计算机排名,东田纳西州立大学如何
- Thrill: 基于C++的高性能分布式批处理算法
- 后缀是lnk是什么文件_后缀为.lnk的文件怎么打开?
- Googlenbsp;Calendarnbsp;与amp;nbs…
- 炫酷手持滚动弹幕生成小工具微信小程序源码