记一次绕过对抗Apktool的姿势

某行应用使用娜迦加固(但不确定保护是不是第三方加固加入的),使用最新的Apktool反编译会报错

Exception in thread "main" brut.androlib.AndrolibException: Could not decode XML
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:147)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decodeManifest(XmlPullStreamDecoder.java:153)
at brut.androlib.res.decoder.ResFileDecoder.decodeManifest(ResFileDecoder.java:144)
at brut.androlib.res.AndrolibResources.decodeManifestWithResources(AndrolibResources.java:210)
at brut.androlib.Androlib.decodeManifestWithResources(Androlib.java:137)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:122)
at brut.apktool.Main.cmdDecode(Main.java:163)
at brut.apktool.Main.main(Main.java:72)
Caused by: java.io.IOException: Invalid chunk type (5132105).
at brut.androlib.res.decoder.AXmlResourceParser.doNext(AXmlResourceParser.java:903)
at brut.androlib.res.decoder.AXmlResourceParser.next(AXmlResourceParser.java:102)
at brut.androlib.res.decoder.AXmlResourceParser.nextToken(AXmlResourceParser.java:112)
at org.xmlpull.v1.wrapper.classic.XmlPullParserDelegate.nextToken(XmlPullParserDelegate.java:105)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:140)
... 7 more

看报错日志怀疑是加入了畸形的chunkType导致的,所以下载Apktool找到报错的代码(AXmlResourceParser.class)

    /*if(chunkType == 5132105)
                continue;*/

            if (chunkType < CHUNK_XML_FIRST || chunkType > CHUNK_XML_LAST) {
                throw new IOException("Invalid chunk type (" + chunkType + ").");
            }

通过加了被注释的代码发现原来的报错虽然不见了,但有了新的错误,感觉并不像我预期想的那样。随后开始分析AndroidManifest.xml与正常的有什么不同,AndroidManifest.xml的结构中8字节header后是stringChunk,如下图所示


Android

在010 Editor中展开看了一下stringChunk的结构


image.png

通过Template很好理解这个结构,在真正字符串之前是每个字符串的偏移(相对偏移),字符串开头有两个字节是保存字符串大小的。但通过与正常AndroidManifest.xml相比在scStringOffset与字符串之间多了四个字节,这四个字节全部都是0(offset 0x3E8处)

删除四个0字节之后就可以正常编译了。。。索然无味

你可能感兴趣的:(记一次绕过对抗Apktool的姿势)