发布时间 : 星期一 文章做自己的Android ROM-屏蔽apk签名检查更新完毕开始阅读
做自己的Android ROM,屏蔽对framework中的系统
APK的签名检查
作者:孤风一剑 发布:2013-09-04 15:14 栏目:移动开发 点击:538次 抢沙发
最近两天一直在尝试更新Android中的关键库以达到定制ROM的效果,中间比较曲折,记录下来供自己和大家参考。
因为我需要基于Android的原生代码做一定的修改,所以如果无法将我自己编译出的APK或Jar替换系统中的东西,则无法达成我的目标。
我的测试的机器:htc one 电信定制版(802d),Android版本:4.2.2;LG Nexus 4,Android版本:4.3。 测试第一步:
将手机root掉,以替换修改系统文件的权限。不同厂商的手机的root步骤不一样,自己上网搜索吧。 测试第二步:
使用我自己编译出来的SystemUI.apk,替换Nexus 4的SystemUI.apk,通过 adb logcat > 1.txt 查看日志,直接报下面的错; [plain][/plain] view plaincopyprint?
1. W/PackageManager( 530): Signature mismatch for shared user : SharedUserSetting{41ea
0bc8 android.uid.system/1000}
2.
3. E/PackageManager( 530): Package com.android.systemui has no signatures that match th
ose in shared user android.uid.system; ignoring!
签名有问题,根据这个关键字“has no signatures that match those” 去搜索Android源代码,可以在PackageManagerService.java中找到如下函数: [java][/java] view plaincopyprint?
1. 2. 3. 4.
private boolean verifySignaturesLP(PackageSetting pkgSetting, PackageParser.Package pkg) {
if (pkgSetting.signatures.mSignatures != null) {
// Already existing package. Make sure signatures match
5. 6. 7. 8. 9.
if (compareSignatures(pkgSetting.signatures.mSignatures, pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) { Slog.e(TAG, \
+ \ mLastScanError = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
10. return false; 11. } 12. }
13. // Check for shared user signatures
14. if (pkgSetting.sharedUser != null && pkgSetting.sharedUser.signatures.mSignatures !=
null) {
15. if (compareSignatures(pkgSetting.sharedUser.signatures.mSignatures, 16. pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) { 17. Slog.e(TAG, \
18. + \19. + pkgSetting.sharedUser.name + \
20. mLastScanError = PackageManager.INSTALL_FAILED_SHARED_USER_INC
OMPATIBLE;
21. return false; 22. } 23. }
24. return true; 25. }
直接替换,肯定是不行了,签名通不过,那我可否尝试将签名检查的代码给屏蔽掉?
测试第三步:
尝试屏蔽对系统级APK的签名检查,代码已经找到,在这个目录下:frameworks/base/services/java/com/android/server/pm。
进一步分析,services目录下的内容,最终会被编译成 services.jar,adb shell 后,在 /system/framework 下可以找到 services.jar。 [plain][/plain] view plaincopyprint?
1. root@android:/system/framework # ls servi* 2. ls servi* 3. services.jar
在 out/target/product/generic/dex_bootjars/system/framework 这个目录下可以找到 services.jar,
直接使用自己编译出来的services.jar去替换 /system/framework下的同名jar包,重启os后,好像报的这个错误:DexOpt: mismatch dep signature, 然后os一直处于死循环中,无法开机成功。
根据“DexOpt: mismatch dep signature”这个关键字搜索,在DexPrepare.cpp中有对应的检查:
[cpp][/cpp] view plaincopyprint?
1. 2. 3. 4.
if (memcmp(signature, ptr, kSHA1DigestLen) != 0) {
LOGI(\ goto bail; }
测试第四步:
既然第三步也不行,那我用自己编译出来的“libdvm.so” 将/system/lib下的同名文件更新掉,重启os后,还是类似的错误,签名摘要校验不过。
当前陷入了短时间的僵局,上网找了很多资料参考,大部分仅能参考,写得太不详细,直接我遇到了这个文档:《MIUI ROM定制教程》,
已经在我的百度网盘共
享: http://pan.http://www.china-audit.com//share/link?shareid=198381908&uk=4145338314
神一般的文档,将Android的系统框架,到刷机原理,再到一些刷机的具体细节,都写得非常清楚。
下面的过程是基于HTC ONE(802d)来测试的:
1、先找一个可刷机的ROM,我找到的是
Nic_One_M7_802d_4.2.2_Devil_3.5_signed.zip,这个包可以刷机成功并且系统可用。
之前找的两个包可以刷机成功,但屏幕驱动似乎有问题,触屏无反应。 2、将原有包中的services.jar转成smali文件,通过 baksmali-1.4.2.jar 进行将 jar中的dex文件转成smali文件,将PackageManagerService.smali中的verifySignaturesLP函数的实 现给修改掉,然后再使用smali-1.4.2.jar将反编译出的包含smali文件的目录转成dex文件,使用winrar打开 services.jar,将新生成
的classes.dex覆盖jar包中的classes.dex,将这个新jar包替换原ROM zip包中的同名文件。
再使用“土豆ROM工具箱” 将新ROM zip包重新签名下,再进行刷机。 经过几分钟的等待后,系统可用,并且使用我自己编译出的 SystemUI.apk 直接覆盖 /system/framework/ 下的同名文件,也不会再报签名错误,只是无法正常运行。
为了进一步验证,我将系统的 SystemUI.apk 复制我的电脑上,使用“土豆ROM工具箱”将其重新签名,然后再替换原生 SystemUI.apk,HTC手机也是可以正常运行的。
终于成功将系统APK签名验证这步给屏蔽了,这样我就可以基于此ROM做很多其它想做的事件了。
smali-1.4.2.jar、baksmali-1.4.2.jar的使用命令参考: [plain][/plain] view plaincopyprint?
1. C:\\Users\\zhao3546\\Desktop\\Android\\Android_framework_4.2>java -jar smali-1.4.2.jar -h
2. usage: java -jar smali.jar [options] [--] [
4. -?,--help prints the help message then exits. Specify 5. twice for debug options
6. -a,--api-level
9. -o,--output
11. -v,--version prints the version then exits
12. -x,--allow-odex-instructions allow odex instructions to be compiled into the 13. dex file. Only a few instructions are supported 14. - the ones that can exist in a dead code path 15. and not cause dalvik to reject the class 16. 17.
18. C:\\Users\\zhao3546\\Desktop\\Android\\Android_framework_4.2>java -jar baksmali-1.4.2.j
ar -h
19. usage: java -jar baksmali.jar [options]
21. -?,--help prints the help message then exits.