课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
对于程序员来说,一般都可以通过代码的逆向还原来实现对一款软件的结构解析的。下面我们就一起来了解一下,在代码还原中的数据类型都有哪些表现形式。
一丶简介代码还原
例子一:我们很多人都学习过汇编.但是汇编的核心知识就是我能看的懂.有人拿汇编去做外挂.比如我去追偏移.看着视频去做.然后换一个游戏依然这样.但是终有一天,你可能发现没意思了.因为这些知识都是死的.比如我们想看游戏中,这段代码做了什么事情.这个时候就需要将汇编转为高级代码查看了. IDA的F5插件.一般能做到.但是很多是做不到的. 比如游戏中.这段代码你找到一个对象+多少偏移是什么什么功能.但是会逆向的人.这段代码抠出来.转为高级代码.一看.原来这个意思.+多少是什么作用.另外还实现了什么功能.这个就是核心技术了.为什么别人的外挂功能比较多.你的比较少.其核心就在这里.
例子二:算法逆向,如一个软件.让你追出注册码.你可能就爆破.但是如果你能把它算法逆出来.那么是不是一提升了自己,二,自己可以写注册机专门为这个程序生成注册码了.
例子三: 如果你是为公司工作.可能某一天,公司需要你进行逆向.发现xx软件的一个功能比较好.此时你需要怎么办.完整的根据汇编去逆向出来这个功能.并且让公司去做出这个功能.这个也是一个很好的例子.
二丶代码还原中的数据类型表现形式
上面说了很多了,那么真正的开始篇幅讲解.
1.整数类型
C++中整数的基本数据类型有三种, int long short. 在 VC6.0中,int long所占内存都是4字节.
short两个字节. 以16进制为例 int long 分别就是4个字节. short两个字节. 一个字节是8位.
2.无符号整数
在内存中,无符号整数是用来表示数值的.如果32位下.那么取值范围是 0x00000000~0xFFFFFFF
10进制: 0~4294967295,因为无符号数,那么高位就是0填充.所以表示数值比较大.
3.有符号整数
有符号整数跟上面无符号整数一样.只不过高位用来表示符号位,其余低位表示数值.这样有符号的整数.表示的数值就只有31位了.范围则是 0x80000000~0x7FFFFFFF 转为十进制: -2147483648~ 2147483647
因为高位是符号位,可以表示 负数. 例如 -3
在内存中负数都是补码形式表示的
补码规则: 补码规则则是用0 - 去这个数的绝对值
例如: 0 - 3 的结果就是 -3在内存中的表现形式.
因为补码高位为1,要转为真值也是 0 - 补码的形式. 但是一般计算机计算的话,通常都是用补码取反+1进行获得真值. 前边带上符号即可.
为什么负数取值总比整数取值多一个值.
例如如上:
-2147483648~2147483647
原因:
对于四个字节补码 0x80000000 代表的是-0. 但是对于0来讲. 正负区分没必要.所以0x800000000规定了就是4字节补码小值了.所以这也是负数比正数多一位的原因.
4.浮点数数据类型
关于浮点数存储.科学上有很多争议.有很多存储实数(小数)的方式.不过很少用了.所以我们也不再介绍了
现在是不管如何存储.都分为 定点实数存储 跟 浮点数实数存储 这两种方式
定点实数存储
定点实数存储,就是约定整数位和小数位的长度.比如4个字节为例,高2个字节存储整数.低两个字节存储实数.这样的好处是计算的效率高,缺点是存储不灵活.比如存储65536.5 整数部分已经存储不了65536了.
浮点实数存储
浮点实数存储就是用一部分二进制位存放小数点的位置信息,我们可以称之为指数域其它的数据位用来存储没有小数点时的数据和符号,我们可以称之为数据域丶符号域
如:
67.625 我们可以使用浮点实数存储, 数据域 可以存放67625 小数位置可以记住位置为 10~-3次方 ,对这个数进行访问的时候.只需要计算一下即可.
优缺点: 优点缺点跟一种是相反的. 80286CPU之前,程序员常常为实数的计算,伤脑筋.后出来了浮点协处理器.可以协助CPU计算.程序员计算实数的效率就大大的提高了.于是现在 浮点存储的方式就推广了出来
注意: 现在都是二种方法进行存储的.不是定点存储方式了
C++中的浮点
在C++当中,有浮点数 float 以及 double用来存储浮点数. float 4个字节. double 8个字节.
由于double空间大,所以精度高. 两种数据类型在内存中同样的是16进制存储.但是与10进制的16进制不同. float dobule 的16进制比较大.
原因:浮点类型并不是将一个浮点小数直接转为二进制进行存储的.而是将浮点小数转换成二进制,重新编码.再进行存储.C/C++中的浮点数是有符号的.
值得注意 浮点数转为整数,并不是四舍五入.而是向0取整. 也就是说舍弃小数位.转为整数.
例如: a = 3.78; int b = (int) a; 此时b的值是3. 而不是传统意义上的 4; 因为不是四舍五入.
5.浮点编码
浮点编码转换.
我们上面说了,浮点数是重新进行编码进行存储的.所以我们只要搞明白了编码.那么就可以自己算出浮点数在内存中怎么表示.或者反转回来.16进制怎么转换为浮点数
浮点编码采用的是 IEEE规定的编码.
float double转换方式一样. 都是因为表示范围不一样.所以编码方式有些特别.
1.浮点编码的编码方式
浮点编码,会将一个浮点数转为二进制数.以科学计数法进行区分.分为三部分
1.符号域
2.指数域
3.尾数域
节选:博客园
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!