do..while、while、for循环反汇编剖析
1、循环语句重要特征提取
循环语句最重要的特点就是执行的过程中会往上跳!!!
箭头往上跳的一般都是循环语句,比如下面的for循环:
2、do..while语句反汇编
#include<iostream>
using namespace std;
#pragma warning (disable:4996)//1、do..while
void Fun(int x, int y) {do {printf("%d\n", x);x++;} while (x < y);}int main() {Fun(0, 10);system("pause");return 0;
}
00C51790 push ebp
00C51791 mov ebp,esp
00C51793 sub esp,0C0h
00C51799 push ebx
00C5179A push esi
00C5179B push edi
00C5179C mov edi,ebp
00C5179E xor ecx,ecx
00C517A0 mov eax,0CCCCCCCCh
00C517A5 rep stos dword ptr es:[edi]
00C517A7 mov ecx,offset _A8394B5C_循环语句测试@cpp (0C5C029h)
00C517AC call @__CheckForDebuggerJustMyCode@4 (0C51325h)
00C517B1 mov eax,dword ptr [x]
00C517B4 push eax
00C517B5 push offset string "%d\n" (0C57B30h)
00C517BA call _printf (0C510CDh)
00C517BF add esp,8
00C517C2 mov eax,dword ptr [x]
00C517C5 add eax,1
00C517C8 mov dword ptr [x],eax
00C517CB mov eax,dword ptr [x]
00C517CE cmp eax,dword ptr [y]
00C517D1 jl __$EncStackInitStart+15h (0C517B1h)
00C517D3 pop edi
00C517D4 pop esi
00C517D5 pop ebx
00C517D6 add esp,0C0h
00C517DC cmp ebp,esp
00C517DE call __RTC_CheckEsp (0C51249h)
00C517E3 mov esp,ebp
00C517E5 pop ebp
00C517E6 ret
由此可以分析:do..while是先执行{}里的内容,然后再判断是不是需要跳出循环,如果不跳出就跳到do..while开始的地方继续执行。
3、while语句分析
#include<iostream>
using namespace std;
#pragma warning (disable:4996)//2、whilevoid Fun(int x, int y) {while (x < y) {printf("%d\n", x);++x;}}int main() {Fun(0, 10);system("pause");return 0;}
009D1790 push ebp
009D1791 mov ebp,esp
009D1793 sub esp,0C0h
009D1799 push ebx
009D179A push esi
009D179B push edi
009D179C mov edi,ebp
009D179E xor ecx,ecx
009D17A0 mov eax,0CCCCCCCCh
009D17A5 rep stos dword ptr es:[edi]
009D17A7 mov ecx,offset _A8394B5C_循环语句测试@cpp (09DC029h)
009D17AC call @__CheckForDebuggerJustMyCode@4 (09D1325h)
009D17B1 mov eax,dword ptr [x]
009D17B4 cmp eax,dword ptr [y]
009D17B7 jge __$EncStackInitStart+39h (09D17D5h)
009D17B9 mov eax,dword ptr [x]
009D17BC push eax
009D17BD push offset string "%d\n" (09D7B30h)
009D17C2 call _printf (09D10CDh)
009D17C7 add esp,8
009D17CA mov eax,dword ptr [x]
009D17CD add eax,1
009D17D0 mov dword ptr [x],eax
009D17D3 jmp __$EncStackInitStart+15h (09D17B1h)
009D17D5 pop edi
009D17D6 pop esi
009D17D7 pop ebx
009D17D8 add esp,0C0h
009D17DE cmp ebp,esp
009D17E0 call __RTC_CheckEsp (09D1249h)
009D17E5 mov esp,ebp
009D17E7 pop ebp
009D17E8 ret
while语句是先判断,不符合就跳出循环,符合就执行循环体里的内容,最后再跳到开始进行判断
4、while(y--)语句分析
#include<iostream>
using namespace std;
#pragma warning (disable:4996)void Fun(int x, int y) {while (y--) {printf("%d\n", y);}}
int main() {Fun(0, 10);system("pause");return 0;
}
00FA1790 push ebp
00FA1791 mov ebp,esp
00FA1793 sub esp,0C4h
00FA1799 push ebx
00FA179A push esi
00FA179B push edi
00FA179C lea edi,[ebp-4]
00FA179F mov ecx,1
00FA17A4 mov eax,0CCCCCCCCh
00FA17A9 rep stos dword ptr es:[edi]
00FA17AB mov ecx,offset _A8394B5C_循环语句测试@cpp (0FAC029h)
00FA17B0 call @__CheckForDebuggerJustMyCode@4 (0FA1325h)
00FA17B5 mov eax,dword ptr [y]
00FA17B8 mov dword ptr [ebp-0C4h],eax
00FA17BE mov ecx,dword ptr [y]
00FA17C1 sub ecx,1
00FA17C4 mov dword ptr [y],ecx
00FA17C7 cmp dword ptr [ebp-0C4h],0
00FA17CE je __$EncStackInitStart+47h (0FA17E3h)
00FA17D0 mov eax,dword ptr [y]
00FA17D3 push eax
00FA17D4 push offset string "%d\n" (0FA7B30h)
00FA17D9 call _printf (0FA10CDh)
00FA17DE add esp,8
00FA17E1 jmp __$EncStackInitStart+19h (0FA17B5h)
00FA17E3 pop edi
00FA17E4 pop esi
00FA17E5 pop ebx
00FA17E6 add esp,0C4h
00FA17EC cmp ebp,esp
00FA17EE call __RTC_CheckEsp (0FA1249h)
00FA17F3 mov esp,ebp
00FA17F5 pop ebp
00FA17F6 ret
先执行while括号()里的内容,然后cmp判断是否需要跳出循环(当且仅当y==0的时候才会跳出循环!!!我竟然现在才发现😂😂😂),不需要就一路往后执行,然后再跳回到一开始的()的语句进行处理。
5、for循环分析
#include<iostream>
using namespace std;
#pragma warning (disable:4996)void Fun(int x, int y) {for (int i = x; i < y; i++) {printf("%d\n", i);}}int main() {Fun(0, 9);system("pause");return 0;
}
00E61790 push ebp
00E61791 mov ebp,esp
00E61793 sub esp,0CCh
00E61799 push ebx
00E6179A push esi
00E6179B push edi
00E6179C lea edi,[ebp-0Ch]
00E6179F mov ecx,3
00E617A4 mov eax,0CCCCCCCCh
00E617A9 rep stos dword ptr es:[edi]
00E617AB mov ecx,offset _A8394B5C_循环语句测试@cpp (0E6C029h)
00E617B0 call @__CheckForDebuggerJustMyCode@4 (0E61325h)
00E617B5 mov eax,dword ptr [x]
00E617B8 mov dword ptr [ebp-8],eax
00E617BB jmp __$EncStackInitStart+2Ah (0E617C6h)
00E617BD mov eax,dword ptr [ebp-8]
00E617C0 add eax,1
00E617C3 mov dword ptr [ebp-8],eax
00E617C6 mov eax,dword ptr [ebp-8]
00E617C9 cmp eax,dword ptr [y]
00E617CC jge __$EncStackInitStart+45h (0E617E1h)
00E617CE mov eax,dword ptr [ebp-8]
00E617D1 push eax
00E617D2 push offset string "%d\n" (0E67B30h)
00E617D7 call _printf (0E610CDh)
00E617DC add esp,8
00E617DF jmp __$EncStackInitStart+21h (0E617BDh)
00E617E1 pop edi
00E617E2 pop esi
00E617E3 pop ebx
00E617E4 add esp,0CCh
00E617EA cmp ebp,esp
00E617EC call __RTC_CheckEsp (0E61249h)
00E617F1 mov esp,ebp
00E617F3 pop ebp
00E617F4 ret
可以总结:for循环是先给i赋值,然后判断(i<y)是否成立,不成立就跳出循环,成立就执行循环体里面的操作,然后再跳转到上面的i++语句,给i进行增加,接着就继续判断(i<y)是否成立,循环往复,直到不满足i<y为止。
6、i++和++i在for循环当中效率一样吗?
i++:
00E617BD mov eax,dword ptr [ebp-8]
00E617C0 add eax,1
00E617C3 mov dword ptr [ebp-8],eax
++i:
008B17BE mov eax,dword ptr [ebp-8]
008B17C1 add eax,1
008B17C4 mov dword ptr [ebp-8],eax
有区别吗?》没区别,所以不要被培训班的老师骗了,编译器才是真理!!!
那么,今天的逆向学习内容到这里就结束了,又是收获满满的一天呢!喜欢的话多多点赞收藏吧!!!🧡🧡🧡🤞
相关文章:
do..while、while、for循环反汇编剖析
1、循环语句重要特征提取 循环语句最重要的特点就是执行的过程中会往上跳!!! 箭头往上跳的一般都是循环语句,比如下面的for循环: 2、do..while语句反汇编 #include<iostream> using namespace std; #pragma …...
【代码随想录】刷题Day53
1.最长公共子序列 1143. 最长公共子序列 和之前的一道题目的区别就是这个子序列不需要每个字符相邻。那么条件就变成两种了,一种是当前的字符相同,一种是不同。相同跟之前的条件一样;不同则需要继承上次比较的较大值。if (text1[i - 1] tex…...
MySQL 索引及查询优化总结
一个简单的对比测试 前面的案例中,c2c_zwdb.t_file_count表只有一个自增id,FFileName字段未加索引的sql执行情况如下: 在上图中,typeall,keynull,rows33777。该sql未使用索引,是一个效率非常低…...
什么是AJAX?
AJAX是一种基于Web的技术,它允许Web应用程序在不刷新整个页面的情况下与服务器进行交互。通过AJAX,Web应用程序可以使用JavaScript向服务器发送异步请求并在不干扰用户的情况下更新页面的部分内容。 AJAX是Asynchronous JavaScript and XML的缩写。尽管…...
报表生成器FastReport .Net用户指南:显示数据列、HTML标签
FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…...
bootstrap-dialog弹框,去掉遮盖层,可移动
1.去掉遮盖层的设置data-backdrop"false" <div class"modal fade" id"modal" aria-modal"true" role"dialog" data-backdrop"false" style"width:50%"><div class"modal-dialog modal-l…...
7. user-Agent破解反爬机制
文章目录 1. 为什么要设置反爬机制2. 服务器如何区分浏览器访问和爬虫访问3. 反爬虫机制4. User-Agent是什么5. 如何查询网页的User-Agent6. user-agent信息解析7. 爬虫程序user-agent和浏览器user-agent的区别8. 代码查看爬虫程序的user-agent9. 在代码中加入请求头信息 1. 为…...
3.Nginx+Tomcat负载均衡和动静分离群集
文章目录 NginxTomcat负载均衡和动静分离群集Nginx作用实验七层反向代理nginx动静分离四层反向代理负载均衡 NginxTomcat负载均衡和动静分离群集 Nginx是-款非常优秀的HTTP服务器软件 支持高达50 000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、CPU等系统资源…...
数据结构与算法之树结构
目录 为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表,他们都存在着诟病;比如查找某个数必须从头开始查,消耗较多的时间。使用树结构,在插入和查找的性能上相对都会比线性结构要好 树结构…...
【python】 用来将对象持久化的 pickle 模块
pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化。 比如,我程序里有一个 python 对象,我想把它存到磁盘里ÿ…...
【博客654】prometheus配置抓取保护以防止压力过载
prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增,以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样,标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时,虽然它不太可能结束…...
Backtrader官方中文文档:第十三章Observers观察者
本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 本章包含 backtrader 官方Observers章节全部内容,入口 : https://backtrader.com/docu/observers-and-sta…...
算法leetcode|54. 螺旋矩阵(rust重拳出击)
文章目录 54. 螺旋矩阵:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java:每次循环移动一步:每次循环完成一个顺时针:…...
单容水箱建模(自衡单容水箱+无自衡单容水箱)
自衡单容水箱Simulink建模和PLC源代码请参看下面文章链接: 单容双容水箱建模(simulink仿真+PLC代码)_RXXW_Dor的博客-CSDN博客PLC通过伯努利方程近似计算水箱流量详细内容请参看下面的文章博客PLC通过伯努利方程近似计算水箱流量(FC)_怎么用伯努利方程求某水位流量_RXXW_Dor的…...
分享Python7个爬虫小案例(附源码)
本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习。注:若涉及到版权或隐私问题,请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…...
我用ChatGPT写2023高考语文作文(一):全国甲卷
2023年 全国甲卷 适用地区:广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间,但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考?请写一篇文章。 要求:选准角度,确定立意,明确文体&am…...
c++ modbusTCP
//Modbus TCP是一种基于TCP/IP协议的Modbus协议,它允许Modbus协议通过以太网进行通信。 //在C中,可以使用第三方库来实现Modbus TCP通信,例如libmodbus和QModbus。 //使用libmodbus库实现Modbus TCP通信的示例代码如下: //c #incl…...
linux(信号结尾)
目录: 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…...
【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞
node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽,有些二五仔习惯搞点自研的安全扫描工具,然后加点DIY元素,他也不管扫的准不准,就要给你报个高中危的漏洞,然后就要去修复&…...
在linux 上安装 NFS服务器软件
在 Ubuntu Linux 中创建 NFS 文件系统通常需要完成以下步骤: 安装 NFS 服务器软件。您可以在终端上使用以下命令来安装所需的软件包。sudo apt-get update sudo apt-get install nfs-kernel-server创建要共享的目录。例如,您可以创建一个名为 /var/nfs/shared 的目录。sudo m…...
网卡中的Ring buffer -- 解决 rx_resource_errors 丢包
1、软硬件环境 硬件: 飞腾E2000Q 平台 软件: linux 4.19.246 2、问题现象 网卡在高速收包的过程中,出现 rx error , 细查是 rx_resource_errors 如下: rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…...
六月九号补题日记:Codeforces Round 877 (Div. 2)
专注是不够的,很重要的一方面在于细节,关注细节:精细和专注才是成功的重点!!! A 题意:给你一堆数字,说这一堆数字是由最初的两个数字相减得到的,让你求出两个数字其中一…...
python基础选择题,高中适用
1. 下面哪个是 Python 的注释符号? A. // B. # C. /* D. ; 答案:B 2. 下面哪个是 Python 的赋值运算符? A. B. C. ! D. > 答案:A 3. 下面哪个是 Python 的逻辑运算符? A. && B. || C. ! D. & 答…...
Linux 面试题-(腾讯,百度,美团,滴滴)
Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.20…...
DDD--战略设计步骤
在领域驱动设计(Domain-Driven Design,DDD)中,战略设计是指在系统的整体层面上考虑领域模型的组织和架构。下面是一些战略设计的详细步骤: 确定限界上下文(Bounded Context):首先&a…...
Web Scoket简述
Web Socket 简介 初次接触 Web Socket 的人,我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。http基于请求响应实现。 (准确来说HTTP…...
“Docker 技术在企业中的应用及挑战解决方案“
Docker 技术是一种基于容器化的应用部署和管理技术。随着云计算的普及和应用的不断增多,Docker 技术在企业中的应用越来越广泛。本文将介绍 Docker 技术的基本概念、优势和应用场景,并讨论如何在企业中应用 Docker 技术。 一、Docker 技术概述 Docker …...
vue中开发包、生产包、全局包的区别以及安装语法
目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包:开发包 (Development build),生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…...
list的模拟实现
前言 list是STL中重要的容器,了解它的原理对于我们掌握它是有很多的帮助的,一般list和vector都是一起来使用的,因为它们的优缺点不同,刚好可以互补。list的优点是任意位置的插入和删除都很快,它的缺点是不支持随机访问…...
ChatGLM简介和SSE聊天接口测试效果
开发公司 智谱AI是由清华大学计算机系技术成果转化而来的公司,致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型GLM-130B,并构建了高精度通用知识图谱,形成数据与知识双轮驱动的认知引擎,基于此模型…...
嘉兴营销型网站建设/深圳知名seo公司
Docker? 为什么要使用Docker? 与卿画眉共浮生关注 0.2162018.10.24 09:31:12字数 1,886阅读 3,647 Docker 是一个开源的容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编译测试通过的容器可…...
江油网站制作/百度指数搜索指数的数据来源
相信大家也能感受到,其实用多线程是很麻烦的,包括线程的创建、销毁和调度等等,而且我们平时工作时好像也并没有这样来 new 一个线程,其实是因为很多框架的底层都用到了线程池。线程池是帮助我们管理线程的工具,它维护了…...
aspx网站实例/seo整站优化费用
你的外部for循环条件给你带来了问题.这是你的循环: –for (int i 0; i < array[i].length; i)现在,当我达到值3时,您正在尝试访问数组[3] .length.这将抛出IndexOutOfBounds异常.由于每个内部数组的大小相同,您可以将循环更改为: –for (int i 0; i…...
京东网站建设步骤/广东云浮疫情最新情况
全球最厉害的14位程序员都有哪些人?接下来让我们一起来看一下让业界膜拜的这十几位顶级编程大神。 注意,排名不分先后。 01 Jon Skeet 个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的问答量保持在425个左右。 …...
做网站需要哪些步骤/百度网盘电脑版下载
2019独角兽企业重金招聘Python工程师标准>>> linux系统查看所有服务的命令 以前用过这么命令运行后可以在linux系统查看所有服务的命令是什么,有一个文本菜单,可以很方面的选择启动或者停止服务,诸如ftp, ssh, telnet之类的但是我…...
网页设计做网站首页/域名注册万网
前言 上一篇的标题改了一下,以一、二、三为章节对读者来说是种困扰,现在的标题是依照项目进度来编写的。上篇文章地址为 https://segmentfault.com/a/11... 这一系列文章并不准备写太多章节,大概规划的只有4~5章左右,具体实现代码…...