4.第二阶段x86游戏实战2-CE加强修改移动速度(浮点数存放方式与转换)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打 开百度网盘手机App,操作更方便哦

上一个内容:3.第二阶段x86游戏实战2-认识强大的CE找血量

上一个内容里通过搜索血量简单认识了CE这个软件(或者说是工具),本次来个趁热打铁在上一个内容的基础上,再深入理解CE的使用,CE有很多玩法,上一个内容里写的只是其中一种

然后本次来搜索角色的移动速度,上一个内容里可以看出使用CE搜索要通过一个可以改变的值来入手,所以既然要找移动速度那就要让移动速度发生变化才行,只有改变了移动速度才能使用CE多次搜索才能使用CE搜索得出来,移动速度这个东西,然后一般移动速度是本地的,也就是说本地修改之后其它玩家也能看到你速度加快了,但是不是本地的也要看游戏一般是本地的,一般移动速度加一点减一点服务器不会做检测,会在允许范围之内,也有的游戏会每次都会验证,本地修改移动速度会无效。

然后怎么更改移动速度?比如可以通过加速度的技能、加速度的坐骑等方式来更改移动速度,然后移动速度的数据宽度一般是一个字节、或者4个字节、也有可能是浮点型(小数),这里写到浮点型所以要写一下浮点型是什么

浮点数:

浮点型有单浮点(单位是float)、双浮点(单位是double),然后单浮点和双浮点都是小数,单浮点是4字节小数、双浮点是8字节小数,可以看出双浮点比单浮点表示的小数范围大,所以它俩的区别就是可以表示的数值范围不一样

然后浮点数的二进制转十进制或十六进制有点复杂现在不容易写明白,不过浮点数的二进制转十进制或十六进制不知道怎么转的也没事,对于逆向没有影响,因为CE这种工具都给转换好了,不需要我们自己转换

浮点数转换方式:

0 01111110 00000000000000000000000 这个二进制是0.5的二进制,然后怎么把二进制算成0.5的?为了防止看着头疼,公式就不写了,直接上傻瓜模式,如下图,小数在计算机中的存储方式,可以看出它分成了三段,这是以 IEEE 754标准存放的浮点数(小数)数据,计算机中常用的浮点数存储标准就是IEEE 754标准

三段分别的意思,下图红框圈出来的位(这些数是二进制数,一个二进制数的单位是位)它的值是1表示负数0表示正数,说它们是三段为什么只圈出了最左边的第一位?因为剩下的两段的名字不直观看了会蒙,为了遵循傻瓜模式指定不能让人看蒙了所以直接不写,直接继续看下方的例子

要注意虽然是遵循傻瓜模式但是不会 加乘除就没办法了,可以直接放弃,不要关注浮点数和二进制怎么转的了,使用CE这种工具给你转吧,不用钻牛角尖,知道怎么转的用处也不大。

如下图以单浮点为例,下图第二段也就是红框圈出来的这一段,首先把二进制是1的全部进行相加结果是2+4+8+16+32+64 = 126,然后下图圈出来一共有8位,然后就是2的7次方也就是2乘2乘2乘2乘2乘2乘2-1=127也就是7个2相乘然后减1的结果,然后用126-127=负1,然后就是2的负1次方也就是1除2=0.5,0.5就这样得到的

然后上面是一个简单的例子在看0.6的,0.6二进制是0 01111110 00110011001100110011010 可以看到它从左边数第三段有1有0了,这种怎么算?然后第二段与0.5一样所以第二段的结果也是0.5,所以就只剩下计算第三部分就可以了,如下图0.5是2的-1次方也就是1除以2等于0.5,0.25是2的-2次方也就是1除以2除以2=0.25其它的都是同理,它最后几位普通的计算器根本无法计算了,后几位是通过AI计算的,AI最后一位也计算不了了,然后最后一位粗略的值0.000000119209

然后把二进制的值是1的拿出来相加最终的结果是0.2000000476837158,得到这个结果之后对它进行加1,为什么加1?IEEE 754标准(或者说是规则)它规定了就得加1(实际上是加2的0次方,2的0次方的结果也是1),加完1之后的结果是1.2000000476837158,然后0.5乘1.2000000476837158结果就是0.6

计算的结果,然后可以看到下图红框0.6后面还有一堆数字,这是正常现象,计算机中的浮点数就是存在这种问题,这个问题叫做精度问题,所以在使用浮点数的时候要注意,高级语言都有专门处理浮点数的函数(直接百度搜C++精度问题这种关键字就能找到)可以避免精度问题

上方是通过IEEE 754标准进行二进制转浮点数的方式,然后浮点数转二进制,以 251.62 这个数为例子,首先251的二进制是11111011,也就是 1+2+8+16+32+64+128=251,然后0.62的二进制它需要计算0.62乘以2直到乘到整数为止,但是计算机有宽度单浮点只有23位,如果是循环小数最多只能乘23次2,多了计算机没法存放,然后开始计算

0.62乘以2结果是1.24,然后二进制取整数位也就是1

然后上方把1拿了出来所以就是0.24乘以2,结果是0.48,然后把0拿出来,现在的二进制是10

然后是0.48乘以2,结果是0.96,然后把0拿出来,现在的二进制是100

然后0.96乘以2,结果是1.92,然后把1拿出来,现在的二进制是1001

