网络安全|渗透测试入门学习,从零基础入门到精通—动态分析技术OllyDbg案例详情

news2025/1/6 18:36:59

目录

1、准备工作

 2、加载目标文件进行调试

 3、单步跟踪

4、设置断点

5、调试分析


 

1、准备工作


分析一个Windows程序要比分析一个DOS程序容易得多因为在Windows中只要API函数被使用了,再想对要寻找蛛丝马迹的人隐藏一些信息就比较困难了。因此,在分析一个程序时,以哪个API函数作为切人点就显得比较重要了。如果有一些编程经验,在这方面就更加得心应手了。

为了便于理解,先简单地看一下TraceMe 的序列号验证流程如图25所示。将用户名与序列号输人文本框程序调用GetDigltemTextA函数把字符读出然后进行计算,最后用lstremp函数进行比较。因此,这些调用的函数就是解密跟踪的目标,将这些函数作为断点,跟踪程序的序列号验证过程,就能找出正确的序列号。这种专门为练习解密技术制作的小程序,一般统称为“CrackMe”。

 2、加载目标文件进行调试

为了让OllyDbg中断在程序的入口点,在加载程序前必须进行相应的设置。运行OlyDbg,单击“Oplions”一“Debugging options”选项,打开调试选项配置对话框。单击“Event”标签,设置OllyDhg对中断人口点、模块加载/卸载、线程创建/结束等事件的处理方式,一般只需要将断点设置
在“WinMain”处。

设置完成后单击“File”一“Open”选项打开TraceMeexe此时0llyDbg会中断在TraceMe的第1条指令处调试器分析代码并等待用户的下一步操作。如下图所示光标停在004013AOh处004013A0h就是程序的人口点(EntryPoint)。大部分程序在启动时都会停在入口点。通过一些特殊的修改方式,有些程序可以在启动时不停在人口点,以达到反调试的目的。各部分代码的含义如下。

  • 虚拟地址:在一般情况下,同一程序的同一条指令在不同系统环境下此值相同。
  • 机器码:就是CPU执行的机器代码。
  • 汇编指令:与机器码对应的程序代码

 寄存器面板上显示了各个寄存器的当前值。寄存器有EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI和EIP等,它们统称为32位存器如下图所示。ESP为指针,指向顶在OllyDbg界面右下角的栈面板上显示了栈的值。另一个重要的寄存器是EIP,它指向当前将要执行的指令,按一下“F7”键将执行一条指令,然后 EIP将指向下一条将要执行的指令。

