绝大多数的文件管理器,以及部分XX市场应用都是调用Android系统的PackageInstaller模块来实现应用安装的,这个模块其实是个apk文件,在/system/app目录下可以看到,很多人反映无法方便地安装第三方应用,我估计是中兴对这个应用做了修改,于是做了点反编译分析,下面的内容稍显枯燥,对逆向工程不感兴趣的兄弟可以直接滚屏看帖子末尾的结论J 1、 首先从/system/app目录提取packageinstaller.apk到PC上,放到apkmultitool中进行反编译; 2、 使用UltraEdit打开反编译后的res\values-zh-rCN\strings.xml文件,可以看到下面这两行: 用户您好,本终端暂时已关闭第三方应用的直接安装,请从应用商场安装,谢谢! 用户您好,本终端暂时已关闭第三方应用的直接安装,谢谢! 显然,这是两条让人无比憎恨的提示语,如果能找到什么地方使用了这两条提示语,也许就能通过修改代码来绕过限制了!Let’s Go.. 记下一个提示语前面name标签的内容,即上面标黄的字段,这里我们选installwarning_installfrom_store; 3、 使用UltraEdit打开res\values\public.xml文件,搜索installwarning_installfrom_store这个字符串,很快就有了结果: 记下id字段后的16进制内容即上面标黄的字段,7f05003e 4、 使用UltraEdit在反编译的目录所有文件中搜索7f05003e,得到以下结果 ---------------------------------------- Find'7f05003e' in 'D:\GreenTools\APKMultiTool20\projects\PackageInstaller.apk\res\values\public.xml': D:\GreenTools\APKMultiTool20\projects\PackageInstaller.apk\res\values\public.xml(78): Found'7f05003e' 1 time(s). ---------------------------------------- Find'7f05003e' in'D:\GreenTools\APKMultiTool20\projects\PackageInstaller.apk\smali\com\android\packageinstaller\PackageInstallerActivity.smali': D:\GreenTools\APKMultiTool20\projects\PackageInstaller.apk\smali\com\android\packageinstaller\PackageInstallerActivity.smali(3323): const v7, 0x7f05003e Found'7f05003e' 1 time(s). Searchcomplete, found '7f05003e' 2 time(s). (2 file(s)). 第一个文件就罢了,我们刚才已经分析过,第二个文件明显是调用这个字符串的反编译源代码,果断打开之。 5、 打开smali\com\android\packageinstaller\PackageInstallerActivity.smali文件,滚动到3323行: …… new-instancev6, Landroid/app/AlertDialog$Builder; invoke-direct{v6, p0},Landroid/app/AlertDialog$Builder;->(Landroid/content/Context;)V invoke-virtual{v6, v7},Landroid/app/AlertDialog$Builder;->setTitle(I)Landroid/app/AlertDialog$Builder; move-result-objectv6 constv7, 0x7f05003e invoke-virtual{v6, v7},Landroid/app/AlertDialog$Builder;->setMessage(I)Landroid/app/AlertDialog$Builder; move-result-objectv6 new-instancev7, Lcom/android/packageinstaller/PackageInstallerActivity$13; invoke-direct{v7, p0},Lcom/android/packageinstaller/PackageInstallerActivity$13;->(Lcom/android/packageinstaller/PackageInstallerActivity;)V invoke-virtual{v6, v9, v7},Landroid/app/AlertDialog$Builder;->setPositiveButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder; move-result-objectv6 …… 是不是一个头两个大了?别急,我们有偷懒的办法。 6、 向上滚动,直到看到这么一行: .methodpublic onCreateDialog(ILandroid/os/Bundle;)Landroid/app/Dialog; 也就是说调用这个字符串的代码属于PackageInstallerActivity类的CreateDialog方法。下面我们改用另外一个工具继续…… 7、 使用Winzip或7-zip等解压工具,以压缩包的方式打开packageinstaller.apk文件,从中提取出classes.dex文件,再用dex2jar工具进行反编译,得到jar包。 8、 使用jd-gui工具打开上一步得到的jar包,浏览其中PackageInstallerActivity类的CreateDialog方法: publicDialog onCreateDialog(int paramInt, Bundle paramBundle) { switch (paramInt) { case 6: default: paramBundle = null; } for (;;) { return paramBundle; paramBundle = newAlertDialog.Builder(this).setTitle(2131034137).setMessage(2131034138).setNegativeButton(2131034117,new DialogInterface.OnClickListener() { public void onClick(DialogInterfaceparamAnonymousDialogInterface, int paramAnonymousInt) { Log.i('PackageInstaller','Finishing off activity so that user can navigate to settingsmanually'); PackageInstallerActivity.this.finish(); } }).setPositiveButton(2131034140, newDialogInterface.OnClickListener() …… 虽然比刚才的代码好读了很多,但还是不得要领,但还有别的招…… 9、 我们再看看这个类的其它方法的名字,很快,一个名为isInstallingAllowedZTEnew的方法落入视野,看名字有点可疑??!!果断浏览到这个方法的实现部分,并不长,全贴上来,重要部分留下,其余部分用省略掉: privateint isInstallingAllowedZTEnew() { i = 2; try { String str1 =SystemProperties.get('config.Android.AppInstallCtrl'); if ((str1 != null) &&(!str1.equals(''))) { break label50; } Log.d('PackageInstaller','--> null == AppInstallCtrl'); i = -1; } …… else if (str2.equals('0')) { Log.d('PackageInstaller','--> not allow any way to install'); i = 0; } else if (str2.equals('2')) { Log.d('PackageInstaller','--> only allow install through app store'); i = 1; } else if (str2.equals('3')) { Log.d('PackageInstaller','--> allow in any way to install'); } else if (str2.equals('6')) { …… return i; } 10、 显然,SystemProperties.get('config.Android.AppInstallCtrl')这一行是从系统属性中读取一个配置信息,而这个配置信息似乎就是用来控制应用安装行为的,而后面有一连串类似if (str2.equals('0'))的判断,莫非这个属性值应该可以有0、2、3、6四种取值,拿不准是吧,简单,试试呗。 11、 TTl大法上,然后输入这个命令 Setconfig.Android.AppInstallCtrl 0 将config.Android.AppInstallCtrl设置为0,然后试试用文件管理器安装一个应。很遗憾,失败了! 再试试 Setconfig.Android.AppInstallCtrl 2 也不行,然后是 Setconfig.Android.AppInstallCtrl 3 好心有好报,顺利安装通过。 12、 至此,我们知道将config.Android.AppInstallCtrl这个系统属性值设为3,B860A将可以安装第三方应用,但重启之后,你会发现这个值又被设为0了,也就是说每次启动都要这么设置一下! 好吧,我们在/system/bin/init.zte.post_boot.sh文件末尾加上这么一行: Setconfig.Android.AppInstallCtrl 3 让系统每次启动时自动修改这个属性值,至此,大功告成! 说明:以上实验结果在本人的山东移动版本上验证通过,不保证适用于所有人。如果碰到/system分区无法写入的问题,请搜索本人另外的帖子。欢迎反馈实际操作结果。7 F' Z9 {' @) ]) t0 b: Z |
|