然后上面把1拿了出来所以就是0.92乘以2,结果是1.84,然后把1拿出来,现在的二进制是10011

然后0.84乘以2,结果是1.68,然后把1拿出来,现在的二进制是10011

然后0.68乘以2,结果是1.36,然后把1拿出来,现在的二进制是100111,然后0.62不能精确表示一个有限的二进制小数,所以就取到100111,不信的可以继续往下乘以2

然后251.62的二进制就是11111011.100111,这个11111011.100111是251.62的二进制表示法并不是计算机存储的那个,计算机存放浮点数是遵循的IEEE 754标准,所以要把11111011.100111转成IEEE 754标准,转换方式

首先把11111011.100111变成1.1111011100111这样的,也就是小数点往前移动,一直移动到左边剩1位,然后小数点移动了7位,然后127+7(移动几位就加几)得到134,这个134的二进制是10000110,这就是第二部分,第三部分11110111001110000000000(23位,不够23位往后面补0),超过23位计算机没法存(现在的计算机可以存,用双浮点就可以存了,如果双浮点是52位不够52位就补0),最终的二进制是0 10000110 11110111001110000000000

以单浮点IEEE 754标准为例:

符号位:0(正数)

质数位:10000110

尾数位:11110111001110000000000

质数位说的就是第二部分、尾数位说的就是第三部分,这俩词很抽象很难理解直接忽略

补充:

0.5转二进制的转法,上面写了小数部分乘以2,0.5乘以2等于1,然后二进制就是0.1,上面通过往左移动小数点的次数对127进行相加得到了第二部分,这种只有1位的怎么移动?这里记住0就是127-1=126所以第二部分的二进制是01111110,第三部分,0.5的二进制是0.1,这个1根据IEEE 754标准它会隐藏,所以0.5第三部分的二进制是00000000000000000000000也就是23个0,只要二进制是0.几的默认把后面第一个1隐藏变成0就可以了

然后移动速度的值一般0-30左右,所以先使用范围搜索

如下图

然后通过上图可以看到数值类型是单浮点,这是通过挨个试,试出来的,然后根据经验移动速度一般是字节、4字节、单浮点这三种

然后搜索,如下图搜出了很多

然后来到游戏中,改变移动速度,这里是通过技能减少了移动速度,然后就选择数值减少了

然后还原移动速度,也就是增加移动速度,然后如下图

然后扫描之后结果又变少了,但还是很多,所以继续

这次什么移动速度没有变化,所以如下图,使用未变动的数值扫描

然后扫描之后

然后继续减少移动速度(开始重复上面的步骤了)

然后最终剩下125个,现在可以动手了

首先如下图CTRL+A全选结果,然后点下图红框

下图红框圈出来的有整数、有小数、小数是0.几还有带字母的科学计数法的小数,这些可以忽略,因为这些一看就不满足移动速度这个东西

下图和上图不一样了,这是因为通过上面的步骤重新找了一次(上面是边记录边找的,搞的有点乱所以重新找了一次),然后最终发现一件事,它原本的速度是整数,如下图,原本速度是4,它是一个整数,这怎么发现的?通过坐骑,坐骑加百分之80的速度发现的,之前通过技能改变的移动速度,技能改变的速度是把移动速度减半,所以没发现

然后给它改成1000之后效果跟瞬移一样了

然后符合移动速度的小数,如下图

然后上面是通过坐骑发现它原本速度是4,如果没有坐骑怎么确定?如下图,把带字母的小数也就是科学计数法全部删掉,如下图选中之后右击点击删除记录,这种带字母的可能是内存地址,如果随意更改会游戏会崩溃,所以这里要先把带字母的全部进行删除记录

删除所有带字母的之后,然后如下图选中一半剩下的数值

然后鼠标右击选择更改记录里的数值

然后这个数值最好改的大一点,如果改动很小会感觉不出移动速度变快了,从而导致错过正确的值

然后更改完之后回到游戏看看移动速度有没有变化,如果没有变化再选择剩下的那一堆地址进行更改记录然后选择数值,然后再回到游戏,一般经过这两次的修改肯定有一次游戏的移动速度变快了,如果下图绿框里修改之后游戏移动速度变快了,那就把红框里的地址(内存地址)全部删除

然后如下图,再从剩下来的内存里选中一半然后更改它们的值,然后就开始重复上面的步骤了,这样一半一半的改最终肯定会找到移动速度的地址(内存地址)


相关推荐
编程乐趣1 小时前
自学C#,要懂得用好对象浏览器
windows·.net
DolphinDB1 小时前
如何在C++交易系统中集成高性能回测与模拟撮合
c++
xkroy2 小时前
网络协议概念与应用层
网络
筏.k2 小时前
C++ 网络编程(14) asio多线程模型IOThreadPool
网络·c++·架构
qq_393828222 小时前
办公文档批量打印器 Word、PPT、Excel、PDF、图片和文本,它都支持批量打印。
windows·word·powerpoint·excel·软件需求
好名字更能让你们记住我2 小时前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
门思科技2 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
单线程的Daniel2 小时前
Dubbo RPC 序列化问题记录
windows·rpc·dubbo
小高不会迪斯科2 小时前
MIT 6.824学习心得(2) 浅谈多线程和RPC
网络·网络协议·rpc
清醒的兰3 小时前
Qt 基于TCP套接字编程
网络·qt·tcp