首页 > 编程语言 >滴水逆向笔记系列-c语言总结4-15.switch语句反汇编-16.指针1-17.指针2

滴水逆向笔记系列-c语言总结4-15.switch语句反汇编-16.指针1-17.指针2

时间:2024-03-14 14:58:01浏览次数:22  
标签:语句 case 17 16 char switch 反汇编 指针

第十五课 c语言8 switch语句

初步测试感觉switch在反汇编的语句和if语句的唯一差别就是jcc语句比较集中image.png
当分支大于四条时,switch的反汇编开始变
image.png
3为switch传入的值,1是case最小值,4是case最大值减1,算出偏移量后通过偏移量4加上基址就可以在大表中获取要输出的case语句的地址
image.png
当现在case的值不连续,空掉一个202时,大表的第二个地址会用default填充,如果case从201到209,我们删掉中间三四个值,他还是会用default填充
image.png
如果是删剩201,207,208,209,那么switch反汇编又会开始不一样,会生成一张大表和小表,从小表查出偏移量,再去
4加上基址得出case想要输出的语句的地址,小表有00,01,02,03,04对应着大表五个地址,分别是201,209,210,211和default的输出语句,和只有一张大表直接用default填充的方法相比,这个只需用一个字节04这个偏移量来填充,而04偏移量指向的就是default的地址,更省空间
image.png
image.png

总结

4、分支少于4时,用switch没有意义,因为编译器会生成类似if...else之类的反汇编.
5、case后面的常量可以是无序的,并不响大表的生成
6、所以switch语句的case最好是相近连续的,他可以生成大表,比if...else语句效率更高
7、抹去一两项会直接在大表用default语句的地址填充
8、抹去多项时,会生成一个小表代替大表填充default的地方
9、会使用类似if..else反汇编

作业

image.png

第十六课 c语言9指针1

1.声明

在之前学习的任何类型都可以加上数个*,就变成了一种新的类型,叫做指针。
image.png

总结:

image.png

2.宽度

和局部变量不一样,虽然都是占12个字节,但是真正使用时不管char,short还是int或者结构体类型也都还是4个字节
image.png

3.赋值

完整写法赋值
image.png

总结:

image.png

4.+-常数

image.png
image.pngimage.png
我们暂时先理解加号这种类型的++--的运算是不一样的,不是直接加1,而是加上自身减去一个的宽度,比如char**减去一个号为char,char宽度为4个字节,所以char的++应该是+4
image.png
+5和++同理,相当于五个++

总结 :

image.png

5.求差值

还是同理,砍星后根据宽度去除
而且求差值还得相同类型才可以相加减
两个char相减得出的结果是一个int类型,不能用char接收
image.pngimage.png
image.png

总结:

image.png

6.比较

总结:

image.png

作业

image.png
1、1,4,4
2、40
image.png
image.png
image.png
image.png
image.png

第十七课 c语言10 指针2

1.类型转换

基本数据类型之间可以直接赋值或者强转
image.pngimage.png
基本数据类型和其他类型之间则无法直接赋值或者强转
image.pngimage.png
指针之间可以强转但是不会自动转换直接赋值
image.pngimage.pngimage.png
一级指针二级指针之间也没办法自动转换直接赋值,但是可以强转
image.pngimage.png

2.&地址符

&可以去变量的地址,我们现在取完放在char y变量,发现报错了char不能转为char类型,得知**&取地址后是char类型
image.png
char类型的变量x取地址后是char*类型**
image.png

&取地址符反汇编

image.png
image.png

3.*取值符

*的类型

image.png

*反编译

image.png
从这个例子已经可以看出上节课指针类型运算为什么不同了
image.png

作业

image.png
image.png
image.png
image.png
image.png
image.png

标签:语句,case,17,16,char,switch,反汇编,指针
From: https://www.cnblogs.com/xiaoxin07/p/18072844

相关文章

  • C语言从入门到实战————数组和指针的深入理解
    前言在C语言中,数组和指针有的密切得联系,因为数组名本身就相当于一个指针常量。指针是一个变量,专门用来存储另一个变量的内存地址,通过这个地址可以访问和操作该变量的值,同时也包括数组。数组是一组连续存储的同类型数据的集合,它允许通过索引快速访问各个元素。同时数组名也是数......
  • 【5V 转 3.3V,3V,2.5V芯片首选】PW2162高效恒压转换器,外围电路超简单
    在现代电子设备高速发展的今天,一款高效、稳定的电源管理芯片对于设备的性能至关重要。PW2162,作为一款完全集成、高效的2A同步整流降压转换器,凭借其出色的性能和广泛的应用领域,正引领着电源管理领域的新纪元。首先,让我们深入了解一下PW2162的独特之处。这款转换器在宽输出电流负载......
  • LCR 016. 无重复字符的最长子串(中)
    目录题目题解:滑动窗口题目给定一个字符串s,请你找出其中不含有重复字符的最长连续子字符串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子字符串是"abc",所以其长度为3示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子字......
  • 蛋糕甜品奶茶订购系统 微信小程序 c7164
    在蛋糕订购小程序的前期,即需求分析阶段,我们对用户的需求进行了详细的描述,并且在需求规范中有详细的描述和阐明。根据系统需求的分析,对蛋糕订购的管理进行了整体的设计。着重对软件模块的设计进行了详细的分析,以达到对系统的需求。重点阐述了系统的划分、接口的确定、各模块间的......
  • 17_状态模式
    状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,通过改变状态类来改变对象的行为。状态模式有三个主要角色:环境类(Context):定义了一个状态对象的引用,并在需要的时候调用状态对象的方法。环境类可以根据内部......
  • 洛谷题单指南-二叉树-P4913 【深基16.例3】二叉树深度
    原题链接:https://www.luogu.com.cn/problem/P4913题意解读:计算二叉树的深度解题思路:首先介绍二叉树的存储方式,对于本题,直接用数组模拟,数组的下标即节点号structnode{intl,r;}tree[N];tree[i].l存的是节点i的左子结点,tree[i].r存的是节点i的右子节点。计算深度至......
  • 16_策略模式
    策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到独立的类中,使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,客户端可以根据需要选择不同的算法。策略模式有三个主要角色:环境类(Context):它持有一个策略对象的引用,并在需要的时候调用策略对象的......
  • 洛谷 P4173 残缺的字符串 卡常小记
    首先,使用匹配函数\(P(x_i,x_j)=x_ix_j-x_i^2[j\neq0]\)。容易发现,当存在\(i\neqj\)时,\(x_ix_j\)的系数只会增加,因此根据Schwartz-Zippel引理,随机一组\(x_{1\sim26}\)对应a~z即可。然后,对于NTT的过程,有两个卡常的点:一是点积reverse后转卷积的过程是舍......
  • 面试题 17.12. BiNodec
    树遍历的变形/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*convertBiNode(structTreeNode*root){if(!root)returnNULL;if(!roo......
  • RedisCluster集群中的插槽为什么是16384个?
    RedisCluster集群中的插槽为什么是16384个?CRC16的算法原理。1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位,若该位为0左移一位,若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5.重复将所有输入数据操作完成以上步骤......