当前位置: 首页 > news >正文

免费网站优化深圳网站改版公司

免费网站优化,深圳网站改版公司,网站开发可演示的版本,福建seo关键词优化外包目录 1、调用函数流程(main函数调用print函数):Step1 保存main函数现场地址等信息Step2 跳转到print函数的位置Step3 执行print函数的指令Step4 返回main函数,执行下一条指令流程连续性总结 2、其他知识总结 1、调用函数流程&…

目录

  • 1、调用函数流程(main函数调用print函数):
    • Step1 保存main函数现场地址等信息
    • Step2 跳转到print函数的位置
    • Step3 执行print函数的指令
    • Step4 返回main函数,执行下一条指令
    • 流程连续性总结
  • 2、其他知识总结

1、调用函数流程(main函数调用print函数):

Step1. 保存main函数现场地址等信息

Step2. 跳转到print函数的位置

Step3. 执行print函数的指令

Step4. 返回main函数,执行下一条指令

Step1 保存main函数现场地址等信息

要存储的内容,主要有3个:

(1)传入print函数的形参【父函数中实现】

(2)原eip(main函数call指令的下一条指令的地址)【父函数中实现】

(3)原ebp(main函数的ebp地址,因为是main函数直接调用print函数)【子函数中实现】

实现方式:

main函数中,依次执行以下指令:

push eax; # 传入函数的形参arg
call print; #作用是保存eip。当然,也有跳转的作用(见Step2)

print函数开头,依次执行以下指令:

push ebp; # 保存父函数main函数的栈底地址,方便调用函数结束后pop回去
mov ebp esp; # 指定print函数的栈帧基地址(print函数对应的栈底地址)

Step2 跳转到print函数的位置

核心是修改eip寄存器,把eip寄存器的值,修改为print函数的入口地址。

实现方式:main函数中调用call指令

call print.77c70888; # 相当于esp = esp - 4; push eip(此时的eip值,就是下面"main函数中的下一条指令"的地址); mov eip print函数的地址77c70888(跳转到新函数)
main函数中的下一条指令;

Step3 执行print函数的指令

子函数最开始,一般要执行以下的命令:

push ebp; # 保存原ebp
mov ebp esp; # ebp指向当前函数的栈底
...
sub esp, num; # 为子程序分配栈空间
...
pop ebp; # 让ebp指向父函数的栈帧基地址
ret n; # 让eip指向“main函数call指令的下一条指令的地址”;n是指平衡堆栈,即让最先push进去的形参args清空

Step4 返回main函数,执行下一条指令

核心是修改eip寄存器的值,把eip寄存器的值,修改为main函数中下一条指令的地址。

实现方式:在print函数中,调用ret命令

ret ; #相当于pop eip; esp = esp + 4

注意,如果原先栈中还有其他数据,esp 没有归位会导致主函数引用栈中数据出错。在这种背景下,出现了堆栈平衡的概念。即,还需对esp 进行单独操作,才能将 esp 指向原函数栈顶。以常见的 c 语言,函数有好几种调用规则。比如 cdecl 方式和 stdcall 方式。

cdecl 方式中,由主程序执行 add esp, n 指令调整 esp,达到堆栈平衡。在 stdcall 方式中,由子程序在返回时,执行 ret n 平衡堆栈。n 其实就是函数的参数所占的空间大小。

流程连续性总结

重要参考:《从汇编角度理解 ebp&esp 寄存器、函数调用过程、函数参数传递以及堆栈平衡》

函数调用

在一个函数中,调用另外一个函数,往往有以下几个步骤:

汇编指令指令归属函数SP 变化作用
push arg2主函数sp-4
push arg1主函数sp-4
call function主函数sp-4开始调用子程序,同时保存返回地址
push ebp子函数sp-4
mov ebp, esp子函数sp-4将当前esp 存入 ebp,目的是定位函数参数
sub sp, #num子函数sp-num为子程序分配栈空间
子函数函数的具体实现逻辑
pop ebp子函数sp+4
ret子函数sp+4

说明:

  • push arg 在调用一个函数之前,需要把传递的参数压入栈,因此需要有。每次 push 之后,栈多了一个字长(32 位系统 --> 4 字节),因此栈顶需要往上移动 4 字节,该指令暗含 sub sp, #4
  • call call 指令用来调用某个函数,该指令有3个操作(1)sp = sp - 4(2)将返回地址压入栈; (3)修改eip
  • push ebpmov ebp, esp 这样的操作,你会在各个函数的开头见到,保存上一个函数栈的基址,并更新本函数的基址
  • ret,即 return,此时 sp 应该指向 call 指令刚刚压入的返回地址;执行 ret 其实就是将此时栈中的数据弹出,存至 eip 寄存器。eip 存放的是下一条即将执行的指令的地址。 同时 sp = sp + 4
  • ret 指令相当于 pop eip(esp = esp + 4)
  • call 指令相当于 push eip(esp = esp - 4); mov eip 新函数的地址

