c++反汇编与逆向分析学习笔记(一)基本数据类型和表现模式

今天记录一下反汇编的学习笔记,为了增加一下记忆深度。

先从基本数据类型和表现模式开始

整型:这里需要记忆的是short int long 这几种类型的字节数。
其次要区分一下有符号整型和无符号整型的区别在于首位。正因为有符号的首位变成了符号位,所以他的表示范围要和无符号的不同,但是整体区间是一样的。(同时这里引入一个知识点就是数据在内存里面的两种存放方式,一个是小尾,一个是大尾,小尾是数据低位放在内存的底端,大尾相反)

整型里面比较特殊的就是负数(负数在内存中都是以补码方式存在的,就是它对应正数的取反加一,因为计算机不会做减法,只会做加法),其中还有一个特殊的数,就是0x80000000这个数,它既可以表示为负数0,也可以表示为补码的0x80000001减去1,因为不需要负数零,所以就把他当成了后者,这个也就是为什么有符号整数区间负数总是比整数多一个最小值的原因。

同时我们再引入一个判断有符号整数的大小的方法:在首位小于8时,是正数,这个时候二进制越大则表示的数越大,在首位大于8时,是负数,0x80000000是最小的负数,这个时候二进制越大,这个负数也越大。就是一个是从零开始和从最小负数开始。

那么在实际分析中怎么知道是有符号还是无符号呢? 这就需要我们查看对应的函数的定义,看他需要的是有符号还是无符号的数。

浮点数类型:分为定点实数存储方式和浮点实数存储方式。
定点:就是约定好整数位和小数位的长度。
优点:存储效率高,也比较好快速转换为浮点数
缺点:存储不灵活,因为位数固定了,所以如果超过了限度就给转换。

浮点:分为指数域和数据域。就是用一部分存储小数点的位置,一部分存储抛开小数点的纯数据。
优点:存储灵活
缺点:效率没有定点高,因为毕竟其中还原的计算过程要比定点复杂。
后来因为推出了浮点协处理器使得浮点数计算变得方便,所以现在使用这种方式。

浮点数的操作不会用到通用寄存器,俄日是用浮点协处理器的浮点寄存器。

浮点数的编码的方式参考IEEE编码。
下面采用从高到低叙述。
float 1位符号位 8位指数位 23位数据位
double 1位符号位 11位指数位 52位数据位
注意一点,因为抛去符号位变成了二进制数以后最高位肯定是1,所以在存储数据位的时候第一个1是省略的。

下面还有一些基本的浮点指令我就先放一放,毕竟我现在用的也不是很熟悉。

字符和字符串
字符串编码是用的两个格式一个是ASCII(单字节)一个是Unicode(双字节)
ASCII和Unicode都可以存储汉字,但是存储方式不一样,ASCII使用GB2312-80(汉字国标码) 能存储6700多个汉字,
使用两个字节,一个是区,一个是位,很像一种查表方式。
Unicode使用的是UCS-2编码格式,这个只是保留了常用字(因为汉字博大精深,太多太多了),同时Unicode也可以采用那种区位的方式存储。这个时候采用的是UCS-4编码方式。
c++使用‘\0’作为字符串结束标志,ASCII使用一个,Unicode使用两个,同时不能Unicode处理ASCII的东西,因为会发生解析错误,这个和那个sql的宽字节注入可能是一个原因。
同时ASCII和Unicode数据在od里面显示的区别就是Unicode字符串会有‘点’,ASCII没有。

布尔类型 这个比较简单,我就不过多叙述了。(但是因为布尔的特殊性,很难还原为源码,但是转换一下等价代码还是可以的)

地址,指针和引用
由于有很多不必要的,所以跳跃一下。
指针赋值的步骤:先lea一下这个地址给寄存器,之后mov传给指针所在的地址。
指针取内容的步骤:先取出指针内的地址,再取出这个地址的值。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值