首页
社区
课程
招聘
[原创]手游之u3d之so文件浮点数如何转换arm汇编指令
发表于: 2020-12-18 12:22 2626

[原创]手游之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期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//