不久前接到公司新的任务,要求破解小米的一款系统内置软件,名字是“小米账号”,使用小米手机的小伙伴应该很熟悉了,在设置目录下的账号那里,主要使用它进行小米账号的登录操作。既然是破解,那么首先第一步还是要拿到他的Smali代码,于是博主使用Apktool去反编译它的Apk文件,文件名为:XiaomiAccount.apk。
首先来到Apk文件所在的目录下,打开命令提示符输入命令:apktool d XiaomiAccount.apk,回车键执行命令。这下操作大家都已经熟悉就不细说了,博主本以为正常情况下很快就能拿到Smali代码,结果没想到的是出现了不正常的情况,apktool竟然反编译失败,错误信息如下:
W: Could not decode attr value, using undecoded value instead: ns=android, name=theme, value=0x100d0051
W: Could not decode attr value, using undecoded value instead: ns=android, name=theme, value=0x100d0051
W: Could not decode attr value, using undecoded value instead: ns=android, name=theme, value=0x100d0051
W: Could not decode attr value, using undecoded value instead: ns=android, name=theme, value=0x100d0051
W: Could not decode attr value, using undecoded value instead: ns=android, name=theme, value=0x100d0074
I: Regular manifest package...
I: Decoding file-resources...
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0x10070001
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0057
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0072
I: Decoding values */* XMLs...
Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
出现了一大串的Could not ........,心里有点发慌,赶忙去看看有没有生成一个XiaomiAccount文件夹,发现存在:
看上去有惊无险,还好还好,点进去一看顿时就坐不住了:
卧槽Smali文件夹内??反编译后的Smali代码跑哪去了?只有一个res资源文件夹啊!
这个是博主以前没有遇见过的情况,或者说以前博主没有反编译过系统应用所以没有碰见过。然后就开始网上搜找,搞了一大堆懵圈终于才把这个问题搞定。首先这个问题错误提示很明显了,注意最后一句错误提示:
Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
这句错误是关键,翻译一下就是: 无法找到id: 16包的框架资源。您必须安装适当的框架文件,更多信息请参见项目网站。重点:没有找到id为16的框架资源包!这下弄不懂了,id为16的框架资源包是什么鬼??别急,人家都说了,更多的信息请参考项目网站,这里的项目网站指的就是Apktool官网。既然如此,那我们还真的要去官网瞅瞅到底怎么回事,附带Apktool官网地址:Apktool官网
进入官网后向下滑动,找到Framework 模块,如图所示:
在这里就是针对框架文件的一个比较详细的解释,我们看Framework File下的两段信息就会恍然大悟了:翻译一下就是:
您可能知道,Android应用程序使用的代码和资源是在Android操作系统本身上找到的。这些被称为框架资源,Apktool依赖这些资源来正确地解码和构建apk。
每个Apktool版本在内部都包含了发布时最新的AOSP框架。这使您能够毫无问题地解码和构建大多数apk。然而,除了常规的AOSP之外,制造商还添加了自己的框架文件。要针对这些制造商apks使用apktool,必须首先安装制造商框架文件。
好了这下我们就明白了,Apktool其实在内部已经包含了常规的AOSP框架文件,所以在使用Apktool对大多数普通的Apk文件进行反编译的时候是没问题的,但是有特殊的情况就是,某些制造商还添加了自己的框架文件,那么在使用Apktool对这部分制造商的Apk文件时,就必须安装制造商的框架文件!小米就是添加了自己的框架文件,所以我们在对小米的Apk文件进行反编译的时候,就需要安装小米的框架文件,很显然,id为16的框架资源包指的就是小米自己的框架文件!真相大白~
在官方的说明中很明确,使用命令:apktool if XXX.apk 或者apktool install-framework XXX.apk 对制造商的框架文件进行安装。在下面还有一个详尽的示例:拿HTC来做的代码示例,大家看看学习一下就好。接下来解决这个问题就很简单了,既然需要安装小米的框架文件,那就安装呗,首先就是需要拿到小米的框架文件!去哪里拿?很明显就是在小米手机的系统目录里面啦~
首先需要明确一点的是,我们需要三个小米的框架文件,名字分别是:framework-res.apk,framework-ext-res.apk,miui.apk。其中,framework-res.apk框架文件位于系统目录:/system/framework/,framework-ext-res.apk框架文件位于系统目录:/system/framework/framework-ext-res/,miui.apk框架文件位于系统目录:/system/app/miui/。我们需要拿到这三个文件,最好的办法就是通过RE文件管理器,先把这三个文件复制到手机的SD卡内,然后在电脑上直接再复制到我们的操作目录下即可。这里博主把这三个框架文件放入了电脑内的D:/AndroidDecompiling文件夹下,AndroidDecompiling文件夹是自己创建的文件夹,如图所示:
然后打开命令提示符,cd进入到该目录下,首先执行第一个安装命令,安装framework-res.apk文件,命令:apktool if framework-res.apk,执行完毕如图所示:
看最后一句的信息,意思为框架被安装的路径为:C:\Users\王将\AppData\Local\Temp\1.apk,这个1.apk就表示为已经安装成功的framework-res.apk框架。
接着依次安装下面的两个框架文件:framework-ext-res.apk和miui.apk,命令分别为:apktool if framework-ext-res.apk ,apktool if miui.apk,如图所示:
从安装信息上我们可以很清楚的看到,framework-ext-res.apk框架安装成功后为17.apk,miui.apk框架文件安装成功后为16.apk,想一下我们反编译的错误信息,就缺少的框架就是这个16.apk啊!
接下来我们还需要进行一个操作,我们需要为这个三个apk文件换一下路径,认真的小伙伴可能已经发现了,这三个安装完成的框架路径都在 C:\Users\王将\AppData\Local\Temp\,这个路径其实是很不稳定的,属于系统的临时文件存放地,所以为了以后不必要的问题和麻烦,我们需要给它转移到路径:C:\Users\王将\AppData\Local\apktool\framework文件夹下,这个地方都是存放apktool框架的地方。你可能会问,那为什么在安装的时候就不把框架安装到正确的路径下呢?非要安装到系统临时文件夹下,这个其实是一个问题,细心的小伙伴可能发现了一处报错:
WARNING: Could not write to (C:\Users\王将\AppData\Local\apktool\framework), using C:\Users\王将\AppData\Local\Temp\ instead...
意思是AppData\Local\apktool\framework文件夹无法写入,所以才转而写入了AppData\Local\Temp\临时文件夹下。首先apktool会默认把一些框架资源包安装到AppData\Local\apktool\framework目录下,但有时候限于系统文件权限无法写入,那么就会退而其次安装在临时文件夹内,那么这时候就需要你动动手挪一下框架的位置,不挪也没关系,但是为了避免日后可能出现的问题,建议你还是手动挪一下!不想这么麻烦的小伙伴也没关系,那就需要修改安装命令,apktool 的时候加上 -p 参数 指定框架资源的路径,这样也就避免了apktool 使用默认路径~
那么我们打开”此电脑“,点击进入到C盘的\Users\王将\AppData\Local\,右键点击新建文件夹,重命名为:”apktool“,如图所示:
点进入继续新建一个文件夹,重命名为:”framework“ ,然后把AppData\Local\Temp\临时文件夹下的安装生成的三个框架文件1.apk,17.apk,16.apk复制粘贴过来,最终如图所示:
这样就大功告成了,然后很自然的来到待反编译的Apk文件XiaomiAccount.apk所在目录下,执行反编译命令:apktool d XioamiAccount.apk,反编译成功如图所示:
在D:\AndroidDecompiling文件夹下生成一个XiaomiAccount文件夹:
点进去看看:
成功拿到了Smali代码!
好了至此我们反编译系统应用出现错误圆满解决!很多人在学习apktool其实忽略了很多部分,就比如博主,以前搞的都是软件开发商的软件,所以一直用apktool顺风顺水,再搞小米这种硬件厂商的时候,结果却出现了问题,查看官方资料才明白还有制造商框架这一说。所以在学习的过程中,不要以为掌握了一小步你就掌握了全部,而事实上你可能只掌握了冰山一角!
本片博文到此结束,如有引用请注明出处,谢谢合作!有不明白的地方请评论留言,我看到后会及时回复!