下图左边是主函数调用子函数,右边是子函数返回主函数:

在这里插入图片描述

2、其他知识总结

1、esp寄存器,永远指向整个栈帧的栈顶(esp寄存器保存的值是堆栈的地址值);栈顶中的内容,可能是一个地址值,也可能是一个立即数等等。esp寄存器指向的堆栈地址始终有值!所以push是先移esp后压栈,pop是先弹栈后移esp。

2、ebp寄存器,永远指向当前函数所在栈帧的栈底(ebp寄存器保存的值是堆栈的地址值);栈底中的内容,永远保存的是上一个函数(父函数)的ebp地址!(方便函数执行完后pop回去,即修改ebp)

  • ebp 的作用之一就是找到函数的形参(通过ebp + 偏移量),当然栈中的局部变量也是可以通过 ebp 来定位的(ebp - 偏移量)

3、父函数调用子函数,子函数的栈帧(低地址)是紧挨着父函数的栈帧(高地址)。

  • 所以父函数调用子函数,一定是①args先压榨 ② 然后 原eip压栈(by call)③ 再 ebp压栈 ④ 最后函数的局部变量压榨

  • 父函数栈帧 和 子函数栈帧,隔着的东西就是:args 和 eip

    在这里插入图片描述

4、栈的增长方向,永远向着低地址的方向增长。

5、call 指令相当于:esp = esp - 4; push eip; mov eip 函数的地址.77c70888 (注意,push中已包含esp移动,这里只是表示先后)

6、ret指令相当于:pop eip; esp = esp + 4 (注意,pop中已包含esp移动,这里只是表示先后)

7、push eax指令,只会修改栈和esp:① esp = esp - 4 ② mov [esp], eax 这个[esp]表示esp指向的栈值(内存值)被赋值。

8、pop eax指令,不仅会修改栈和esp,而且还会修改eax(寄存器被赋值):① mov eax, [esp] ②esp = esp + 4

9、寄存器的地址值是不会变的,变的只是寄存器中装的堆栈地址值,以及这个堆栈地址中的内存内容值。这个类似并区别于C语言的指针变量。C语言指针变量有2个地址值,一个是指针变量装的堆栈地址值,另一个是指针本身的地址值(也位于堆栈)。指针变量声明后,它存在于内存中(堆栈中),指针释放了,这个指针的地址值也就无了。区别点在于 指针有本身的地址值(可以通过&取出来),而寄存器没有本身的地址值的说法(取不出来,或者有也是固定的但不常用)。指针变量的常操作数据有3个:①p ②*p ③&p;esp寄存器常操作的数据有2个:①esp ②[esp]

  • esp:esp寄存器的内容值,即栈/内存的某个地址
  • [esp]:栈中的值 / 内存中的值
http://www.yayakq.cn/news/261311/

相关文章:

  • 陵水建设局网站17zwd一起做网店潮汕站
  • 移动端网站建设的请示互联网保险发展现状
  • 网站的链接结构怎么做北京网页设计公司有哪些
  • 做检测设备的网站有哪些福州综合网站建设
  • 免费正能量不良网站推荐西宁网站建设最好的公司哪家好
  • 西安机场商务宾馆百度做网站wordpress显示加载耗时
  • 搭建网站多少钱网站制作资讯
  • 上海建设银行网站上班时间表ip开源网站FPGA可以做点什么
  • 越南人一般去哪个网站做贸易登封做网站推广
  • 做网站需要知道的简单代码北京网站建设 网络安全
  • 本地用织梦做网站上海贸易公司有哪些
  • 建设网站公司谁家好济南建站推荐企汇优见效付款
  • 网站设计要点 优帮云wordpress是主机吗
  • 想做外贸做哪些网站做婚恋网站的翻译好吗
  • 做网站管理员需要哪些知识中国企业大黄页
  • 广州网站建设商城打不开建设银行网站
  • 有专业做网站的吗gre考郑州建设网站定制
  • 网站建设设计服务商成为网站有哪些网址?
  • 中企动力做的网站被百度屏蔽asp.net旅游网站管理系统代码
  • 互动科技 网站建设网站内容过滤
  • 山楼小院在哪家网站做宣传达内网站开发视频教程
  • 广告公司手机网站模板人和马做的网站
  • 哪些网站设计的高大上wordpress 获取文章id
  • 网站ie兼容性差北京网站制作哪家好
  • 自己做网站,为什么出现403外贸网络推广怎样做
  • 黄石规划建设局网站微网站开发要多少钱
  • 中国廉政建设网网站wordpress文章刷新
  • 用discuz做门户网站网站建设设计咨询
  • 旅游网站html模板深达网站制作深圳公司
  • 网站建设 文件源代码约定漳州开发区人才网