do..while、while、for循环反汇编剖析

news2024/11/28 23:47:25

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、while

void 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 

有区别吗?》没区别,所以不要被培训班的老师骗了,编译器才是真理!!!

那么,今天的逆向学习内容到这里就结束了,又是收获满满的一天呢!喜欢的话多多点赞收藏吧!!!🧡🧡🧡🤞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpinalHDL快速入门】2、新建SpinalHDL工程,通过计数器Demo快速上手

文章目录 新建工程各个工具版本build.sbt 示例build.properties 示例如何在IEDA中更新 SpinalVersion 并 Reload sbt Project SpinalHDL入门例子&#xff1a;计数器demo1demo2&#xff08;支持reset信号异步复位&#xff0c;低电平有效&#xff09;demo3&#xff08;一个文件&a…

Flume学习--1、Flume概述、Flume入门、

1、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式结构&#xff0c;灵活简单。 Flume最主要的作用就是实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 1.2…

C#winform多国语言应用实例

我们在开发项目中,一般需要软件支持多种语言,供不同客户使用。本文实例讲解实现办法。 1 窗体项目创建 添加控件MenuStrip、comboBox及Button,并修改对应显示文本,combobox编辑项输入英语 确定窗体的Localizable属性为true,自动创建Form1.resx,为False时,没有Form1.r…

基站机房:保障通信网络稳定,如何解决安全隐患?

基站机房作为无线通信网络的关键组成部分&#xff0c;承载着大量的网络设备和通信设施&#xff0c;对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商&#xff0c;动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…

vue使用高德地图--附带移动获取当前城市信息

高德地图 1.使用准备申请密钥vue使用 2.移动地图获取城市案例(注意事项)3.总结 1.使用准备 申请密钥 登录注册高德开放平台进入控制台 创建应用 申请key–生成key和安全密钥(2021之后key需要配合安全密钥使用) 注意&#xff1a;安全密钥需要在key之前 vue使用 首先在pubil…

一款功能强大的报表引擎-VeryReport报表引擎

在企业管理中&#xff0c;数据分析和决策制定是非常重要的环节。而报表则是这个过程中最常用的工具之一。但是&#xff0c;传统的报表设计与展现方式已经无法满足企业对于数据分析和报表展示的需求。为了解决这些问题&#xff0c;我们向大家推荐一款新一代Web报表软件——VeryR…

越是大型企业越需要企业内部知识库?

随着信息时代的到来&#xff0c;越来越多的企业开始注重知识管理。知识管理是一种通过有效地捕捉、共享和利用企业内部的知识资源&#xff0c;促进企业创新和发展的方法。而企业内部知识库作为知识管理的一种重要方式&#xff0c;对于大型企业来说尤为重要。 一、大型企业内部…

苹果相关网站和服务器状态

https://www.apple.com.cn/cn/support/systemstatus/

googlecloud谷歌云的初学体会(1)

googlecloud谷歌云入门&#xff08;1&#xff09; 一、纯小白自述二、云是个什么云三、装一个软件&#xff08;资源、服务&#xff09;四、服务器&#xff08;爷爷提供服务的电脑&#xff09;五、PGSQL的安装六、总结 一、纯小白自述 自己是个小白&#xff0c;仅仅懂得几句sql…

华为OD机试真题 Java 实现【寻找密码】【2023Q1 100分】,附详细解题思路

一、题目描述 小王在进行游戏大闯关,有一个关卡需要输入一个密码才能通过,密码获得的条件如下: 在一个密码本中,每一页都有一个由 26 个小写字母组成的若干位密码,从它的末尾开始依次去掉一位得到的新密码也在密码本中存在。 请输出符合要求的密码,如果由多个符合要求…

爬虫如何选择工具和编程语言

爬虫选择工具和编程语言需要根据具体的需求和技术水平来决定。以下是一些常用的工具和编程语言&#xff1a; 工具&#xff1a; Scrapy&#xff1a;一个基于Python的高级爬虫框架&#xff0c;可用于快速开发和部署爬虫。Beautiful Soup&#xff1a;一个Python库&#xff0c;用…

基于“三维六类”干扰分析模型进行FDD900干扰规避优化指导

1.概述 随着网络发展&#xff0c;鉴于900M覆盖上的优势&#xff0c;为增强深度覆盖及竞对提升&#xff0c;当前FDD 900M已在加快部署&#xff0c;但随之也带来了干扰问题。当前&#xff0c;干扰排查成为FDD 900M部署过程中大量存在的难题。由于干扰排查难度大&#xff0c;且排…

线程池和使用

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 线程池的目的线程池的参…

360,可真小看你了:耍流氓耍到日本人身上,凌晨2点笑得我胃疼

天下苦流氓软件久矣 大厂的软件&#xff0c;都有点牛皮癣特性&#xff1a;捆绑安装广告推广&#xff0c;简直无所不用其极&#xff0c;身为用户着实无可奈何。 此处点名四大全家桶家族——360、鲁大师、金山毒霸、2345。 说来好笑&#xff0c;之前发的文章不是有关于金山的嘛…

Cefsharp-Winform-113.3.50(chromium5672)最新版体验兼容性测试

一、下载nupkg包(4个)提示:(不支持H264,支持MP3,WEBGL,WEBGL2等)支持H264最新版本109.*自行搜索 winform包地址(依赖包下载地址如下):NuGet Gallery | CefSharp.WinForms 113.3.50 https://globalcdn.nuget.org/packages/cefsharp.winforms.113.3.50.nupkg https://…

仓库拣货标签10代—电子料架

CK_Label_v10 无线电子标签拣货系统特点与效益 无线通信&#xff0c;极简快速部署 超低功耗&#xff0c;墨水屏显示 多彩指示灯&#xff0c;支持24V外接供电 按键及三色高亮LED指示灯指示 3位0.8寸高亮LED数码管显示 提升作业速度与品质 实现无纸化标准化作业 缩短操…

怎么快速掌握Python爬虫技术?

Python总的来说是一门比较容易入门的编程语言&#xff0c;因为它的语法简洁易懂&#xff0c;而且有很多优秀的教程和资源可供学习。相比其他编程语言&#xff0c;Python 的学习曲线较为平缓&#xff0c;初学者可以很快上手&#xff0c;但要想深入掌握 Python&#xff0c;还需要…

chatgpt赋能python:用Python实现ping命令:掌握网络连接的艺术

用Python实现ping命令&#xff1a;掌握网络连接的艺术 当我们需要测试网络连接的时候&#xff0c;ping命令是最经典的选择之一。然而&#xff0c;在一些情况下&#xff0c;使用命令行并不是很方便。那么&#xff0c;有没有可能用Python编写一个类似ping的功能呢&#xff1f; …

ISO21434 概念阶段网络安全(六)

目录 一、概述 二、目标 三、项目定义 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、网络安全目标 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 五、网络安全概念 5.1 输入 5.1.1 先决条件 5.1.2 …

phpMyAdmin连接MySQL,出现服务器拒绝连接解决方法

当你登录mysql的时候出现下面情况时 把config.inc.php删除就可以&#xff0c;或者修改config.inc.php里的 $cfg[Servers][$i][controluser] ; $cfg[Servers][$i][controlpass] ; 注释掉就会弹出来要求登陆。 例如我的文件位置是在C:\wamp\apps\phpmyadmin4.1.14&#xff…