精华内容
下载资源
问答
  • 2017-09-02 11:30:37

    条件语句

    if语句有三种用法

    1.if(表达式){...}    //如果表达式的值为真,则执行括号内的复合语句


    2.if(表达式){语句1}

    else{语句2}         //如果表达式的值为真,则执行语句1,否则执行语句2


    3.if(表达式){语句1}

    else if{语句2}

    else if{语句3}

    ...

    else{语句m}        //如果表达式的值为真,则执行对应的语句然后跳出if语句执行后面的语句,若所有表达式均为假,则执行语句m,然后执行后面的程序。


    4.当else if语句过多时,可以改用switch语句

    用法:

    switch(表达式){

    case 0:

    ...

    break;

    case 1:

    ...

    break;

    ...

    default:

    break;

    }

    如果表达式的值等于某个case语句后的值,则会执行该case语句后面的语句,遇到break语句中断。若表达式的值不等于任何一个case语句后的值,则执行default标签下的语句。


    循环语句

    循环语句有三种方法

    1.while语句

    while(表达式){...}  //若表达式的值为真,则执行循环体内的语句,否则就跳出循环体执行后面的语句。


    2.do while语句

    do{...}while{表达式};  //先执行循环体内的语句,再判断表达式的值是否为真,若为真则继续执行循环体,否则跳出循环。while表达式后面有省略号

    区别:do while循环,循环次数>=1;

    while循环,循环次数>=0


    3.for语句

    for(初始化语句;条件语句;控制语句){...}  //for(int i; i<9; i++)

    for循环的执行顺序和其他的循环语句不一样,首先执行初始化语句,然后测试条件语句,若条件语句成立的话则执行循环体,然后执行控制语句,然后再测试条件语句,重复以上执行过程,直到条件语句不成立才跳出循环。


    循环的终止和中断

    终止:break语句,执行循环体时,若执行到break语句会直接跳出循环。

    中断:

    continue:执行循环体时,若执行到continue语句会跳过这次循环的结果,然后执行下一次循环。

    goto:用法为 goto label;  goto为无条件转移,用法几乎没有限制,遇到goto语句会跳到goto后面的标签的语句,不建议使用,会使得程序看起来混乱

    return:执行循环体时,执行到return语句时,会终止方法,表示方法运行结束,剩余的代码不再执行,return后面的返回值可以是常量、变量、表达式。


    更多相关内容
  • 继上一篇我们学习了脚本语言 VBScript 的函数和条件语句后,今天我们继续来看看 VBScript 中的循环语句。   循环语句的作用就是重复执行程序代码,循环可分为三类:一类在条件变为“假”之前重复执行语句,一...
  • 5Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0非空(null)值为true,0或者null...

    5Python条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。
    可以通过下图来简单了解条件语句的执行过程:
    在这里插入图片描述
    Python程序语言指定任何非0和非空(null)值为true,0或者null为false。
    Python编程中if语句用于控制程序的执行,基本形式为:

    If 判断条件:
        执行语句…
    else:
        执行语句….
    

    其中”判断条件”成立时(非零),则执行后面的语句,而执行内存可以多行,以缩进来区分表示同一范围。else为可选语句,当需要在条件不成立时执行内容可以执行相关语句。
    Gif演示:
    在这里插入图片描述
    具体例子如下:

    # -*- coding: UTF-8 -*-
    
    flag = False
    name = 'luren'
    if name == 'python':           #判断变量是否为 python
        flag = True                #条件成立时设置标志为真
        print('welcome boss')      #并输出欢迎信息
    else:
        print(name)                #条件不成立时输出变量名称
    

    运行结果:

    luren
    

    if 语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)来表示其关系。
    当判断条件为多个值时,可以使用以下形式:

    if 判断条件1:
        执行语句1elif 判断条件2:
        执行语句2elif 判断条件…
        执行语句3else:
        执行语句4

    实例如下:

    # -*- coding: UTF-8 -*-
    
    num = 5
    if num == 3:            #判断num的值
        print("boss")
    elif num == 2:
        print("user")
    elif num == 1:
        print("worker")
    elif num < 0:           #值小于零是输出
        print("error")
    else:
        print("roadman")    #条件均不成立时输出
    

    运行结果:

    roadman
    

    由于python并不支持switch语句,所以多个条件判断,只能用elif来实现,如果判断需要多个条件同时判断时,可以使用or(或),表示两个条件有一个成立时判断条件成功;使用and(与)时,表示只有两个条件同时成立的情况下,判断条件才成功。

    # -*- coding: UTF-8 -*-
    
    num = 9
    if num >= 0 and num <= 10:  # 判断值是否在0~10之间
        print('hello')
    # 输出结果: hello
    
    num = 10
    if num < 0 or num > 10:  # 判断值是否在小于0或大于10
        print('hello')
    else:
        print("undefine")
    # 输出结果:undefine
    
    num = 11
    # 判断值是否在0~5或者10~15之间
    if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):
        print("hello")
    else:
        print("undefine")
    #输出结果:undefine
    

    当if有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 and 和 or 的优先级低于>(大于)、<(小于)等判断符号,即大于和小于在没有括号的情况下会比与或要优先判断。

    # -*- coding: UTF-8 -*-
    
    var = 100
    
    if (var == 100) : print("变量var的值为100")
    
    print("Good Bye")
    

    5.1简单的语句组

    # -*- coding: UTF-8 -*-
    
    var = 100
    
    if (var == 100) : print("变量var的值为100")
    
    print("Good Bye")
    

    运行的值是:

    变量var的值为100
    Good Bye
    

    6Python循环语句

    循环语句允许我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式。
    在这里插入图片描述

    Python提供了for循环和while循环(在Python中没有没有do…while循环):
    在这里插入图片描述

    案例:

    def deduplication(self,nums):  #找出排序数组的索引
        # for i in range(len(nums)) :
        #     if nums[i] == self:
        #         return i
        i = 0
        for x in nums:
            if self > x:
                i += x
        return i
    
    print(deduplication(5,[1,3,5,6]))
    

    运行结果:

    4
    

    7Python While循环语句

    Python编程中while语句用于循环执行程序,即在某条件下,循环执行某段程序,以处需要重复处理的相同任务。其基本形式为:

    while 判断条件(condition):
        执行语句(statements)……
    

    执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true.
    当判断条件假false时,循环结束。
    执行流程图如下:
    在这里插入图片描述
    Gif 演示 Python while 语句执行过程
    在这里插入图片描述
    复杂一点
    在这里插入图片描述
    实例:

    # -*- coding: UTF-8 -*-
    
    count = 0
    while (count < 9):
        print("The count is :",count)
        count = count + 1
    
    print("Good bye!")
    

    运行结果:

    D:\installed\Anaconda3\python.exe "E:/workspace/python/python/06_Python While循环.py"
    The count is : 0
    The count is : 1
    The count is : 2
    The count is : 3
    The count is : 4
    The count is : 5
    The count is : 6
    The count is : 7
    The count is : 8
    Good bye!
    

    While语句时还有另外两个重要的命令continue,break来跳过循环,break则是用于退出循环,此外”判断条件”还可以是个常值,表示循环必定成立,具体用法如下:

    # -*- coding: UTF-8 -*-
    
    i = 1
    while i < 10:
        i += 1
        if i % 2 > 0:          #非双数时跳过输出
            continue
        print(i)               #输出双数2、4、6、8、10
    
    print("=============================")
    
    i = 1
    while 1:                   #循环条件为1必定成立
        print(i)               #输出1~10
        i += 1
        if i > 10:             #当i大于10时跳出循环
            break;
    

    运行结果:

    D:\installed\Anaconda3\python.exe "E:/workspace/python/python/06_Python while循环/01_continue_break.py"
    2
    4
    6
    8
    10
    =============================
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    7.1无限循环

    -- coding: UTF-8 --

    var = 1
    while var == 1 :  # 该条件永远为true,循环将无限执行下去
       num = input("Enter a number  :")
       print("You entered: ", num)
    
    print("Good bye")
    

    运行结果:

    D:\installed\Anaconda3\python.exe "E:/workspace/python/python/06_Python while循环/02_无限循环.py"
    Enter a number  :12
    You entered:  12
    Enter a number  :14
    You entered:  14
    Enter a number  :16
    You entered:  16
    Enter a number  :
    

    7.2循环使用else语句

    在Python中,while … else在循环条件为false时执行else语句块:

    # -*- coding: UTF-8 -*-
    
    count = 0
    while count < 5:
        print(count,"is less than 5")
        count = count + 1
    else:
        print(count,"is not less than 5")
    

    输出结果:

    0 is less than 5
    1 is less than 5
    2 is less than 5
    3 is less than 5
    4 is less than 5
    5 is not less than 5
    

    7.3简单语句组:

    类似if语句的语法,如果你的while循环中只有一条语句,你可以将该语句与while写在同一行中,如下所示:

    # -*- coding: UTF-8 -*-
    
    flag = 1
    
    while (flag):print("Given flag is really true!")
    
    print("Good bye!")
    

    8Python for循环

    Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
    语法:

    for interating_var in sequence:
    statements(s)
    

    流程图:
    在这里插入图片描述
    图 1 流程图

    案例:

    # -*- coding: UTF-8 -*-
    
    for letter in 'Python':     #第一个实例
        print("当前字母:",letter)
    
    print("-------------------------")
    
    fruits = ['banana', 'apple',  'mango']
    for fruit in fruits:        #第二个实例
        print("当前水果:",fruit)
    
    print("Good bye")
    

    运行结果:

    当前字母: P
    当前字母: y
    当前字母: t
    当前字母: h
    当前字母: o
    当前字母: n
    -------------------------
    当前水果: banana
    当前水果: apple
    当前水果: mango
    Good bye
    

    8.1通过序列索引迭代

    另外一种执行循环方式是通过索引,如下实例:

    # -*- coding: UTF-8 -*-
    
    fruits = ['banana','apple','mango']
    for index in range(len(fruits)):
        print("当前水果:",fruits[index])
    
    print("Good bye!")
    

    运行结果:

    当前水果: banana
    当前水果: apple
    当前水果: mango
    Good bye!
    

    以上实例我们使用了内置函数len()和range()函数,函数len()返回列表的长度,即元素的个数。range返回一个序列的数。

    8.2循环使用else语句

    在python中,for … else表示这样的意思,for中的语句和普通的没有区别,else中的语句会在循环正常执行完(即for不是通过break跳出而中断的)的情况下执行,while … else也是一样。

    9Python循环嵌套

    Python语言允许在一个循环体里面嵌入另一个循环。
    Python for循环嵌套语法:

    for iterating_var in sequence: 
       for iterating_var in sequence: 
          statements(s) 
       statements(s)
    

    Python while循环嵌套语法:

    while expression: 
      while expression: 
        statement(s) 
      statement(s)
    

    你可以在循环体内嵌其它的循环体,如在while循环中可以嵌入for循环,反之,你可以在for循环中嵌入while循环。

    # -*- coding: UTF-8 -*-
    
    i = 2
    while i < 100:
        j = 2
        while j <= (i / j):
            if not (i % j):
                break
            j = j + 1
        if j > i / j:
            print(i, " 是素数")
        i = i + 1
    
    print("Good bye!")
    

    运行结果:

    2  是素数
    3  是素数
    5  是素数
    7  是素数
    11  是素数
    13  是素数
    17  是素数
    19  是素数
    23  是素数
    29  是素数
    31  是素数
    37  是素数
    41  是素数
    43  是素数
    47  是素数
    53  是素数
    59  是素数
    61  是素数
    67  是素数
    71  是素数
    73  是素数
    79  是素数
    83  是素数
    89  是素数
    97  是素数
    Good bye!
    

    10Python break语句

    Python break语句,就像在C语言中,打破了最小封闭for或while循环。
    break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
    break语句用在while和for循环中。
    如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。

    Python语言 break 语句语法:

    break
    

    流程图:
    在这里插入图片描述

    实例:

    # -*- coding: UTF-8 -*-
    
    for letter in 'Python':      #第一个实例
        if letter == 'h':
            break
        print("当前字母:",letter)
    
    var = 10
    while var > 0:
        print('当前变量值:',var)
        var = var - 1
        if var == 5:      #当变量var等于5时退出循环
            break
    
    print("Good bye!")
    

    运行结果:

    当前字母: P
    当前字母: y
    当前字母: t
    当前变量值: 10
    当前变量值: 9
    当前变量值: 8
    当前变量值: 7
    当前变量值: 6
    Good bye!
    

    11Python continue语句

    Python continue 语句跳出本次循环,而break跳出整个循环。
    continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。
    continue语句用在while和for循环中。
    Python 语言 continue 语句语法格式如下:

    continue
    

    流程图:
    在这里插入图片描述
    实例:

    # -*- coding: UTF-8 -*-
    
    for letter in 'Python':    #第一个实例
        if letter == 'h':
            continue
        print('当前字母:',letter)
    
    var = 10
    while var > 0:
        var = var - 1
        if var == 5:
            continue
        print('当前变量值:',var)
    print('Good bye')
    

    运行结果:

    当前字母: P
    当前字母: y
    当前字母: t
    当前字母: o
    当前字母: n
    当前变量值: 9
    当前变量值: 8
    当前变量值: 7
    当前变量值: 6
    当前变量值: 4
    当前变量值: 3
    当前变量值: 2
    当前变量值: 1
    当前变量值: 0
    Good bye
    

    12Python pass语句

    Python pass是空语句,是为了保持程序结构的完整性。
    Pass不做任何事情,一般做占位语句。
    Python语言pass语句格式化如下:

    pass
    

    案例:

    # -*- coding: UTF-8 -*-
    
    #输出Python的每个字母
    for letter in 'Python':
        if letter == 'h':
            pass
            print("这是pass块")
        print('当前字母:', letter)
    
    print("Good bye!")
    

    运行结果:

    当前字母: P
    当前字母: y
    当前字母: t
    这是pass块
    当前字母: h
    当前字母: o
    当前字母: n
    Good bye!
    
    展开全文
  • 这是作者安全攻防进阶系列博客,包括恶意样本分析、逆向...这篇文章将继续带领大家来学习科锐钱林松老师在华中科技大学的分享视频,详细讲解条件语句和循环语句源码还原及流程控制逆向。基础性文章,希望对您有所帮助~

    从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

    接下来我将开启新的安全系列,叫“安全攻防进阶篇”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

    前文作者讲解了OllyDbg和Cheat Engine工具逆向分析用法,完成植物大战僵尸的游戏辅助器,包括修改阳光值和自动拾取阳光两个功能。这篇文章将继续带领大家来学习科锐钱林松老师在华中科技大学的分享视频,详细讲解条件语句和循环语句源码还原及流程控制逆向。流程控制逆向的具体任务包括:

    • 分支结构的分析要点
      if-else
    • 循环结构的分析要点
      do-while、while、for

    话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好或侵权的地方,可以联系我删除。基础性文章,希望对您有所帮助,作者目的是与安全人共同进步,也强烈推荐大家去看看钱老师的视频,加油~

    作者的github资源:
    软件安全:https://github.com/eastmountyxz/Software-Security-Course
    其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
    Windows-Hacker:https://github.com/eastmountyxz/Windows-Hacker-Exp


    声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。(参考文献见后)

    前文回顾:
    [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向
    [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例
    [安全攻防进阶篇] 三.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏



    一.C++逆向条件结构基础入门

    大家写过相关的算法吗?
    加密代码中会涉及循环和分支,你要识别算法,首先就是需要将它的算法处理流程识别出来。当我们还原出等价的高级代码之后,就没有逆向分析人员的事情了,因为接下来涉及到密码学、数学相关人员的工作,逆向人员把加密的代码还原出来后就应该扔给研究密码学的数学家,他们负责玩数学对抗,而逆向关注的是编译原理和代码还原。同时,逆向还涵盖了识别对象、识别算法、识别优化、识别虚函数对象的继承关系等等,这里主要结合项目相关的加密和解密进行讲解。接着作者准备穿插着VC++6.0和VS2019两个版本进行讲解。


    1.单分支结构分析

    第一步,通过VC++6.0编写一个最简单的程序,创建工程名称为“RE_SF”。

    在这里插入图片描述
    在这里插入图片描述

    运行结果如下图所示,可以看到“Hello World”。

    在这里插入图片描述


    第二步,编写单分支结构的相关代码。

    #include "stdafx.h"
    
    int main(int argc, char* argv[])
    {
    	if (argc > 8 )
    	{
    		printf("argc > 8\r\n");
    	}
    	return 0;
    }
    

    接着选择“Win32 Release”编译运行代码。

    在这里插入图片描述


    第三步,接着用OD软件打开EXE文件。
    此时创建的工程目录分布如下图所示。

    在这里插入图片描述

    OllyDbg打开之后显示如下图所示的界面,程序入口地址是0x00401051。

    • 程序入口:0x00401051

    在这里插入图片描述


    第四步,首先我们需要定位main函数,其方法非常简单,找到有三个PUSH的下面就是main函数,因为main函数有三个参数(argc、argv[],、envp[])。接着按F2下断点。

    • 主函数:0x00401100

    在这里插入图片描述

    继续按下F7跟进,会看到一个单分支结构。那么,单分支结构它有什么特点呢?

    • 进入主函数:0x00401000

    在这里插入图片描述


    第五步,先给大家普及单分支语句的代码定式基础知识。
    在高级语言中单分支代码定式如下:

    //程序语言
    if(...)
    {
        ...
    }
    
    //代码定式
    IF_BEGIN:
        jxx IF_END
            ...
        IF_END:
            ...
    

    为什么需要记住这个代码定式呢?
    因为对于流程控制的识别,我们关键是要找到IF语句的作用域(上界和下界),上界在jxx的位置,称之为IF_BEGIN。接着有个jxx条件跳转,跳转到目标且没有其他的特征,这种就称之为单分支的代码定式。

    回到我们的汇编代码,拿到这个代码之后,发现存在一个箭头指向跳转目标,这样就出现了IF模块的上界和下界,条件判断作为IF的上界,条件跳转的目标作为IF下界,通过这种套路方式来还原代码。

    在这里插入图片描述


    第六步,分析嵌套的单分支语句。
    假设我们的判断中再嵌套一层或增加一个分支,又该怎么判断呢?对于我们还原代码的人来说,不用管它,你把上下界圈出来,然后递归解决。所有流程问题只要找到上下界,剩下的问题就变成了顺序结构,再看着代码一条条还原即可。

    在这里插入图片描述

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    	if (argc > 8 )
    	{
    		printf("argc > 8\r\n");
    		if (argc < 80)
    		{
    			printf("argc < 80\r\n");
    		}
    	}
    
    	system("pause");
    	return 0;
    }
    

    接着运行程序生成新的EXE程序,然后通过OD软件打开分析,给主函数下个断点然后进入主函数显示如下图所示的界面。

    • 主函数内容:0x00401000

    在这里插入图片描述


    第七步,同样的方法将两层单分支语句的上下界圈出来。
    我们发现这两个判断的下界重合了,都是跳转到0x00401029位置,这就明显是个嵌套。

    在这里插入图片描述

    总结下IF语句的特点:

    • 观察它的条件跳(上下界)
    • 条件跳的目标上面的代码没有其他特征,即“ADD ESP, 4"

    那么,怎么还原出高级代码呢?


    第八步,通过汇编代码还原出高级代码。
    还原代码需要进行反条节操作,并且学会查询相关指令。比如JLE、JGE是什么意思呢?

    • JLE(jump if less or equal,or not greater):汇编语言中的条件转移指令,小于或等于则条件转移
    • JGE:大于或等于转移指令

    注意,在还原的时候需要做反条件操作。那么,什么叫反条件呢?具体解释如下:

    • JLE:小于等于跳转 --> 代码还原就是“不小于等于”,即:大于跳转
    • JGE:大于等于跳转 --> 代码还原就是“不大于等于”,即:小于跳转

    反条件
    因为当我们满足这个条件的时候它会跳转到另一个地方(结束地方),它没有执行具体的代码;所以如果我们想要执行模块中的代码,就需要反条件处理。即汇编的语义和高级语言的语义是反的,高级语言的语义是满足条件则执行语句块,而汇编的语义是满足条件不执行语句块。

    接着我们继续看触发跳转的代码,它是通过CMP比较来触发的。

    • CMP ESI, 8
      ESI是通过参数传递过来的,然后和8进行不小于等于的比较
    • CMP ESI, 50
      ESI和50进行不大于等于的比较

    在这里插入图片描述

    此时,我们再将单分支步骤简单归纳如下:

    • (1) 通过反汇编代码序列,匹配代码定式;
    • (2) 如果是单分支if结果,则将条件转义指令jxx做反条件还原

    第九步,接着我们换个工具用VS2019打开我们的代码,生成新的Release版本。

    在这里插入图片描述

    然后删除本地的Release资源,生成一个新的Release方案。

    在这里插入图片描述


    第十步,用IDA Pro打开可执行EXE程序进行分析。
    同样,使用IDA也是可以进行逆向分析的,打开新生成的逆向分析工具如下所示。

    在这里插入图片描述

    右键选择“Text View”查看源代码。

    在这里插入图片描述

    找到main函数,然后点击“_main”位置高亮显示。

    在这里插入图片描述

    按下“N”键可以对函数进行重命名,如下图所示。

    在这里插入图片描述

    注意,前面分享的识别方法和编译器版本、编程语言(C++、VB)等都没有关系,它是编译原理的问题。接着我们重点还是回归到代码上去,点击“loc_401039”函数高亮,同样的方法划分出这个单分支的上界和下界,并且嵌套了一个单分支,最终还原出源代码。

    在这里插入图片描述

    所以,不论使用VC++6.0或VS编译工具,还是使用IDA或OD分析工具,它们还原代码的原理及方法都是一样的。在实际项目中,不论你用什么分析工具,最终能分析出结果就好。



    2.双分支结构分析

    第一步,编写双分支代码。

    在这里插入图片描述


    第二步,普及双分支语句的代码定式基础知识。
    在高级语言中双分支代码定式如下。该代码序列关键是发现jxx后,需要检查目标看看下面有没有一个jmp指令,如果有个jmp且是往下跳的,if-else就成立了。

    //程序语言
    if(...) 
    {
        ...
    }
    else 
    {
    	...
    }
    
    //代码定式
    IF_BEGIN:
    jxx ELSE_BEGIN
        ...
    IF_END:
        jmp ELSE_END
    ELSE_BEGIN:
        ...
    ELSE_END:
        ...
    

    第三步,接着生成新的exe文件,用OD打开分析。
    同样的方法进入主函数,然后F7单步步入0x00401000位置,如下图所示。

    在这里插入图片描述

    核心代码及其跳转如下图所示。

    • JLE --> 0x0040100E:PUSH操作
    • JMP --> 0x00401013:CALL操作

    在这里插入图片描述

    双分支结构特点:

    • jxx的目标处上一行指令为jmp,而且是往高地址去的jmp(往下跳)。如果是循环,后面会讲到它可能往上跳。

    确定上下界之后,生成如下图所示的if模块和else模块,同样的反条件处理还原代码。

    在这里插入图片描述

    注意,这里有一个小小的优化,编译原理中的代码外提。它是什么意思呢?
    假设有个节点A,现在有了流程分支B1和B2,B1完成后执行C,B2完成后也会执行C。编译器为了减小代码的节点,因为代码节点越多,代码越长,就做了等价流程的代码外提优化,从而汇总到C,少了一个节点。

    • 编译器会视情况减少节点的优化
    • 编译器也会增加节点来减小路径的优化

    在这里插入图片描述


    第四步,采用同样的方法用IDA工具分析还原代码,其效果也一样。

    在这里插入图片描述

    在这里插入图片描述

    接着你可能会疑问这两个PUSH是干啥呢?**

    • push offset aArgc8 ; “argc > 8\r\n”
    • push offset aArgc8_0 ; “argc <= 8\r\n”

    C语言中没有标准的高级语法对应汇编中的PUSH操作,说明它有代码优化了,就是代码外提操作。它们有个公共的函数调用被提到下面去了,就是下图所示的两行代码,这个时候我们要把它放回去方便还原。

    在这里插入图片描述

    接着我们复制汇编代码至C语言中进行还原,方便大家理解。代码如下,此时增加了if和else的上下界,但发现两个push无法还原。

    在这里插入图片描述

    同时将代码外提部分分别放到if和else模块中,就能实现最终代码还原,如下图所示。最后删除掉多余的汇编注释即可。

    在这里插入图片描述

    继续还原条件判断内容,JLE小于等于换成大于8就好。在真实环境中,还会遇到双分支中有循环或条件嵌套的问题,不要担心,找到上下界继续分析即可。

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    
    //.text:00401000                 cmp     [esp+argc], 8
    //.text:00401005                 jle     short loc_40100E
    	if (argc > 8)
    	{
    //.text:00401007                 push    offset aArgc8   ; "argc > 8\r\n"
    //.text:0040100C                 jmp     short loc_401013
    //.text:00401013                 call    sub_4010C6
    		printf("argc > 8\r\n");
    //.text:00401018                 add     esp, 4
    	}
    //.text:0040100E ; ---------------------------------------------------------------------------
    //.text:0040100E
    	else
    	{
    //.text:0040100E loc_40100E:                             ; CODE XREF: _main+5↑j
    //.text:0040100E                 push    offset aArgc8_0 ; "argc <= 8\r\n"
    //.text:00401013                 call    sub_4010C6
    		printf("argc <= 8\r\n");
    //.text:00401018                 add     esp, 4
    	}
    //.text:00401013
    //.text:00401013 loc_401013:                             ; CODE XREF: _main+C↑j
    //.text:0040101B                 push    offset aPause   ; "pause"
    	system("pause");
    	return 0;
    }
    


    二.C++逆向循环结构基础入门

    1.do-while结构分析

    循环包括do-while、while和for三种,你会觉得哪一种消息最高呢?do-while是三种循环中效率最高的,由于其无条件先执行一次,所以大家很少使用,但其效率很高。

    基本语法
    先执行,再判断。先执行一遍循环操作,若符合条件,循环操作继续执行,否则退出循环。

    do{
        循环操作语句;
    }whlie(循环条件);
    

    在这里插入图片描述

    第一步,我们编写一个1加到100的循环代码,这次直接使用Debug版本。

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    	int n = 1;
    	int nSum = 0;
    
    	//do-while 执行一次
    	do {
    		nSum = nSum + n;
    		n++;
    	} while(n <= 100);
    	
    	printf("%d", nSum);
    	system("pause");
    	return 0;
    }
    

    第二步,通过OD打开运行的EXE程序“RE_XH.exe”。

    • 程序入口地址:0x00401260

    在这里插入图片描述


    第三步,往下查找代码,发现3个PUSH后(参数)就是主函数,然后F2添加断点并F7步入主函数。

    • 主函数:CALL RE_XH.00401005

    在这里插入图片描述

    在这里插入图片描述


    第四步,分析汇编代码。
    这里存在一个JLE跳转,如果条件跳往上跳就是do-while循环。

    在这里插入图片描述

    循环肯定会往上走,否则构成不了循环,它需要反复执行同一代码段。如果跳转的目标没有检查条件,就是do-while循环。简单总结下识别do-while循环步骤:

    • 识别代码定式
    • 如果是do循环,则按jxx同条件还原等价高级代码

    注意,同条件的就只有do-while结构。在do-while循环中,它跟汇编的语义是一样的,只有当条件满足则流程更新到循环的起始地点,所以它是正条件还原。而前面的if-else判断都是反条件

    //程序语言
    do
    {
        ...
    }while(xxx);
    
    //代码定式
    DO_BEGIN:
        ...
        jxx DO_BEGIN
    DO_END:
        ...
    


    2.while结构分析

    基本语法
    先判断,再执行。

    whlie(循环条件){
        循环操作语句;
    }
    

    在这里插入图片描述

    第一步,我们编写一个1加到100的循环代码。

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    	int n = 1;
    	int nSum = 0;
    
    	while (n <= 100)
    	{
    		nSum = nSum + n;
    		n++;
    	} 
    	
    	printf("%d", nSum);
    	system("pause");
    	return 0;
    }
    

    第二步,分析while循环的代码定式。
    注意,该循环的Debug版本和Release版本存在差异,接下来会对比分析。我们先给出代码定式,如下所示。

    //程序语言
    while(xxx)
    {
        ...
    }
    
    //代码定式
    WHILE_BEGIN:
        jxx WHILE_END
            ...
        jmp WHILE_BEGIN
    WHILE_END:
        ...
    

    while循环的条件跳是往上跳的,它需要反复执行同一代码段。


    第三步,通过OD打开运行的EXE程序“RE_XH.exe”。

    • 程序入口地址:0x00401260

    在这里插入图片描述

    第四步,往下查找代码,发现3个PUSH后(参数)就是主函数,然后F2添加断点并F7步入主函数。

    • 主函数:CALL RE_XH.00401005

    在这里插入图片描述


    第五步,分析汇编代码。
    这里存在一个JG跳转,它有点像if语句,下面还有一个JMP,有点像if-else指令,但是它的跳转是地址减量跳或往上跳,所以它是循环。

    在这里插入图片描述

    这时会发现while循环比刚才的多了一个跳转。我们会过计算机组成原理,当处理器执行跳转指令时,流水线会暂时挂起失效,本来流水线在取指令时已经准备预读后面的代码了,结果在译码过程中是个跳转,后面的代码预读就会出错,然后做流水线清理工作。所以,while循环有两跳对流水线的伤害比do-while大。


    第六步,接着我们用高版本VS2019编译一个Release版本,并用IDA进行分析,看看高版本有什么优化。

    在这里插入图片描述

    查看Text View,我们定位到main函数之后,看看它做的优化。它把循环的起点对齐到十六进制10的倍数地址,中间会用nop进行空指令填充。同时,它的汇编循环体变成了do-while循环。

    在这里插入图片描述

    注意,前面的VC++ Debug版本用IDA工具打开如下图所示。上图和下图同样都是while循环,但低版本可以看到JG(往下跳)和JMP(往上跳)两个跳转,典型的while循环;而高版本的却修改成了do-while循环的形式。

    在这里插入图片描述

    问题1:由于do-while循环会执行一次循环体,难道它不担心编译器出错吗?
    其实它比较的数值是常量,常量可以在编译期间预置其结果的,其实编译器在第一次的判断时先进行了一次常量传播,令n等于1,即判断的是 while(1<=100),比较1和100的关系条件必成立。

    问题2:那么,如果将100替换成变量,编译器还能识别吗?或者会报错?
    此时的编译器会将其进行转换,变成如下图所示的形式再执行do-while循环。其中if(n<=argc)条件判断嵌套一个循环。

    在这里插入图片描述

    对应的汇编代码如下,其中“jl short loc_401016”往下跳,还原成一个单分支,循环里面还有一个跳转“jle short loc_40100F”往上跳,满足do-while循环,最终还原成if加do-while,或者你知道有这个优化,直接还原成带变量的while循环也可以。

    在这里插入图片描述

    但需要注意,能不能把do-while直接还原成while循环,还需要看看这两个条件有没有相关性。如果有相关性才能还原,比如外层判断是文件的打开状态,while是迭代n值,这种情况不能还原。下图可以看到if和循环都是EAX参数比较,所以具有相关性。

    在这里插入图片描述



    3.for结构分析

    下面开始分析for循环结构。

    for(表达式1;表达式2;表达式3;)
    {
    	语句;
    }
    

    第一步,我们编写一个for循环代码。

    #include "stdafx.h"
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
    	int nSum = 0;
    
    	for (int n = 1; n<=argc; n++)
    	{
    		nSum = nSum + n;
    	} 
    	
    	printf("%d", nSum);
    	system("pause");
    	return 0;
    }
    

    第二步,编译生成新的Debug版可执行程序。

    在这里插入图片描述


    第三步,通过IDA打开运行的EXE程序“RE_XH.exe”。
    产出了三个跳转代码,如下图所示。

    在这里插入图片描述

    其代码定式如下所示,可以看到JMP、JG和JMP三个跳转。注意,for循环中FOR_STEP地址是低于BODY执行体的地址的。

    在这里插入图片描述


    第四步,分析汇编代码。
    首先MOV进行初始化赋值1,接着JMP跳转到比较部分,比较不成立则JG直接跳出循环,否则执行循环体BODY内容,接着继续JMP跳转上去执行n++操作。

    在这里插入图片描述

    注意,由于Release版本都被编译器优化成了do-while循环,所以我们需要在Debug版下进行对比。


    第五步,通过VS2019生成Release版本,然后用IDA打开代码对比。

    在这里插入图片描述

    IDA打开如下图所示,发现和do-while一样,高版本做了一点小处理,每次循环总次数增加了4(add eax,4),从而提升效率。

    在这里插入图片描述



    三.总结

    写到这里,这篇文章就介绍完毕,希望对您有所帮助,最后进行简单的总结下。

    • 条件语句逆向分析
    • 循环语句逆向分析

    学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。


    很多朋友问我如何学逆向分析?
    下面给出推荐的学习路线和安全书籍。软件逆行其实就是搬砖活,你需要的是任性和基本功。可能大佬们会有很多技巧,但我希望你能扎扎实实去躺过那些坑,会看懂代码,会写代码,然后IDA和OD工具(倚天屠龙)用好,每天泡在代码中,肯定能行的。你应该这样学习:
    1.多敲代码,重视实战;
    2.程序不是写出来的,是调出来的;
    3.根据自己兴趣和市场需求做一定规模的项目。

    下图开发和逆向项目非常推荐你去完成,开发远控软件有助于你分析木马,CAD软件能提升你C++分析能力,做一个调制器或许反调试就不再那么难,自制一个小操作系统、小编译器、任务管理器,或许逆向原理就懂了。

    在这里插入图片描述

    最后给出了这一年我在网络安全、系统安全和机器学习看过的书,如果你想把AI更好的融入安全领域,看看这些书籍还是挺不错,我也厚着脸皮把自己写的两本Python数据分析书放了进来,哈哈~

    网络安全:
    在这里插入图片描述

    系统安全:

    在这里插入图片描述

    AI+安全:

    在这里插入图片描述


    编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。



    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    参考资料:
    真心推荐大家好好看看这些视频和文章,感恩这些大佬!前非常推荐钱老师的视频,感谢华科UP主。
    [1] 科锐逆向的钱林松老师受华中科技大学邀请- “逆向分析计算引导”
    [2] C语言逆向工程之游戏辅助开发 - C语言Plus

    展开全文
  • 计算机二级C语言考点解析循环语句和循环函数 循环语句和循环函数 Turbo C 2.0提供三种基本的循环语句: for语句while语句do-while语句 一循环语句 (一)for循环 它的一般形式为: for<初始化<条件表过式<增量) 语句;...
  • 在我们敲代码的时候经常会遇到要使用选择语句和循环语句的时候,因为合理的使用这些语句能有效的提高我们代码的质量性能。 接下来我们说说这些语句! 1、选择语句 先来说说java的关系操作符: java操作符 数学...

    在我们敲代码的时候经常会遇到要使用选择语句和循环语句的时候,因为合理的使用这些语句能有效的提高我们代码的质量和性能。
    接下来我们说说这些语句!

    1、选择语句

    先来说说java的关系操作符:

    java操作符数学符号名称试例 (半径为1)结果(值是布尔值)
    <<小于radius < 0false
    <= ≤ \leq 小于等于radius <= 0false
    >>大于radius > 0true
    < ≥ \geq 大于等于radius >= 0true
    ==等于radius == 0false
    != ≠ \neq ̸=不等于radius != 0true

    注意:相等的关系操作符是两个等号(==),而不是一个等号(=),后者时赋值操作符!

    一般得在其他编程语言中这几种关系操作符都是相同的。

    java的选择语句中有6种语句

    1、单分支if语句
    2、双分支if-else 语句
    3、嵌套if语句
    4、多分支if - else语句
    5、switch语句
    6、条件表达式

    if语句

    语法:
    if(布尔表达式){
    语句(组);
    }
    if语句只会是表达式为真时才会执行里面的语句(组)。
    当花括号内只有一条语句时,则可以省略花括号。下面的if-else语句亦是如此。

    双分支if-else语句

    语法:

    if(布尔表达式){
    布尔表达式为真时执行的语句(组);
    }
    else{
    布尔表达式为假是执行的语句(组);
    }

    流程图如下:

    Created with Raphaël 2.2.0 开始 布尔表达式 条件为真时执行的语句(组) 结束 条件为假时执行的语句(组) yes no

    嵌套的if语句与多分支if-else语句

    嵌套的if-else语句其实就是if-else语句的多重使用,用于解决多重选择问题。
    而多分支if-else语句也是用于实现多重选择。在实际写代码过程中如需解决多重选择问题,如果使用这两种语句写建议使用多分支if-else语句,这样更有逻辑感!
    两者的区别,请看下面代码:

    	//嵌套的if-else语句
    		if(score >= 90.0)
    			System.out.println("A");
    		else
    			if(score>= 80.0)
    				System.out.println("B");
    			else
    				if(score >= 70.0)
    					System.out.println("C");
    				else
    					if(score >= 60.0)
    						System.out.println("D");
    					else
    						System.out.println("F");
    		/**多分支的if-else语句,这个的层次感分明,让人看着都舒服*/
    		if(score >= 90.0)
    			System.out.println("A");
    		else if(score >= 80.0)
    			System.out.println("B");
    		else if(score >= 70.0)
    			System.out.println("C");
    		else if(score >= 60.0)
    			System.out.println("D");
    		else
    			System.out.println("F");
    

    switch语句

    switch语句是基于变量或表达式的来执行语句。

    应用 :当需选择值来做表达式判断时可用switch语句

    语法:

    switch(switch表达式){
    case 值1:语句(组)1;
    break;
    case值2:语句(组)2;
    break;
    case值3:语句(组)3;
    break;

    case值n:语句(组)n;
    break;
    default:默认情况下执行的语句(组);
    }

    注意:
    1、switch表达式必须是一个能计算出一个char、byte、short、 int或者String型值,而且必须用括号括住。
    2、case后的值的必须与switch表达式的值具有相同的数据类型,且case后的值不可含有变量,如不可出现1+x。
    3、关键字break是可选的,break语句会立即终止switch语句。当switch表达式的值与case的值匹配会执行该条case开始的语句,直到遇到break语句或到达该switch语句的结束。
    4、break语句与默认情况(default)都是可选的,即可按要求不写。

    条件表达式

    应用 : 如果要求中只有两到三个判断可采用条件表达式

    1、固定式:变量 = (布尔表达式)?值1 :值2;
    2、值1和值2中又可以是条件表达式,可以嵌套条件表达式。如 变量 = (布尔表达式)?值1 : (布尔表达式2)?值2:值3;
    3、当括号内的表达式为真则变量为冒号前面的值,否则为冒号后面的值。
    4、符号?和:在表达式中同时出现。他们构成一种条件操作符,因为操作符数有三个,所以称为三元操作符(ternary operator)。它们是java中唯一的三元操作符。

    常见错误与陷阱

    1、对布尔值的冗余测试
    为了检验测试条件中的布尔型变量是true还是false,像下图的“==true”是多余的;

    if (even == true)

    System.out.println(“It is even.”);

    下面的代码会比上面的好,避免了误将“==”写成“=”的可能,直接测试布尔变量。

    if (even)

    System.out.println(“It is even.”);

    2、悬空else出现的歧义

    		int i = 1,j = 2,k = 3;
    		if(i > j)
    			if(i > k)
    				System.out.println("A ");
    		else
    			System.out.println("B ");
    

    这里的缩进表明else子句是匹配第一个if子句,但实际上是匹配第二个if子句。这就是悬空else歧义。在同一块中,else总是与它最近的if子句匹配。
    上一个图的代码是不打印任何东西的。下图的代码会打印出B。

    		int i = 1,j = 2,k = 3;
    		if(i > j){
    			if(i > k)
    				System.out.println("A ");
    		}
    		else
    			System.out.println("B ");
    

    3、两个浮点数值的相等比较测试
    因为浮点数是具有有限的计算精度,涉及浮点读书的计算可能引入取整错误。因此两个浮点数值的相等测试并不可靠。如下面代码返回值并不是你期望的true,而是false。

    double x = 1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1;
    System.out.println("x == 0.5 ");

    这里x并不能精确到等于0.5,而是0.5000000000000001。.虽然不能依赖于两个浮点数值的相等测试,但是可以通过测试两个数的差距小于某个阈值,来比较它们是否已经足够接近。也就是,对于一个非常小的值&,如果|x-y|<ε,那么x和y非常接近。ε是一个读为“epsilon”的希腊字母,常用于表示个非常小的值。通常,将ε设为10-14 来比较两个double类型的值,而设为10-7来比较两个float类型的值。如下面的代码:

    final double EPSILON = 1E-14;//1E-14表示10的负14次方
    		double x=1.0-0.1-0.1-0.1-0.1-0.1;
    		//Math.abs(x - 0.5)方法用于返回(x - 0.5)的绝对值
    		if (Math.abs(x - 0.5) < EPSILON)
    			System. out.println(x +"is approximately 0.5");
    

    将显示0.5000000000000001近似0.5。

    2、循环语句

    1、while循环语句
    2、do-while循环语句
    3、for循环语句
    4、foreach循环语句(Java5以后加的循环语句)

    while循环语句

    注:while循环在条件为真的情况下,重复的执行语句。
    语法:

    while(循环继续条件){
    //循环体
    语句(组);
    用于控制循环的附件条件;
    }

    		int score = 0;
    		int i = 1;
    		//循环语句
    		while(i <10) {
    			score += i;
    			i ++;//控制循环的附加条件
    		}
    		System.out.println("score is " + score);//score is 45
    

    注意:在循环条件那要特别注意是小于还是小于等于后面的固定值。

    do-while循环语句

    注:do-while 循环和while循环基本一样,不同的是它先执行循环体一次,然后判断循环继续条件。
    do-while循环是while循环的变体。如果循环中的语句至少执行一次建议使用do-while循环。
    语法:

    do{
    //循环体
    语句(组);
    }while(循环继续条件);

    注意在写完循环继续条件后要加“ ;”。
    下面这种情况用do-while比用while较好,因为需要先提示。

    		int data;
    		int sum = 0;
    		Scanner input = new Scanner(System.in);
    		//循环语句
    		do {
    			System.out.print("Enter an integer(the input ends if it is 0):");//当输入0是循环结束
    			data = input.nextInt();
    			sum+=data;
    		}while(data !=0);
    		
    		System.out.println("sum is " + sum);
    

    for循环

    注:for循环具有编写循环的简明语法。
    语法:
    for(初始操作;循环继续条件;每次迭代后的操作){
    //循环体
    语句(组);
    }
    注:for( ; ;){}小括号当中的两个分号不能少。
    do-while循环、while循环和for循环的三者比较:

    		int i = 0;
    		int sum = 0;
    		//三个循环都实现相同的功能,把i的值全加起来
    		do {
    			sum += i;
    		}while(i < 10);
    		
    		while(i < 10) {
    			sum +=i;
    		}
    		
    		for(int i = 0;i < 10; i ++) {
    			sum +=i;
    		}
    
    在敲代码时该采用哪种循环?

    while循环和for循环都被称为前测循环,因为继续条件在循环体执行之前检测的;而do-while循环固然就叫后测循环,原因与前两个刚好相反。

    这三种循环语句并没有什么好坏之差,只是各有各更适合的应用场景而已。在敲代码时建议使用自己觉得最自然、最舒服的循环语句。

    一般的如果已经知道循环要重复的次数,就采用for循环;如无法确定重复次数,就采用while循环;如检验继续条件前需要执行循环体,就用do-while循环代替while循环

    在数组中要读取数组的各个元素一般使用for循环,因为简单明了!

    foreach循环语句

    在java1.5中java开发者又新增了一个循环语句——foreach循环语句:for语句的特殊简化版本,主要执行遍历功能的循环
    foreach循环语句是java1.5的新特征之一,在遍历数组、集合方面,foreach为开发者提供了极大的方便。
    foreach循环语句的语法格式如下:

    for(类型 变量名 :集合){
    语句块;
    }

    其中,“类型”为集合**元素的类型,“变量名”表示集合中的每个元素,“集合”是被遍历的集合对象或数组**。每执行一次循环语句,循环变量就读取集合中的一个元素。
    流程图如下:

    Created with Raphaël 2.2.0 开始 是否包含元素 执行的语块 结束 yes no

    下面是使用foreach循环语句实现一、二和三维数组的遍历和输出。
    闲话多说无益,上代码:

    public class foreac {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		/**
    		 * 声明一个一维数组nu
    		 * 并初始化数组值为 1、2*/
    		int[] nu = {1,2};
    		//使用foreach循环来实现遍历数组元素的功能,并将值逐一赋个number1且逐一输出数组元素的值
    		for(int numbe1 : nu) 
    			System.out.print(numbe1 + "\t");//\t是Tab键,表示空出几个空格的意思
    		
    		System.out.println("\n");// \n换行符,使输出这一维数组的元素值与输出下面二维数组的元素值不同行
    		/**
    		 * 声明一个二维数组in
    		 * 并初始化数组元素的值为
    		 * 1、2
    		 * 3、4*/
    		int[][] in = {{1,2},{3,4}};
    		for(int[] number : in)//第一个foreach语句是遍历二维数组中的第一行的所有元素,这些元素又暂时形成数组number
    			for(int number1 : number) //第二个foreach语句就遍历在第一个foreach语句中形成的数组元素,并将值逐一赋个number1
    				System.out.print(number1 + "\t");
    			
    		System.out.println("\n");
    		
    		/**
    		 * 声明一个三维数组Value
    		 * 并初始化数组元素的值
    		 * (三维数组是立体的,从正面看过去看到一个二维数组,即
    		 * 第一行:567,789,336,229
    		 * 第二行:890,995,668,867
    		 * 下面的如777,899,868,796
    		 * 		999,984,848,888
    		 * 则被第一行和第二行的数值遮住(这里只能靠自己的想像力了))*/
    		int count =0;		//声明一个变量来计算读取到第几个元素
    		double[][][] Value ={{{567,789,336,229},{890,995,668,867}},
    				  {{777,899,868,796},{999,984,848,888}},
    				  {{912,800,809,706},{909,904,868,898}}};	
    		for(double[][] number : Value)//第一个foreach语句是遍历三维数组中的第一面的所有元素,这些元素又暂时形成二维数组number
    			for(double[] number1 : number)//第一个foreach语句是遍历二维数组(number)中的第一行的所有元素,这些元素又暂时形成一维数组numbe1
    				//第二个foreach语句就遍历一维数组numbe1的数组元素,并将值逐一赋个number2
    				for(double number2 : number1) {
    					count ++;//迭代计算读取到第几个元素
    					System.out.print(number2 + "\t");
    					if(count % 8 ==0)//当读取到第8个和8的倍数的个数时,输出的元素换行
    						System.out.println("\n");
    				}
    	}
    
    }
    

    上面代码的运行结果,如下图:
    使用foreach语句实现的一、二和三维数组的输出结果,上面代码的输出结果

    注:以上为我个人学习的一些分享,对于以上内容如有疑问的地方欢迎评论,如有不当的地方也请在评论区评论为我指出问题,谢谢!

    展开全文
  • FPGA学习笔记(四)————Verilog HDL条件语句循环语句 文章目录FPGA学习笔记(四)————Verilog HDL条件语句循环语句1.if--else语句2.case语句3.forever语句4.repeat语句5.while语句6.for语句7.disable语句 1....
  • matlab中循环语句与for循环

    千次阅读 2021-04-18 14:24:17
    matlab中循环语句与for循环篇一:matlab循环语句循环结构1.for语句for语句的格式为:for 循环变量=表达式1:表达式2:表达式3循环体语句end其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环...
  • 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码作者的经验讲解,真心想把自己近十年的编程经验分享给...
  • Java条件和循环语句

    2018-09-14 08:25:10
    一.选择流程控制 1顺序结构的基本使用 1.1.1顺序结构概述 是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的 ...首先判断关系...
  • 函数的基础知识",而这篇文章讲述的Python的条件语句和循环语句的基础知识.主要内容包括: 1.条件语句:包括单分支、双分支多分支语句,if-elif-else 2.循环语句:while的使用及简单网络刷博器爬虫 3.循环语句:for的...
  • 业精于勤荒于嬉,行成于思毁于随。 今天这一篇,我们继续来说一说循环语句的知识。
  • js中的循环语句

    千次阅读 2022-04-15 11:25:59
    循环语句 循环的作用 循环目的 在实际问题中,有许多具有规律性的重复操作,因此在程序中要完成这类操作就需要重复执行某些语句 js中的循环方法: 1.while 2.do…while 3.for 它们的相同之处,都能够实现循环。 ...
  • 循环语句允许我们执行一个语句或语句组多次。 Python里面提供了三种循环方式: while 循环:在给定的判断条件为 true 时执行循环体,否则退出循环体。 for 循环:重复执行语句 嵌套循环:while 循环 for循环 ...
  • 第二章 条件判断语句(分支语句)& 循环语句(上)| C语言[0基础 入门 保姆级别 通俗易懂 教程]
  • C提供三种基本的循环语句:for语句、while语句do-while语句。一.for循环for循环是开界的。它的一般形式为:for(;;)语句;初始化总是一个赋值语句,它用来给循环控制变量赋初值;条件表达式是一个关系表达式,它决定什么...
  • 1)for循环语句的一般形式:for(表达式1;表达式2;表达3){ 循环体语句; }表达式1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2 通常是循环...
  • 【填空题】________ Bleistift 【单选题】关于Python程序格式框架的描述,错误的是( ) 【单选题】在循环语句中,break语句的作用是提前结束循环。 【单选题】________ Sie Frau Bauer? 【单选题】"an apple a day"....
  • for循环死循环语句

    千次阅读 2021-05-20 01:32:00
    for语句while语句还有do while语句1:for循环for语句的格式为:for (初始化语句; 条件语句;...接着再测试条件语句是否成立,如果成立则重复执行以上过程,直至条件不成立时才结束for循环。如:for(i...
  • 【C语言】循环语句

    千次阅读 多人点赞 2021-11-15 14:28:17
    在C语言当中,使用 [for] 语句也可以控制一个循环。并且在每一次循环时修改循环变量。...有些情况下,不论你的条件是否满足,循环的过程中至少会执行一次,这个时候就可以采用 [do...while] 循环语句
  • 条件判断及循环语句

    2018-07-26 20:11:13
    一:流程控制语句  1:顺序结构  从上往下依次执行 开始-----》语句一-------》语句二------》结束 2:选择结构 (分支结构)  有特定的语法格式,必须按照语法格式编写代码 ... 格式1 if(关系表达式){...
  • shell循环语句

    千次阅读 2022-04-13 12:30:23
    条件;步长)) do 命令序列 done ------------------------ for 变量 in { ... } do 命令序列 done 示例:循环创建10个系统账户 示例2: 批量创建用户 用户名存放在users.txt的文件,每...
  • VBA中for next循环语句有哪些?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!VBA中for next循环语句有哪些?For 循环变量=初值 to 终值 step 步长...
  • 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战Windows漏洞利用等,...这篇文章将带领大家来学习科锐钱林松老师的视频,详细讲解条件语句和循环语句源码还原及流程控制逆向。希望对入门的同学有帮助。
  • 三种基本的循环语句:for语句while语句do-while语句 一循环语句 (一)for循环它的一般形式为: for<初始化<条件表过式<增量) 语句; 初始化总是一个赋值语句它用来给循环控制变量赋初值条件表达式是一个关系表达式它...
  • C语言中的for循环语句

    千次阅读 2022-04-09 11:25:14
    今天给大家分享C语言中的for循环语句的基本语法以及基本使用。老样子,首先还是来了解for循环的语法格式 for(表达式1;表达式2;表达式3) { 语句; } 上面呢就是for循环的基本语法格式,我来简要介绍一下。 表达式...
  • if语句的用法循环语句

    千次阅读 2021-05-20 10:22:33
    求助1.if语句的一般格式if(表达式){语句组...(3)当ifelse下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。2.if语句的执行过程(1)缺省else子句时当“表达式”的值不等于0(即判定为“逻辑...
  • 【单选题】Python 中,for while 可以有 else 语句?( )【判断题】对于大量列表的连接,extend( )方法比运算符+具有更高的效率。【单选题】迭代输出序列时(如:列表)使用 for 比 while 更好?( )【其它】人物矢量绘制...
  • C语言中的三种循环语句
  • C++基础之循环语句

    2020-10-22 14:02:04
    在程序设计过程中,有时候需要多次去执行相同的过程,例如打印“我爱我的祖国”这句话100...在C++编程语言中,通过引入一些循环语句来解决该问题,这些语句主要包含三种:for循环、while循环、do whie循环。本博客简单

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 183,535
精华内容 73,414
关键字:

循环语句和条件语句的关系

友情链接: A7700.rar