在调试时,可以双击这些寄存器,修改寄存器里的值。但是对EIP寄存器,不能直接修改,需要在反汇编窗口选择新的指令起始地址,例如004013AAh,在其上单击右键在弹出的快捷菜单中选择“Neworiginhere”(此处为新的EIP选项EIP的值将变成4013AAh,程序将从这条指令开始执行。寄存器下方显示的是标志寄存器,分别是C、P、A、ZS、T、D、0,它们的值只能是两个数字值-0和1,双击数字可以在0和1之间切换。

 3、单步跟踪

调试器的一个最基本的功能就是动态跟踪。0llyDbg在“Debug”菜单里控制运行的命令,各菜单项都有相应的快捷键。olyDhg的单步跟踪快捷键如下图所示。

快捷键功能
F7单步步进,遇到call 指令跟进
F8单步步过,遇到call指令路过,不跟进
Ctrl+F9直到出现rer指令时中断
Alt+F9若进人系统领空,此命令可瞬间回到应用程序领空
F9运行程序
F2设置断点

“F8”键在调试中的使用很频繁,可以逐句单步执行汇编指令,遇到call 指令不会跟进,而是路过,示例如下。

 “F7”键和“F8”键的主要区别在于,若遇到callloop等指令,按“F8”键会路过,按“F7键会跟进,示例如下。

“ call00401DA0”表示调用00401DAOh处的子程序。一旦子程序调用完毕,就返回call指的下一条语句即004013FFh处。按“F7”键跟进00401DAOh处的子程序,观察的情况,会发现call指令的下一条指令的地址004013FFh作为返回地址被压人栈中如图28所示。子程序末尾是一个ret指令执行完00401DD7h处的指令,就能返回call指的下一条语004013FFh处。在进人子程序的过程中,若想回看之前单步跟踪的代码,可以按“-”(减号)键;若想让光标回到当前EIP所指向的语句,可以单击国按钮C或双击EIP寄存器。

 当要重复按“F7”键或“F8”键时OllyDbg提供了快捷键Ctl+F7”和“Ctrl+F8”直到用户按“Esc”键、“F12”键或遇到其他断点时停止。
当位于某个call指中,想返回调用这个cl 指的位置时可以按“Ctrl+F9”快捷键执行Executetillreum”(执行到返回)命令OllyDhg会停在遇到的第1个返回命处(retretf或iret).这样可以方便地略过一些没用的代码。

 例如上面的代码在00401DAO处如果按“Ctl+F9”快捷键就会返回 004013FFh 处。遇到et 指时是暂停还是路过可以在选项设置,方法是打开调试设置选项对话框,在“Trace”标签页中设置“After Execting tillRETstepover RET”(执行到ret指令后,单步路过ret指令)。
如果已经进人系统DLL提供的API函数,当要返回应用程序领空时可以按快捷键“Alt+F9”执行“Executetillusercode”(执行到用户代码)命令,示例如下。

 在004013C6h处按“F7”键就可跟进系统KERNEL32DLL了,示例如下。

“7C8114AB”等都是系统DLL所在的地址空间这时只要按快捷键“Alt+F9”就可以回到应用程序领空,代码如下。 

 注意:所谓“领空”,实际上是指在某一时刻CPU的CS:EIP 指向的某段代码的所有者。

如果不想单步跟踪,想让程序直接运行,可以按“F9”键或单击工具栏中的右进按钮。如果想重新调试目标程序,可以按“Ctrl+F2”快捷键,OllyDhg将结束被调试进程并重新加载它。如果程序进入死循环,可以按“F12”键暂停程序。

4、设置断点

断点(breakpoint)是调试器的一个重要功能可以让程序中断在指定的地方,从而方便地对其进行分析。如下图所示将光标移到004013A5h处按“F2”键即可设置一个断点再次按“F2”键可以取消断点。也可以双击“Hexdump”列中相应的行设置断点,再次双击可以取消断点。

 设置断点后,按“Alt+B”快捷键或单击B按钮,打开断点窗口,查看断点明细如下图所示。这里显示了除硬件断点外的其他断点,其中“Always”表示断点处于激活状态“Disable”表示断点停用。按空格键可切换其状态。也可以通过右键快捷菜单管理这些断点。删除断点的快捷是“Del”键。

 

00B2A5C8   .  E8 1BAA0000   call 路径修复.00B34FE8                       ; \路径修复.00B34FE8
00B2A5CD   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A5CE   .  B8 4D5A0000   mov eax,0x5A4D
00B2A5D3   .  66:3905 0000B>cmp word ptr ds:[0xB20000],ax
00B2A5DA   .  74 04         je short 路径修复.00B2A5E0
00B2A5DC   >  33DB          xor ebx,ebx
00B2A5DE   .  EB 33         jmp short 路径修复.00B2A613
00B2A5E0   >  A1 3C00B200   mov eax,dword ptr ds:[0xB2003C]
00B2A5E5   .  81B8 0000B200>cmp dword ptr ds:[eax+0xB20000],0x4550
00B2A5EF   .^ 75 EB         jnz short 路径修复.00B2A5DC
00B2A5F1   .  B9 0B010000   mov ecx,0x10B
00B2A5F6   .  66:3988 1800B>cmp word ptr ds:[eax+0xB20018],cx
00B2A5FD   .^ 75 DD         jnz short 路径修复.00B2A5DC
00B2A5FF   .  33DB          xor ebx,ebx
00B2A601   .  83B8 7400B200>cmp dword ptr ds:[eax+0xB20074],0xE
00B2A608   .  76 09         jbe short 路径修复.00B2A613
00B2A60A   .  3998 E800B200 cmp dword ptr ds:[eax+0xB200E8],ebx
00B2A610   .  0f95c3        setne bl
00B2A613   >  895D E4       mov dword ptr ss:[ebp-0x1C],ebx
00B2A616   .  E8 067C0000   call 路径修复.00B32221
00B2A61B   .  85C0          test eax,eax
00B2A61D   .  75 08         jnz short 路径修复.00B2A627
00B2A61F   .  6A 1C         push 0x1C
00B2A621   .  E8 DC000000   call 路径修复.00B2A702
00B2A626   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A627   >  E8 F4690000   call 路径修复.00B31020
00B2A62C   .  85C0          test eax,eax
00B2A62E   .  75 08         jnz short 路径修复.00B2A638
00B2A630   .  6A 10         push 0x10
00B2A632   .  E8 CB000000   call 路径修复.00B2A702
00B2A637   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A638   >  E8 94AA0000   call 路径修复.00B350D1
00B2A63D   .  8365 FC 00    and dword ptr ss:[ebp-0x4],0x0
00B2A641   .  E8 EE7E0000   call 路径修复.00B32534
00B2A646   .  85C0          test eax,eax
00B2A648   .  79 08         jns short 路径修复.00B2A652
00B2A64A   .  6A 1B         push 0x1B
00B2A64C   .  E8 B1000000   call 路径修复.00B2A702
00B2A651   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A652   >  FF15 3400B400 call dword ptr ds:[<&KERNEL32.GetCommand>; [GetCommandLineA
00B2A658   .  A3 C8DCB400   mov dword ptr ds:[0xB4DCC8],eax
00B2A65D   .  E8 AFAA0000   call 路径修复.00B35111
00B2A662   .  A3 4CBDB400   mov dword ptr ds:[0xB4BD4C],eax
00B2A667   .  E8 52A40000   call 路径修复.00B34ABE
00B2A66C   .  85C0          test eax,eax
00B2A66E   .  79 08         jns short 路径修复.00B2A678
00B2A670   .  6A 08         push 0x8
00B2A672   .  E8 6D820000   call 路径修复.00B328E4
00B2A677   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A678   >  E8 70A60000   call 路径修复.00B34CED
00B2A67D   .  85C0          test eax,eax
00B2A67F   .  79 08         jns short 路径修复.00B2A689
00B2A681   .  6A 09         push 0x9
00B2A683   .  E8 5C820000   call 路径修复.00B328E4
00B2A688   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A689   >  6A 01         push 0x1                                 ; /Arg1 = 00000001
00B2A68B   .  E8 8E820000   call 路径修复.00B3291E                       ; \路径修复.00B3291E
00B2A690   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A691   .  85C0          test eax,eax
00B2A693   .  74 07         je short 路径修复.00B2A69C
00B2A695   .  50            push eax
00B2A696   .  E8 49820000   call 路径修复.00B328E4
00B2A69B   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A69C   >  E8 FDAA0000   call 路径修复.00B3519E
00B2A6A1   .  56            push esi                                 ; /Arg4 = 00B2A5A8
00B2A6A2   .  50            push eax                                 ; |Arg3 = 010FFC98
00B2A6A3   .  6A 00         push 0x0                                 ; |Arg2 = 00000000
00B2A6A5   .  68 0000B200   push 路径修复.00B20000                       ; |Arg1 = 00B20000
00B2A6AA   .  E8 B1CBFFFF   call 路径修复.00B27260                       ; \路径修复.00B27260
00B2A6AF   .  8BF0          mov esi,eax
00B2A6B1   .  8975 DC       mov dword ptr ss:[ebp-0x24],esi          ;  路径修复.<ModuleEntryPoint>
00B2A6B4   .  85DB          test ebx,ebx
00B2A6B6   .  75 06         jnz short 路径修复.00B2A6BE
00B2A6B8   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A6B9   .  E8 C9840000   call 路径修复.00B32B87
00B2A6BE   >  E8 4C820000   call 路径修复.00B3290F
00B2A6C3   .  EB 2E         jmp short 路径修复.00B2A6F3
00B2A6C5   .  8B4D EC       mov ecx,dword ptr ss:[ebp-0x14]
00B2A6C8   .  8B01          mov eax,dword ptr ds:[ecx]
00B2A6CA   .  8B00          mov eax,dword ptr ds:[eax]
00B2A6CC   .  8945 E0       mov dword ptr ss:[ebp-0x20],eax
00B2A6CF   .  51            push ecx                                 ;  路径修复.<ModuleEntryPoint>
00B2A6D0   .  50            push eax
00B2A6D1   .  E8 8DA20000   call 路径修复.00B34963
00B2A6D6   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A6D7   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A6D8   .  C3            retn
00B2A6D9   .  8B65 E8       mov esp,dword ptr ss:[ebp-0x18]
00B2A6DC   .  8B75 E0       mov esi,dword ptr ss:[ebp-0x20]
00B2A6DF   .  8975 DC       mov dword ptr ss:[ebp-0x24],esi          ;  路径修复.<ModuleEntryPoint>
00B2A6E2   .  837D E4 00    cmp dword ptr ss:[ebp-0x1C],0x0
00B2A6E6   .  75 06         jnz short 路径修复.00B2A6EE
00B2A6E8   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A6E9   .  E8 B4820000   call 路径修复.00B329A2
00B2A6EE   >  E8 0D820000   call 路径修复.00B32900
00B2A6F3   >  C745 FC FEFFF>mov dword ptr ss:[ebp-0x4],-0x2
00B2A6FA   .  8BC6          mov eax,esi                              ;  路径修复.<ModuleEntryPoint>
00B2A6FC   .  E8 847C0000   call 路径修复.00B32385
00B2A701   .  C3            retn
00B2A702  /$  55            push ebp

5、调试分析

按“F8”键单步走出GetDlgllemTextA函数。当然也可以按“Alt+F9”快捷键回到调用函数的地方。OllyDbg非常强大,已经对各函数的调用参数及当前值进行了注释,相关代码如下。

 在阅读这些代码时,需要注意以下几点。

  • 要清楚各API函数的定义(查看相关API手册)
  • API函数大都采用sdcall调用约定即函数人口参数按从右到左的顺序人栈,由被调用者清理栈中的参数,返回值放在eax寄存器中。因此,对相关的API函数,要分析其前面的push 指令,这些指令将参数放人栈,以传送给API调用。在整个跟踪过程中要关注栈数据的变化。
  • C代码中的子程序采用的是C调用约定,函数人口参数按从右到左的顺序人栈,由调用者清理栈中的参数。
  • 调用约定、参数传递等知识,GetDlgItemText函数采用标准调用约定,参数按从右到左的顺序人栈。本例汇编代码如下:
00B2A728  \.  C3            retn
00B2A729      CC            int3
00B2A72A      CC            int3
00B2A72B      CC            int3
00B2A72C      CC            int3
00B2A72D      CC            int3
00B2A72E      CC            int3
00B2A72F      CC            int3
00B2A730   $  57            push edi                                 ;  路径修复.<ModuleEntryPoint>
00B2A731   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A732   .  8B7424 10     mov esi,dword ptr ss:[esp+0x10]          ;  ntdll.77C67B6E
00B2A736   .  8B4C24 14     mov ecx,dword ptr ss:[esp+0x14]
00B2A73A   .  8B7C24 0C     mov edi,dword ptr ss:[esp+0xC]
00B2A73E   .  8BC1          mov eax,ecx                              ;  路径修复.<ModuleEntryPoint>
00B2A740   .  8BD1          mov edx,ecx                              ;  路径修复.<ModuleEntryPoint>
00B2A742   .  03C6          add eax,esi                              ;  路径修复.<ModuleEntryPoint>

 

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

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

相关文章

软考高级系统架构设计师(七) 需求工程相关

目录 需求工程概述 需求工程-需求获取 需求开发-需求分析 需求分析-OOA OOA-UML-41视图 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 结构化设计 面向对象设计 软件界面设计 需求工程概述 需求工程-需求获取 需求获取方法&#xff1a; 需求开发-需求分…

在 BI 工具 Tableau 中使用 databend

Tableau是一款流行的数据可视化和业务智能工具。它提供了直观、交互式的方式来探索、分析和呈现数据&#xff0c;帮助用户更好地理解数据的意义和洞察。 本教程帮助用户在 Tableau 中连接 databend 进行 BI 数据分析。 Databend jdbc Tableau 支持所有实现了 JDBC 协议的数据…

如何在 Spring Boot 中使用 WebFlux

如何在 Spring Boot 中使用 WebFlux 随着互联网应用的复杂度不断增加&#xff0c;传统的请求响应模型已经无法满足日益增长的需求。传统的 Web 应用使用 Servlet 容器&#xff0c;采用同步阻塞的方式来处理请求&#xff0c;请求需要等待相应的处理逻辑完成后才能返回结果。这种…

【C/C++实战项目】万年历

目录 项目分析 项目效果 头文件及全局变量 获取天数 打印月份、年份日历 main函数 项目分析 实现查询某一个年份、月份&#xff0c;以日历的格式打印为了观赏性利用符号对打印的每一个日期进行分格特殊节日日期能够在日历中标注出来万年历的起始日期是公元1年&#xff0…

[Orin Nx] 如何跑满GPU和CPU,观察温度和散热性能?

1、环境说明 硬件: Nvidia Orin NX 16GB 软件&#xff1a;Jetson Linux R35.3.1 2、工具安装部署 GPU的压力测试主要使用工具&#xff1a; https://github.com/anseeto/jetson-gpu-burn CPU的压力测试主要使用工具 stress 注意安装 jetson-gpu-burn需要在 /etc/apt/sourc…

SpringBoot 客户信息管理系统-计算机毕设 附源码80944

SpringBoot客户信息管理系统 摘 要 随着计算机技术的发展&#xff0c;特别是计算机网络技术与数据库技术的发展&#xff0c;使用人们的生活与工作方式发生了很大的改观。本课题研究的客户信息管理系统&#xff0c;主要功能模块包括统计图&#xff0c;系统用户&#xff08;管理…

JS高级用法:像大神一样玩转JavaScript

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 众所周知&#xff0c;JavaScript是一种非常流行的编程语言&#xff0c;它已经成为了…

回收站如何添加到桌面?没有回收站的数据怎么恢复

最近收到很多这样的咨询&#xff1a; 咨询1&#xff1a;在网吧上网&#xff0c;不小心把照片删了&#xff0c;可恨的是这里没有回收站&#xff0c;请问怎么找回照片&#xff01;&#xff01;&#xff01;急&#xff0c;谢谢了。 咨询2&#xff1a;在网吧上网&#xff0c;一删除…

emmylua+Rider 断点调试

1、下载安装并激活好rider&#xff08;本次版本基于&#xff1a;JetBrains Rider 2023.1.3&#xff09; 2、从插件商店中安装emmylua 3、打开项目 在unity中设置好&#xff0c;使用rider打开项目即可 4、Unity中打开相应的场景 &#xff08;此场景基于Xlua官方Demo展示&…

初中生台灯如何选择?眼科专家推荐的学生台灯分享

保护视力一直是家长们经常提醒孩子们的一句话&#xff0c;但据统计青少年学生的近视率还是非常高&#xff0c;很多家长认为这是不良的用眼习惯导致的&#xff0c;却没想过可能是其他原因&#xff0c;因为孩子除了自身保持良好的用眼习惯外&#xff0c;在学习时用眼的光线也是十…

有哪些智能聊天ai机器人?这几种ai工具都能进行聊天

在当前ai技术日益成熟的时代&#xff0c;越来越多的ai聊天机器人开始走进我们的生活中&#xff0c;为我们带来更多乐趣和便利。这几款ai聊天机器人不仅可以陪伴我们度过孤独的夜晚&#xff0c;还可以为我们提供各种对话服务。它们能理解我们的话语&#xff0c;与我们进行自然对…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念&#xff0c;定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…

【unity每日一记】transform类精华之珠

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【Java】JVM学习(二)

JVM的内存区域 运行时数据区域 运行时数据区的定义&#xff1a; Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 Java 引以为豪的就是它的自动内存管理机制。相比于 C的手动内存管理、复杂难以理解的指针等&#xff0c;Java 程序写起来就方…

前端Vue自定义精美tabs,可设置下划线图标 热门标题

前端Vue自定义精美tabs&#xff0c;可设置下划线图标 热门标题&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13186 效果图如下&#xff1a; # cc-beautyTabs #### 使用方法 使用方法 <!-- tabchange: tab选择事…

为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言AI的崛起与编程语言…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

轻松复制:Elasticsearch 中跨集群复制指南

跨集群的数据复制是一个复杂且耗时的过程。 公司必须使用外部工具或编写自定义脚本将数据从一个集群移动到另一个集群。 Elasticsearch 以其跨集群复制功能来救援。 跨集群复制 (CCR) 是 Elasticsearch 中的一项内置功能&#xff0c;允许近乎实时地将数据从一个集群复制到另一…

C语言预处理命令

文章目录 1 什么是预处理命令2 预处理指令实例3 C语言宏定义4 C语言预处理命令总结参考 1 什么是预处理命令 这些在编译之前对源文件进行简单加工的过程&#xff0c;就称为预处理&#xff08;即预先处理、提前处理&#xff09;。预处理主要是处理以#开头的命令&#xff0c;例如…

【c语言】-- 操作符汇总(万字详解)

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习操作符。 让我们开启c语言学习之…