Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

不久前接到公司新的任务,要求破解小米的一款系统内置软件,名字是“小米账号”,使用小米手机的小伙伴应该很熟悉了,在设置目录下的账号那里,主要使用它进行小米账号的登录操作。既然是破解,那么首先第一步还是要拿到他的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顺风顺水,再搞小米这种硬件厂商的时候,结果却出现了问题,查看官方资料才明白还有制造商框架这一说。所以在学习的过程中,不要以为掌握了一小步你就掌握了全部,而事实上你可能只掌握了冰山一角!

本片博文到此结束,如有引用请注明出处,谢谢合作!有不明白的地方请评论留言,我看到后会及时回复!

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: Android apktool是一款广泛使用的工具,用于编译Android应用程序包(APK)。APK是一种Android应用程序的打包格式,包含了应用的所有代码、资源和配置信息。而编译则是指将APK文件还原成可读性较高且易于理解的源代码形式。 使用apktool进行APK编译时,首先需要将APK文件传递给apktool工具。工具会根据APK文件的结构,解析并提取其中的所有文件和资源。然后,apktool会自动将其中的DEX文件(Dalvik Executable文件,包含了Java源代码经过编译后的字节码)转换为Java源码。此时,开发者可以通过查看编译后的Java源码来了解应用的工作原理和实现细节。 同时,apktool还会还原APK中的XML文件,包括清单文件、布局文件以及其他配置文件。这些XML文件记录了应用的各种配置信息,如权限、活动(Activity)、服务(Service)等。编译后的XML文件可以帮助开发者了解应用的结构和设计。 尽管apktool编译功能可以帮助开发者深入了解和分析应用,但需要注意的是,由于编译是将编译后的字节码转化为源代码,所以编译后的代码可能会存在格式混乱、变量命名不一致等问题。因此,编译的源码仅供参考和学习使用,不能完全复原原始代码。 总而言之,android apktool是一款强大的工具,通过它可以帮助开发者编译APK文件,提取其中的代码和资源,从而更好地分析应用和进行代码审查。 ### 回答2: Android apktool是一种常用的工具,用于编译APK文件。编译APK可以帮助开发者分析和修改应用程序,并研究其他应用程序的功能和实现原理。 通过使用apktool工具,可以将APK文件解压成源码和资源文件。这样,开发者可以查看应用程序的源代码,理解其逻辑和结构,并根据需要进行修改。apktool还可以还原资源文件,比如图片、音频和布局文件,以供进一步分析和修改。 使用apktool编译APK文件并不复杂。首先,需要在电脑上安装Java开发环境,然后下载并配置好apktool工具的环境变量。接下来,在命令行中运行apktool命令,指定要编译的APK文件路径。编译完成后,可以在指定的输出目录中找到编译的源码和资源文件。 然而,需要注意的是,编译APK只能得到大致的源码和资源文件,并不完全等同于开发者的原始代码。因为在编译APK之前,原始代码会经过一系列的编译和混淆过程,这些过程会对源码进行处理,使得编译后的代码可读性较差。此外,编译APK可能存在法律和道德问题,因此应该遵守相关法律规定,并尊重开发者的劳动成果。 综上所述,Android apktool是一种有用的工具,可以帮助开发者编译APK文件,分析和修改应用程序。合法合规地使用该工具,可以加深对Android应用程序的理解,并提升开发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值