首页
社区
课程
招聘
[原创]最近拿到一个ROM
发表于: 2019-12-31 22:48 12936

[原创]最近拿到一个ROM

2019-12-31 22:48
12936

最近拿到一个ROM,刷入手机后,在联网情况下,手机在几分钟内就会自动重启,不联网就不会重启,猜想这个ROM应该在某处做了验证。看到这,瞬间来了兴致,抓包看看吧,刷入Magisk,获取ROOT权限,把tcpdump推入手机执行,但是并没有抓到什么有用的东西。仔细想想,好像抓包确实不是一个很好的切入点,即使抓到了又如何,也不能知道它在哪里触发重启。思来想去,想来思去,最后想到了一个切入点,把/system/bin/reboot改成其他的名称:

好,重启手机

重启后,在联网状态下,等了许久,发现它不自动重启了,大功告成了?结束了?然而我们不满足于此。翻一下logcat,看到了敏感的日志:

看到doVerify方法,这可能就是验证的地方。为了寻找com.android.server.SystemServer类在哪个系统库里,在Android源码的frameworks目录下搜索class SystemServer

寻找这个类所属的Android.mk

好了,现在知道它生成时会编译进services.jar,查看一下:

什么?它才几b?原来这个jar在生成的时候,被优化成odex文件了,它的所有逻辑代码都在它对应的odex里面,具体文件在/system/framework/oat/arm64/services.odex

把它pull出来,转换成dex,转换成dex需要以下几步:

(1)将odex反编译成smali

反编译odex的过程中会报很多错误,原因都是缺少依赖,缺少什么依赖,我们就将它从手机pull出来,并放在 services.odex同级目录下,等到不缺依赖的时候,反编译也就能完成了。

(2)将smali转换成dex

好了,把生成的dex拖进jadx反编译,转到com.android.server.SystemServer类,搜索上面报错日志中出现的doVerify方法,果不其然,找到了我们想要的东西:

注:打码的地方是服务器的链接

它的校验逻辑是从/proc/cmdline读取serialno,然后将serialno和当前的时间(精确到小时)的格式化形式传入encrypt方法加密

得到的字节数组通过hexByteToString方法转成16进制字符串

取得到的16进制的字符串,通过Http Get方式去服务器校验

服务器传来一个16进制字符串,通过hexStringToByteArray方法将服务器返回的转换成字节数组

字节数组又和时间传入上面的encrypt方法,解密得到结果。

如果解密结果为pass,说明你的机子验证通过了,很荣幸,你的机子不用重启。如果解密结果为refuse,那就麻烦了,你的机子验证不通过,接受重启的制裁吧!

分析到这里也差不多了。在SystemServer类里,调用doVerify方法的就一个地方,我们在smali代码中把它注释掉

那么问题来了,修改了生成了dex,要怎么把dex转换成odex?原来我们上面所看到的services.odex属于oat格式,我们可以通过Android自带的dex2oat工具将dex转换成odex,命令如下:

成功后,会在/data/local/tmp目录下生成services.odex。odex生成了,把它替换到system镜像吧

生成的system_new.img就是我们新打包好的镜像了,把它刷进手机

刷好了,重启手机,开机后几分钟,手机还是重启了,怎么回事?明明doVerify方法的调用已经去掉了啊。校对了一下手机里的/system/framework/oat/arm64/services.odex,不是我们编译出来的那个。懂了,原来是被系统还原了。找了一番,这种机制叫做dm-verify,开机前会校验系统的完整性。那得想办法去掉它。

去掉它一个很简单的办法是借助ROM修改工具处理boot.img,处理时勾选去除boot校验

处理后,把boot.img刷入手机

刷入后重启,开机,过了许久发现我们的手机也没有重启,这次真的是大功告成了。

总结: 这个ROM的验证逻辑还是很简单的,只是在操作的时候要编译来编译去有点麻烦。根据这个案例,让我懂得,如果作为一个ROM的改造者,并且采用重启的方式来限制非注册用户,那么重启的时候,不要采用reboot命令来重启,也不要使用这种简单的加密算法。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-1-6 05:22 被luoyesiqiu编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (21)
雪    币: 1144
活跃值: (1254)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
无痕,七月份就研究了,改hosts不是更简单吗?
2019-12-31 22:59
0
雪    币: 2685
活跃值: (3680)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
seandong 无痕,七月份就研究了,改hosts不是更简单吗?
要只是想过校验的话,改hosts确实也是一个思路。不过本文主要想分析它是怎么校验的,以及分享一些关于ROM的修改思路
2020-1-1 08:40
0
雪    币: 641
活跃值: (404)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
落叶似秋 要只是想过校验的话,改hosts确实也是一个思路。不过本文主要想分析它是怎么校验的,以及分享一些关于ROM的修改思路
分析的很好,我觉得要的是这个解决问题的思路,方法有很多,但是都值得尝试一下.
2020-1-2 11:27
0
雪    币: 1071
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了
2020-1-2 14:08
0
雪    币: 1993
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
不错
2020-1-2 17:31
0
雪    币: 758
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个可以哦
2020-1-3 09:51
0
雪    币: 1895
活跃值: (1642)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
学习了。
2020-1-3 09:59
0
雪    币: 8199
活跃值: (2696)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了,仰望中
2020-1-4 12:46
0
雪    币: 2884
活跃值: (6641)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果要是写到内核里估计你就不能这么折腾了
2020-1-5 04:34
0
雪    币: 0
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了。
2020-1-5 10:19
0
雪    币: 2685
活跃值: (3680)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
爱我佳鑫 如果要是写到内核里估计你就不能这么折腾了
是的
2020-1-5 15:22
0
雪    币: 118
活跃值: (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了。非常详细
2020-1-5 20:19
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了
2020-4-1 20:04
0
雪    币: 2141
活跃值: (4522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你好 有样本分享吗 我搜不到这个room
2020-4-3 09:11
0
雪    币: 293
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
大神你好,能联系下嘛
2020-4-13 13:54
0
雪    币: 221
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
思路流逼,学习了,能交流请教吗,扣:724818436
2020-5-5 11:33
0
雪    币: 56
活跃值: (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习了
2020-7-9 12:59
0
雪    币: 761
活跃值: (628)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习了
2020-7-15 09:59
0
雪    币: 259
活跃值: (159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了
2020-7-17 00:30
0
雪    币: 19950
活跃值: (4942)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
感谢分享
2020-7-17 07:46
0
雪    币: 0
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
测试vivo y71a版无效,系统8.1.0,cpu,高通,magisk也无效。。。。。。
2022-5-6 12:45
0
游客
登录 | 注册 方可回帖
返回
//