游戏安全实验室 首页 游戏漏洞 查看内容

【游戏漏洞】逆向基础之数据类型

发布于:2018-2-23 15:24   |    115896次阅读 作者: 外部投稿    |   原作者: 通化程序员

不同的数据在内存中的存放方式是不同的,我们说内存中每一位只存放了01,用来表示整数很容易

例如00000011表示3。

那怎么表示小数怎么表示文字符号呢?

因为我们知道内存里是没有小数点没有文字的。

这就需要不同的存放方式,用正确的方式也就是数据类型读取数据才能得到正确的值。

例如整数型的1 如果我们用小数的形式去读取他就不是1了,这和我们现实生活中是不一样的,因为他的储存方式是不同的。

在我们用CE搜索数据的时候 首先要注意的也是他的数据类型。

 

 

了解数据类型之前 我们要先了解下数据宽度。

位是计算机最小的储存单位,1个字节有8位,字节是我们应用的最小单位,我们在ce od中看到的一个字节,实际就是8位的0和1二进制转成16进制表示的,这样更方便我们查看。

 

 

那么我们来看看不同的数据类型在内存中是怎么存放的。

 

整数类的存放很容易,只是一个进制转换而已。

例如 byte,word,dword,short,int等等

拿1举例子,

byte 型的1在内存中就是  0x01 这样的存放的

word和short 型的1在内存中就是  0x0001 这样存放的 ,但是用字节集表示就是  01 00

他为什么是反着排列的呢?其实这里是存在大端和小端的区别的,我们正常使用的都是小端也就是上面的排列方式,

例如有一个地址 12345678  里面存放的是1

如果不是按照上面的方式来读取,导致的后果就是 12345678这个地址以byte型去读是1,而以word型去读就变成100了,这样明显是不对的,在类型转换上存在着严重的问题,所以人为规定,高位在后,低位在前,来兼容数据类型的转换。

dword类型也一样,高位在后,低位在前。

如果没看懂,来一个简单的实例

内存中   01 02 03 04 以dword 型读出来的数据就是04030201   

以word型读出来的数据就是0201

byte型读出来的数据就是01

 

 

字符和字符串在内存中是怎么存放的呢,我们知道内存中是没有符号的,只有0和1。

例如,char a=65; 和char a='A';是相同的

也就是说我们强制规定,某个数值等于某个符号,然后进行字库关联,这就是编码。

一个字节可以表示的范围00-0xFF那么用一字节可以表示256个符号,但是一般用不到第一位 128个符号足够了。大家可以看看自己的键盘 ,是不是不超过128个符号呢?这就是asc编码 也就是文字符号的储存方式。

可是中文不像英文那样几十个符号就可以表示 中文汉字有几万个,那么我们就需要复杂的编码表。

是这样设计的,把127个符号以后的符号用作表示汉字的一半前127保留原来的含义,这样2字节表示一个汉字 就有了万种左右的组合。

但是这只是基本的情况够用 还是不能表示全部的汉字,那么就又有了其他的编码。

例如unicode utf-8 等编码 当然其他国家和地区也可以有自己的编码。

例如中国台北的big5编码等等。

在我们逆向过程中最常用的3种编码是

asc unicode utf-8

那么怎么用CE扫描这三种编码呢?

asc直接扫描即可

 unicode勾选上单选框

utf-8不能直接扫描,要先输入字符串,然后把value type改成字节数组,他就会自动转换成utf-8字节集,然后搜索即可

 

如上图,CE自动把汉字转成utf-8字节集。

 

 

 

小数在内存中的储存方式

第一步把小数转成二进制 例如8.25=1000.01

第二步转成科学计数法 1.00001*2^3

第三步后二十三位存小数部分00001000000000000000000

中间8位 第一位 浮点数大于1 是1 小于1是0

然后把次数-1填写进去 中间8位10000010

第一位存符号正0负1

这个过程不需要掌握,知道有这样复杂的步骤即可,因为我们也不会没事自己去转换,重点是要理解,不同数据类型存放方式的不同。


来源:通化程序员-公众号投稿

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞0

收藏

上一篇:【游戏漏洞】逆向基础之发包函数和线程发包

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部