首先这篇文章是具体参考【原创】**应用加固的脱壳分析和修复,上文作者在今年2月12号发了一篇文章详细分析了整个过程,由于腾讯加固的技术也不断演进,所以我在上文的基础,分析现在7月份腾讯加固采用的新方法。与上文重复的部分就不再过多说明,所以阅读本文之前,要首先看懂上文的大致思路。

1.反编译apk

首先,看一下原apk和加固后的文件变化情况,主要是修改了AndroidManifest.xml和classes.dex,以及新增了libmain.so和libshell.so两个文件。
然后下载最新的Apktool的源码进行编译,得到apktool-cli.jar这个文件。然后直接进行反编译,如无意外的出错了。因为腾讯加固就是利用一些Apktool的bug来阻止反编译,但是又不影响安卓程序的加载。

第一个错误,是腾讯加固时添加了两个同名的ID,attr/fasten,导致反编译时出错。由于这些ID是腾讯加固添加进去的,对于程序没有影响,所以我在Apktool的做法是直接忽略这种同名的ID。其实这个问题是Apktool的bug导致的,我这种忽略的方法是治标不治本,如果这些ID在程序中是有用的就不能这样做了。

Exception in thread "main" brut.androlib.AndrolibException: Multiple res specs: attr/fasten
	at brut.androlib.res.data.ResType.addResSpec(ResType.java:70)
	at brut.androlib.res.decoder.ARSCDecoder.readEntry(ARSCDecoder.java:221)
	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)
更多