分享

中兴B860A无法安装第三方应用的解决办法

 RAiNSAiL 2016-07-27

绝大多数的文件管理器,以及部分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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多