[黑科技] ROM定制
1 前言
最近在对ROM定制进行了预演,整个过程挺好玩的,这里分享一下。
目前遇到需求主要有:
- 修改系统交互
- 普通应用修改为系统应用
- 普通应用绕权限检验
2 工具介绍:
-
adb: 不解释
adb shell dumpsys activity | findstr "mFocusedActivity" //获取当前activity名称
adb logcat |tee log.log //将日志打印到文件
adb logcat |grep AppOps //打印指点TAG的日志
adb push E:\apk\ /sdcard/ //将文件导入sdcard -
apktool: 查看apk的资源 xml等文件
apktool.bat d -f release.apk -o release -
dex2jar: 将dex转成jar文件
dex2jar.bat classes.dex -
jd-gui.exe: 查看jar
-
baksmali: 把dex文件转换成smali文件的工具(dex文件无法修改,要想修改源码,必须把把dex文件转换成smali文件)
java -jar baksmali-2.0.3.jar -x classes.dex -
smali: 把smali文件转换成为dex文件的工具(修改完smali文件,自然需要把它还原到最初的dex文件)
java -jar smali-2.0.3.jar -o classes.dex out -
signapk.jar: 对apk进行签名(没经过签名的包最终会安装失败,提示“解析程序包出现问题”)
java -jar signapk.jar platform.x509.pem platform.pk8 HelloWorld.apk Signed.apk -
janus.py: 利用漏洞Janus允许恶意攻击者任意修改Android应用中的代码,而不会影响其签名
python janus.py classes.dex app-debug.apk out.apk -
findApkByActivity.py: 将遍历目前下的apk,寻找包含目标Activity找对应包名
3 修改系统交互
要明确一点,手机上看到的任何一个界面(拨号界面、设置界面),实际上都是对于的ROM包上的一个apk,因此如果修改这些界面或交互,实际上就是修改对应的apk。
3.1 根据Activity寻找对应的apk包名
-
通过adb命令,得知待修改界面的Activity名称
adb shell dumpsys activity | findstr "mFocusedActivity" -
通过findApkByActivity.py:脚本寻找对应包名
将ROM下的apk拷到某目录下,执行该脚本 。
脚本的本质是利用apktool.bat将apk反编译,然后读取AndroidManifest是否包含目标Activity关键字。
3.2 修改apk
- apk的后缀改完zip后,打开得到class.dex;
- 使用baksmali,将class.dex换成smali文件, 修改对应smali源码
这个虽然是简单的一句修改源码,但怎么改是个艺术活; - 使用smali,把已修改smali文件转换成为dex文件的;
- 修改完的class.dex重新添加到替换原apk的class.dex;
3.3 安装apk
-
核心破坏
由于篡改了apk的文件,正常按照时会报错,我们需要把android校验的相关代码去掉。
目前使用幸运修改器修改,当然也可以通过自己修改源码实现。 -
替换apk
在有root权限的情况下,将修改好的dex和apk,替换 system/priv-app以及 data/dalvik-cache,重启即可。
3.4 结语
上述方案的简单的可以总结为:先对ROM进行核心破坏,破坏其对apk安装时的签名校验,然后可以尽情的篡改安装系统apk。
以上方案在HM NOTE 1TEL(MIUI9.2、Android4.4.4)测试生效,是在手机获取root权限后,进行篡改操作。其实也可以直接修改rom包。
3.5 实用资料
- Android安全讲座第八层[二] 替换已经安装后的应用的dex文件
- [原创]安天移动安全:Janus高危漏洞深度分析
- apk解包+修改源码+重新打包
- APK反编译
- MIUI ROM修改教程Ⅰ【破解安卓核心,通杀所有签名应用】
4 普通应用修改为系统应用
4.1 步骤
- Apk安装正常 ;
- 将apk文件移动到system/app目录;
- 对应so的文件移动到system/lib目录;
- 重启手机;
4.2 坑
由于需要吧so文件都移动到system/lib,所以如果你的应用里的so如果与系统的重名,那么就需要修改自己app的so名称。
4.3 实用资料
5 普通应用绕权限检验
碎碎念
实现这个功能,最先想到的是修改源码AppOpsServie的checkOp方法,不过经过调试,发现apk校验权限时,并不会走这个方法(android 4.4)。
然而,在将应用转成系统应用后,应用自动获取该有的权限,完美!
不过其它版本的需要额外预研!