drozer app.package.manifest 有时候完全错误的 bug

平时经常用 drozer dump manifest,感觉稍微有点难用,直到某次批量 dump,发现很多 manifest 连 hash 都一样,发现 drozer 抽风了,本文记录一下。

一、触发方式

在小米手机上,运行 run app.package.manifest com.miui.notes ,发现返回的是 com.xiaomi.micloud.sdk 的 manifest。

当然在其他手机上也有类似的现象,我就不列举了,批量 dump 就会发现的。

二、代码溯源

app.package.manifest 功能本质上是一个 drozer module,它位于 drozer/modules/app/package.py

这个 getAndroidManifest 在 drozer/modules/common/assets.py

加载一个 java 文件,在手机上运行后获取返回的字符串。

 

因此,我们将这个过程移植到手机上,即可进行测试。

三、代码测试

编写如下的 java 代码进行模拟:

打印输出仍然是错误的,说明是openXmlResourceParser 的问题。

跟进一步,发现openXmlResourceParser(String)会调用openXmlResourceParser(0, String),第一个参数零表示 cookie,最终调用到 native 方法。

在AssetManager 里搜cookie 的代码,大致猜测出这个 cookie 表示下标,为零时表示随意选择一个 ApkAsset,而 AssetManager 里有 ApkAssets[] 结构体,很可能是相关的,编写如下代码进行验证。

 

当包名是 com.miui.notes 和 自己时,日志分别为:

 

差别仅在于最后那一项,com.miui.notes 会依赖 RtMiCloudSDK.apk,也就是出错的那一项,而我们的 apk 是没有它的。

将正确的值传递给 openXmlResourceParser ,发现返回是正确的,至此,破案了,是 openXmlResourceParser 发生了非预期的现象。

四、解决方案

由于相关 API 都是 hide 的,写代码不方便,在此我还是建议别用这个工具了,还是用我写的 ShrinkApkAnalyzer 吧。


=============================================================
随着访客的增多,LeadroyaL在本站流量的开支越来越多了,曾经1元能用1个月,现在1元只能用3天。如果觉得本文帮到了你,希望能够为服务器的流量稍微打赏一点,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code