需要用到的工具
aapt
ShakaApktool或apktool
Hex编辑器
文本编辑器
作者:越狱(pwelyn)
样本就不提供了,自己随便找个apk联手吧
感谢@随意 提供样本,本人比较菜,高手请忽略我在说什么,我只是把我的方法分享一下。
0x1 前奏
由于resources.arsc被重新hex来使ShakaApktool或apktool直接异常退出,我猜想的是利用apktool代码的bug来实现这个原理,其实aapt可以正常dump,下面就介绍一下如何实现,然后如何解决。
0x2 发现问题
先看看经过hex之后resources.arsc的apk文件反编译情况
apktool报错信息
[JavaScript] 纯文本查看 复制代码 I: Loading resource table...
Exception in thread "main" java.lang.NullPointerException
at brut.androlib.res.data.value.ResValueFactory.factory(ResValueFactory.java:70)
at brut.androlib.res.decoder.ARSCDecoder.readValue(ARSCDecoder.java:259)
at brut.androlib.res.decoder.ARSCDecoder.readEntry(ARSCDecoder.java:203)
at brut.androlib.res.decoder.ARSCDecoder.readConfig(ARSCDecoder.java:191)
at brut.androlib.res.decoder.ARSCDecoder.readType(ARSCDecoder.java:159)
at brut.androlib.res.decoder.ARSCDecoder.readPackage(ARSCDecoder.java:116)
at brut.androlib.res.decoder.ARSCDecoder.readTable(ARSCDecoder.java:78)
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:47)
at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:538)
at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:63)
at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:55)
at brut.androlib.Androlib.getResTable(Androlib.java:64)
at brut.androlib.ApkDecoder.setTargetSdkVersion(ApkDecoder.java:209)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:92)
at brut.apktool.Main.cmdDecode(Main.java:165)
at brut.apktool.Main.main(Main.java:81)
ShakaApktool报错信息
[JavaScript] 纯文本查看 复制代码 I: 常规资源列表...
I: 反编译资源文件...
I: 反编译 values */* XMLs...
Exception in thread "main" java.lang.NullPointerException
at b.a.d.d.b.c(Unknown Source)
at b.a.d.a.a.v.h(Unknown Source)
at b.a.d.a.a.u.a(Unknown Source)
at b.a.d.a.a(Unknown Source)
at b.a.d.a.c(Unknown Source)
at b.a.a.b(Unknown Source)
at b.a.E.a(Unknown Source)
at b.b.a.a(Unknown Source)
at b.b.a.a(Unknown Source)
at com.rover12421.shaka.cli.Main.main(Unknown Source)
报错信息都是Exception in thread "main" java.lang.NullPointerException
这个应该很好理解空指针异常,为什么会出现这种情况呢,直接进行ShakaApktool或apktool源码调试来查找问题(怎么调试这里就不说了)
通过调试可以发现string反编译到最后直接就抛出了异常,那么知道具体问题出在哪里,那么我们就接着往下走吧
0x3 问题分析
现在aapt就可以上场了,我用的aapt版本是v0.2-2166767
使用命令(aapt我设了变量,所以我可以直接运行)
aapt l -v -a test.apk > log
//将信息打印到log文件,l命令是干嘛用的,自己去学习aapt命令吧,这里不做说明
打开log文件,开头显示如下图:
信息量比较大这里就不全部截图了,然后我们搜索string,然后直接定位到最后一个string位置,因为前面调试的时候,是在最后才抛出异常的。
然后截图多几行有个对比
resource 0x05040219这个就是资源id,d=0x05860586 这个就是罪魁祸首让反编译抛出异常的地方,为什么这么说如果研究过arsc文件就知道了,或者我们直接对比上面几行代码也可以发现,为什么其他都是0x0000而这个却不是
0x4 文件修改
下面直接召唤出hex编辑器(我使用UltraEdit,你们随意按照自己习惯)
用压缩工具打开apk把resources.arsc提取出来,用hex工具打开resources.arsc
直接搜索86 05 86 05(为什么这样,因为十六进制搜索需要反过来,所以不是05860586而是86058605)
直接定位到了,然后直接修改86058605为86050000,改完之后保存,然后替换到apk里面进行测试。
看最后反编译结果:
0x5 功能实现
说了怎么去除这个,那么自己怎么实现这个功能呢,方法一样按照0x3 问题分析步骤来,你想hex哪个string字段,自己决定,我只是提供一下方法
resource 0x05040219 com.test:string/test_name: t=0x03 d=0x00000586 (s=0x0008 r=0x00) (PUBLIC)
有的d参数可能全部是0x00000000,那么这时候就要结合t和s参数后面的值来进行搜索了,如何搜索,搜索到怎么修改就参考上面说的方法吧,最后祝大伙折腾愉快,ShakaApktool应该会很快修复这个bug了
Apktool|ShakaApktool 简体中文汉化版|APK反编译工具(更新)
http://www.52pojie.cn/thread-347591-1-1.html
|