JMP CALL RET
一.JMP指令(修改EIP的值)(第一个修改EIP的指令)
三种方法 :JMP 立即数
JMP 寄存器
JMP 内存
EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址
1.之前学过要修改一个通用寄存器的值,mov指令就可以完成,但是mov这个指令时不允许修改EIP寄存器的

所以可以使用JMP 1(本质的作用效果其实和mov eip ,1一样)

例子1:将EIP修改为004183F4,程序也会跳到004183F4执行

例子2:后面跟寄存器

例子3 :后面跟内存(注意 跟内存的时候只能使用dword,因为其本质是修改EIP里面的值 但是EIP是32位的 ,所以只能用dword)

二.call指令(也是修改EIP的指令)(相对来说比JMP复杂一些)
call指令做了哪些事?

(之前要想让代码一行行执行 按F8 但是编写call指令的时候,执行得按F7)
比如

第一件事就是就是修改了EIP,把call后面的值放到EIP中
第二件事情 他会把当前指令的下一行地址 存到了堆栈中

所以call
总结一下 call和jmp唯一的区别就是call会把下一行指令放到堆栈中(相应的ESP的值也会改变)
三.RET指令
RET指令做的事情就是

例子 :执行之前(观察红圈的三个地方)还有堆栈里面的值
堆栈里面的值 
F8执行之后

所以由变化可以看出ret做的事情
第一件事情:把当前栈顶的值放入EIP 里,响应的cpu也就跳到EIP里指定的地址
第二件事情就是栈顶指针+4,也即是ESP+4。
四,拓展(反调试之Fake F8)
目的就是让F8失效 ,反调试 让别人不太容易看懂
4.1 F7和F8

F7和F8都是使程序单行执行 唯一出现区别的时候就是执行call指令的时候,一个call里面可能由很多条指令,F7会去把call指令做的事情一步步做,但是F8则把call指令包括里面的程序一下子全执行完 ,紧接着下面设置断点,不执行了。
断点:程序停止的地方 也可以自己设置断点F2,那么程序走到你设置的位置也就会停下来.

之后是如何将f8废掉的,还是视频表达的更加清楚https://www.bilibili.com/video/av67934684?p=20
总结一下,call指令在执行的时候会把程序下一步 的地址放在堆栈的栈顶的值当中,然后ret会把栈顶的值(也就是下一步程序进行的地址)放回到EIP 让cpu执行完call,接着执行下一条。所以破解人员想追踪程序的运行,会在call指令执行之后再执行一个ret,这样程序就回到正常程序call完成之后的下一步,程序也就是一步步的进行 。(一个ret会让 破解人员知道程序下一步在哪执行)
反调试也就是将call执行完之后 ,用mov指令修改ESP地址里面的值之后 ,这样栈顶的值也就是被修改,然后如果破解的人写一个ret,那么就会返回一个错误的 下一步地址 给EIP 导致破解人员不知道程序下一步到底在哪。
JMP CALL RET的更多相关文章
- 汇编指令之JMP,CALL,RET(修改EIP的值!!!)
简单介绍了,JMP指令按市面上的意思来说是跳转到指定地址,但我这里不这么说,JMP, CALL, RET三个指令均为修改EIP值的指令,EAX, ECX, EBX, EDX, ESP, EBP, ES ...
- jmp && call && ret 特权级转移 & 进程调度
①jmp是不负责任的调度,不保存任何信息,不考虑会回头.跳过去就什么也不管了.②call,保存eip等,以便程序重新跳回.ret是call的逆过程,是回头的过程.这都是cpu固有指令,因此要保存的信息 ...
- bug report: Jump to the invalid address stated on the next line at 0x0: ???
gdb或者vlagrind报告: ==14569== Jump to the invalid address stated on the next line ==14569== at 0x0: ??? ...
- 深入研究C语言 第二篇(续)
1. 关于如下的程序,关于结构体的拷贝,拷贝是拷贝到内存中的什么地方? 我们进入debug进行反汇编,单步等操作跟踪查看.发现: 在main中,我们看到call 0266应该对应的是转跳到func处执 ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- boot/setup.S
!! setup.S Copyright (C) 1991, 1992 Linus Torvalds!! setup.s is responsible for getting th ...
- Linux操作系统基础(四)保护模式内存管理(2)【转】
转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...
- 24C02操作--松瀚汇编源码
; ; P_CLKIIC EQU P1.2 ; P_DATIIC EQU P1.3 ; PM_DATIIC EQU P1M.3 ; EE_ADDR DS 1 ;地址寄存器 ; TMP3_IIC DS ...
- Golang网络库中socket阻塞调度源码剖析
本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理.代码中大部分是Go代码,小部分是汇编代码.完整理解本文需要Go语言知识,并且用Golang写过网络程序.更重要的是,需 ...
随机推荐
- ubuntu 怎么更新?ubuntu更新命令及方法
ubuntu 怎么更新?ubuntu更新命令及方法 安装Ubuntu系统后,第一件事就是更新系统源.由于系统安装的默认源地址在英国,作为Ubuntu的主源,国内连接速度非常慢,所以我们要将它换成就近的 ...
- [转载]JDK自带的实用工具——native2ascii.exe
做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,原因是编码方式的不一致.native2ascii是sun java sdk提供的一个工具.用来将别的文本类文件(比如*.txt, ...
- 干货 | RDS For SQL Server单库上云
数据库作为核心数据的重要存储,很多时候都会面临数据迁移的需求,例如:业务从本地迁移上云.数据中心故障需要切换至灾备中心.混合云或多云部署下的数据同步.流量突增导致数据库性能瓶颈需要拆分-- 本文将会一 ...
- POJ 3348:Cows 凸包+多边形面积
Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7739 Accepted: 3507 Description ...
- CentOS configuration uses the SFTP server
SFTP,即 SSH 文件传输协议( SSH File Transfer Protocol ),或者说是安全文件传输协议( Secure File Transfer Protocol ).SFTP 是 ...
- docker中mysql数据库
在docker中安装mysql数据库,直接上代码,pull 并run 补充20190809=============== 如果要挂载数据库实现数据持久化到本地的时候,会出现权限问题,这个原因是: 在执 ...
- ROS常用库(三)API学习之常用common_msgs(上)
一.概述 common_msgs包含其他ROS软件包广泛使用的消息.这些消息包括动作消息(actionlib_msgs),诊断消息(diagnostic_msgs),几何图元(geometry_msg ...
- Android实现三级联动下拉框下拉列表spinner
原文出处:http://www.cnblogs.com/zjjne/archive/2013/10/03/3350107.html 主要实现办法:动态加载各级下拉值的适配器 在监听本级下拉框,当本级下 ...
- Java笔记--多线程
1.线程的创建与运行(方式一): --1)创建一个Thread的子类: --2)重写Thread类的run()方法: --3)创建一个子类的对象: --4)调用线程的start()方法来启动线程,Ja ...
- URL短网址系统的算法设计及实践
在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密.当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL. 而短网址,顾名思义就是在长度上比较 ...