本文转载自 iOS 越狱教程-内存基址修改器的神奇之处,感谢 Acreson 分享干货满满的教程。本人进行了重新排版以及小部分内容修改,并根据教程重新截图及录视频(部分)并修改验证。
前言
iGameGuardian(以下简称 iGG) 是一款内存基址修改工具,支持 iOS 8.x ~ 13.3.1 越狱设备。
整数和浮点数
iGG 支持以下几种格式:整数和浮点数
整数分为:
- 8 位元整数
- 16 位元整数
- 32 位元整数
- 64 位元整数
浮点数分为:
- 32 位浮点数
- 64 位浮点数
整数与浮点数之间的区别
两者的存储方式不一样,整数是直接以二进制形式进行存储,对于浮点数,需要将小数部分和指数部分分开存储。两者之间的区别还有如下:
- 整数没有小数部分,浮点数有小数部分;
- 浮点数可以表示的范围比整数大;
- 对于一些算术运算(两个很大的数相减),浮点数损失的精度更多;
- 在任何区间内都存在着无数个实数,所以计算机的浮点数不能表示区间内的所有值,通常只是实际值的近似值;
- 过去,浮点运算比整数运算慢。不过有了浮点处理器,速度上的差距有了一定的缩小。
整数
int
类型是有符号整型,可以是正整数、负整数或零,其取值范围依计算机系统而异。
一般而言,存储一个 int
数据需要占用一个机器字长,正负号会占用其中一位。
处理器的机器字长越长,int
的范围越大。ISO C 规定,int
的取值范围最小为 -32768 ~ 32767
。
八进制、十进制、十六进制 int
型数据的显示:
- %o - 八进制
- %d - 十进制
- %x - 十六进制
如果是需要显示各进制数的前缀 0、0x 和 0X,必须分别使用 %#o、%#x、%#oX。
占用存储空间:short <= int < long < long long
个人 PC 上常见的设置:
- long long - 64bit
- long - 32bit
- int - 16bit/32bit
- short - 16bit
C 语言标准对基本数据类型之规定的允许的最小大小。
short、long、long long 和 unsigned 类型数据的打印:
- %u - unsigned int
- %ld - long int
%lo
、%lx
形式将long
型数据以八进制、十六进制打印;- 对于
short
类型,使用h
前缀,%hd
、%ho
等都是有效的; l
和h
前缀都可以和u
一块使用。
在使用
printf()
函数进行打印的时候,确保转换说明的类型与待打印值的类型相匹配,否则,会有意想不到的错误。
对于 short
型数据,不管是以 %hd
形式进行打印还是以 %d
形式进行打印,结果都是一样的。
原因:在给函数传递参数时,C 语言编译器会把 short
类型的数据自动转换成 int
。
- 转换的原因为
int
类型被认为是计算机处理整数类型时最高效的类型,在short
和int
类型的大小不同的计算机中,用int
类型的参数传递速度更快; - 使用
h
修饰符可以显示较大整数被截断成short
类型值的情况。
浮点数
float、double、long double
C 语言标准规定,float
类型必须至少能表示 6 位有效数字,且取值范围至少是 10^(-37) ~ 10^(+37)
。
通常,系统存储一个 float
类型的数据需要占用 32 位,其中 8 位用于表示指数的值和符号,剩下 24 位用于表示非指数部分(也叫做尾数或有效数)及其符号。
double
类型和 float
类型的最小值范围相同,但至少能必须表示 10 位有效数字。
一般情况下,double
类型的数据占用 64 位而不是 32 位,一些系统将多出的 32 位全部用来表示非指数部分,这种做法不仅增加了有效数字的位数(提高精度),还减少了舍入误差。
还有一些系统会把其中的一些位分配给指数部分,以容纳更大的指数,增加可表示数的范围。无论如何,实际情况中 double
类型的数据至少有 13 位有效数字,超过最低标准。
浮点型常量
浮点型常量的基本形式
有符号的数据(包括小数点),后面紧跟 e 或 E,最后是一个有符号数表示 10 的指数。
例如:-1.56E+12、2.87e-3 等
简写形式
+
可以省略,可以没有小数点「例如:2E5」或指数部分「例如:19.28」,但是二者不能同时省略;
可以省略小数部分「例如:3.E16」或整数部分「例如: .45E-6」,但是二者不能同时省略;
除了上述的简写形式,以下几种简写形式也是有效的「3.14159、.2、4e16、.8E-5、100.0 等」。
注意:不要在浮点型常量中间加空格。
浮点数的使用
float some = 1.0 \* 2.0
默认情况下,编译器假定浮点型常量是 double
类型的精度。
对于上述表达式的处理,4.0 和 2.0 会被存储为 64 位的 double
类型,使用双精度进行乘法运算,然后将乘积截断成 float
类型的宽度。
虽然说这种计算方式得出来结果精度更高,但是会减慢程序的运行速度。
- 在浮点数后边加上
f / F
后缀可覆盖默认设置,编译器会将浮点数常量看作是float
类型; - 使用
l / L
后缀使得数字成为long double
类型; - 没有后缀的浮点型常量是
double
类型。
浮点数的打印
%f
- 打印十进制计数法的float
和double
类型浮点数「%Lf
等亦可」;%e
- 打印指数计数法的浮点数「%Le
等亦可」;%a
- 打印十六进制的浮点数(前提是系统支持)「%La
等亦可」。
浮点值的上溢和下溢
上溢(overflow):数字过大,超过当前类型能表达的范围。
下溢(underflow):当前类型数据的全精度被损失。
综述
上面讲了什么?任意截取一段文字进行搜索,就会搜索到上面的整数与浮点数全是来自于 C 语言相关资料。下面介绍 iGG 实际应用方面,仅供个人测试验证。
iGG 设置
如图设置即可
选择进程
最笨的方法是,打开 iGG 后再打开游戏,那么游戏的进程就会显示在进程列表的最下面。
如果需要确定游戏进程,可以使用 Apps Manager 插件找到游戏,点击程序包跳转到 Filza 后看到游戏名称,点击进入后看到 *.app,app 前面就是游戏进程名称。
选择游戏进程后无任何动作及跳转,需自行点击搜索。不要误以为选择进程后,下面就会自动帮你把游戏修改好,还没有那么智能化。
修改游戏
目前《我功夫特牛》(下面简称功夫)仅支持 64 元浮点数和 32 位元整数。
关卡
只有一种方法修改关卡,顾名思义就是跳关了,关卡数是 32 元整数。
在 iGG 中操作为搜索 i32,不管是什么关卡,进去是 1,然后 i32 搜索 1,每打一关,搜索数值递增,一般搜索到第四关就出来了,2 到 4 个结果为准,然后开启右上角开关全改成默认关卡最高关卡,就是当前关卡。
安全第一,比武大会那里修改需要更小心谨慎。
具体操作视频如下:
金币、悟性值
改金币很多种,常见的就是碎片兑换、关卡奖励、任务,这里只讲解任务里面的那个,当然也可以改其他,包含任务中的所有奖励,建议是不常见的数字,尽量不要是 1 或者 2,比如 234 和 567 这种。
任务+装备+碎片兑换模式都是 64 位浮点数模块,所有你搜索的时候都是要以 F64 搜索,视频中的奖励悟性值是 90,金币奖励值是 50.0K(自然是 50000)。
- 悟性值修改时 iGG 搜索 F64 - 90,结果在 100 个以内才行,全部修改自己需要的悟性值数量,建议在 80W 以下。
- 金币修改时 iGG 搜索 F64 - 50000,结果在 100 个以内才行,全部修改成自己需要的金币数量,建议在 80000000 以下。
安全第一,具体操作视频如下:
荣誉值、玄铁、陨铁
改荣誉值有很多种方法,常见的就是关卡奖励、任务,这里只讲解任务里面的那个,当然也可以改其他,包含任务中的所有奖励,建议是不常见的数字,尽量不要是 1 或者 2,比如 234 和 567 这种。
任务+装备+碎片兑换模式都是 64 位浮点数模块,所有你搜索的时候都是要以 F64 搜索,视频中的荣誉值的奖励值是 40,玄铁的奖励值是 1.00K(自然是 1000),陨铁的奖励是 10。
- 改荣誉值时 iGG 搜索 F64 - 40,结果在 100 个以内才行,全部修改成自己需要的荣誉值数量,建议在 5w 以下。
- 改玄铁时 iGG 搜索 F64 - 1000,结果在 100 个以内才行,全部修改成自己需要的选贴数量,上限是 999K,你随意。
- 改陨铁时 iGG 搜索 F64 - 10,结果在 100 以内才行,全部修改成自己需要的陨铁数量,建议 90000000 以下。
安全第一,具体操作视频如下:
血量、攻击
血量、攻击,具体搜索是 32 元整数。
修改血量时,iGG 搜索 I32 - 当前血量数据,结果在 10 个以下,然后保存,再锁定,即可实现锁血。
修改攻击时,iGG 搜索 I32 - 当前攻击数数据,结果在 100 个以下,全部修改有效。
装备碎片
装备碎片,具体搜索是 32 元浮点数。
可以直接按照自己意愿修改,使用 F64 修改即可,结果在 100 个以下,全部修改有效。
安全第一
修改游戏本就是逆天而行,封号是很正常的事情。数据对比就可以发现作弊行为,适量修改切勿修改过高数据。
悬浮窗插件
MilkyWay 支持 iOS 11 ~ 12,MilkyWay2 支持 iOS 13。Pullover Pro 支持 iOS 11 ~ 12,暂未更新支持 iOS 13。