Fwd: android权限

419 views
Skip to first unread message

Kerr Yuandan

unread,
Nov 22, 2011, 8:26:48 PM11/22/11
to keyu...@googlegroups.com
树丰,您好!
今天我仔细跟踪了一下代码,对你的问题做个答复。你的来信中有两个问题:
第一个,修改packages.xml后,不起效果。原因是,PmS在系统启动后已经保存了每个安装包的uid或者shareduid,所以,当你修改packages.xml后不会修改PmS中已经创建的内部变量,所以,不起效果。

第二个,当你修改packages.xml后重启系统,似乎该文件又恢复了原样,因为在PmS启动后会重新加载安装包的信息,并用新的信息覆盖掉原有的pacages.xml,这就是它似乎复原的原因,你可以使用adb shell到/data/system中,ls -l查看packages.xml的修改时间,这个时间总是等于系统的启动时间。

另外,在/data/system目录下有两个文件,一个是packages.xml,另一个是packages.list,当你只修改前者时,由于PmS加载时会对比packages.list中包的uid值,当不一致时,就会使用list中保存的包名重新读取安装包,比如,list中的内容如下:
com.haiii.android.client 10046 1 /data/data/com.haiii.android.client
对应的xml中的被修改后的内容如下:
<package name="com.haiii.android.client" codePath="/data/app/com.haiii.android.client-1.apk" nativeLibraryPath="/data/data/com.haiii.android.client/lib" flags="1" ft="133c00b9768" it="133c00b9768" ut="133c00b9768" version="1" sharedUserId="1000">
<sigs count="1">
<cert index="0" />
</sigs>
<perms>
由于两者的uid和sharedUsedId不一致,所以PmS会重新读取安装包的信息。

而如果同时修改list中的内容又会导致新的问题,比如,将list中的uid修改为1000,PmS会认为重复定义uid,因此,会在/data/system/uiderrors.txt中记录出错信息,如下:
11-11-20 上午8:42: Adding duplicate shared id: 1000 name=com.haiii.android.client
11-11-20 上午8:42: Failure adding uid 1000 while parsing settings at line -1, column -1

而如果在list中删除com.haiii.android.client的包信息,则PmS会认为移除了该安装包,因此就是先删除该包对应的数据目录,并重新扫描/data/app目录,这就又重新创建了该安装包的信息,对应在/data/system/uiderrors.txt的log信息如下:
11-11-20 上午8:48: System package com.haiii.android.client no longer exists; wiping its data

因此,在目前的机制下,似乎还不能通过简单修改packages.xml和packages.list达到给应用程序增加系统权限的目的。关于PmS的启动过程可以参考本书p448页,并结合源码再寻找适合你所需应用环境的解决方法。

我已经将书中的那一句话删除了。

元旦

---------- Forwarded message ----------
From: 谢树丰 <xieshu...@163.com>
Date: 2011/10/27
Subject: android权限
To: 柯元旦 <yuan...@gmail.com>


元旦,您好:
    这段时间一直在阅读您编写的《android内核剖析》,其中很多的内容对我工作的开展益处良多,非常感谢。
    在阅读16章程序包管理(Package Manager Service)的时候,其中您举出一点观点:修改packages.xml中的cert子标签值,可以改变应用程序的签名,从而使得应用程序具备系统程序的能力。
   
然后我尝试编写了一个修改系统时间的程序,
1.在AndroidManifest.xml中没有申明android:sharedUserId="android.uid.phone"和android:process="com.android.phone"两个属性,否则会安装失败;
2.安装成功后,我尝试修改packages.xml文件中的
<package name="com.data.share" codePath="/data/app/com.data.share.apk" system="false" ts="1319613980000" version="1" userId="10042">
<sigs count="1">
<cert index="10" key="308201e03082014902044b3c6ed0300d06092a864886f70d01010405003037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f6964204465627567301e170d3039313233313039323834385a170d3130313233313039323834385a3037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f696420446562756730819f300d06092a864886f70d010101050003818d003081890281810088bffcae9e9e36c4ee2d8fb793f2bb32400d4be5a2db63ba6d20b3d326a22fc83fb67fc8b5cd217e656f01664a83fe456f7058b55efe9adb358f3be91071d4460b7114035ae8db0586392a64ddf6f3f06c10ff122ea7f7182805eb8a983625cbfc67e89b02902aadbb7ccd7fb19550b88cab5534452be65ce381cdec56e44c930203010001300d06092a864886f70d01010405000381810026cf616670c577c38e83f2f88ac945f5603fbaef2ead2c51304790ad16ce0fa08582c08dfbf9cbf8fca397b36ec016b2366ef7eaa1679fe01c71a9c96858b05f5818aebcd20f60c2cfde78d188c1f7c0c3043c7dcfaaa45342e57779048668ece440ed8b9405c9f141cf567ac84c175b7edc07e3db0fdc4c6a855e75577ee932" />
</sigs>
<perms>
<item name="android.permission.READ_PHONE_STATE" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
</perms>
</package>
修改为:
<package name="com.data.share" codePath="/data/app/com.data.share.apk" system="false" ts="1319613980000" version="1" sharedUserId="1001">
<sigs count="1">
<cert index="0" />
</sigs>
</package>
3.启动应用程序,但修改系统时间失败;
4.重启手机作尝试,发现packages.xml文件貌似会重新生成,里面的内容被复原了,无法达到预期的效果。

还请您指正我的操作步骤,谢谢。



Reply all
Reply to author
Forward
0 new messages