-
-
[原创]手游之u3d之so文件浮点数如何转换arm汇编指令
-
发表于: 2020-12-18 12:22 2626
-
文章标题不知道怎么取。。。
所需工具:
010editor
IDA
一款国外的游戏,u3d引擎,进入看到游戏内货币初始值是150000.00,数值是浮点数
由于这游戏是libil2cpp.so的,正常思路都是通过Il2CppDumper工具去获取dump.cs,然后去各种搜关键字,但是这里不这么操作,也不是本文的要讲的,本文要讲的是浮点数如何转换arm汇编指令,下面直接进入正题。。。
先说个例子,比如浮点数22.8125如何转换为arm汇编
(1)整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。
22/2 商11 余 0
11/2 商5 余 1
5/2 商2 余 1
2/2 商1 余 0
1/2 商0 余 1
得到22的二进制是 : 10110
(2)小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数后第一位0为止,将整数顺序排列。
0.8125x2=1.625 取整1 小数部分是0.625
0.625x2=1.25 取整1 小数部分是0.25
0.25x2=0.5 取整0 小数部分是0.5
0.5x2=1.0 取整1 小数部分是0
得到0.8125的二进制是 : 0.1101
(3)结果:十进制:22.8125 等于二进制:10110.1101
(4)10110.1101 用科学记数法表示:1.01101101*(2^4)【小数点向左移了4位,所以是2的4次幂】
(5)不要1. 取剩下的01101101
(6)4+127=131 131的二进制是:10000011
4由来:4次幂
127由来:
float的指数(E)是8位,所以根据2^(8-1) - 1 = 127
double的指数(E)是11位,所以根据2^(11-1) - 1 = 1023
类型------符号位-----------指数位------------尾数位----
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)
(7)0 10000011 01101101 000000000000000
0表示正数 + (6) + (5) + 补0 【总的32位】
(1表示负数)
(8)01000001101101101000000000000000转为16进制为:0x41B68000
注:如果最后合并出来的二进制数超过32位,则只取前32位并加1
(9)最后转换为汇编:
MOV R0,#0x8000(02 09 A0 E3)
MOVT R0,#0x41B6(B6 01 44 E3)(T表示高位)
根据上面的转换方式,看看游戏中的数值150000.00
150000/2 0
75000/2 0
37500/2 0
18750/2 0
9375/2 1
4687/2 1
2343/2 1
1171/2 1
585/2 1
292/2 0
146/2 0
73/2 1
36/2 0
18/2 0
9 /2 1
4/2 0
2/2 0
1/2 1
将余数逆序排列
100100100111110000
小数点是.0,直接就是0
二进制就是:100100100111110000.0
转科学计数法:1.001001001111100000*(2^17)
17+127 = 144
144二进制:10010000
拼接后:0 10010000 001001001111100000
补0:01001000000100100111110000000000
再转换为16进制:0x48127C00
最终10进制浮点数150000.00转为16进制0x48127C00
这时候再用ida打开libil2cpp.so,搜索立即数0x4812
有3处,这个游戏比较简单,搜索出来的数值比较少,很容易验证,经过验证后,第一个就是了,修改不是本文的重点,重点是它是如何转换的。
这里我修改为7088000000.00
转为16进制为:0x4FD33D26
转为汇编为:(切段,2个字节为一组)
MOV R1,#0x3D26(26 1D 03 E3)
MOVT R1,#0x4FD3(D3 1F 44 E3)(T表示高位)
修改后:
在这个网站中可以转换指令:https://armconverter.com/
重新打包后运行:
购买车辆也是可以购买的
文中使用到样本下载地址:
https://apkpure.com/cn/world-truck-driving-simulator/com.dynamicgames.worldtruckdrivingsimulator
有兴趣的可以进群交流,QQ群:542863693,主要用于手游安全分析
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [分享]frida主动调用init_array中的函数 1613
- il2cpp api偏移查找 2517
- [原创]一次svc简单绕过 3845
- [分享]global-metadata.dat,libil2cpp.so解密修复 14007
- [原创]PE文件格式 2760