apk反编译后回编失败--java.io.IOException: error=7, Argument list too long

前不久做逆向工程(可不是去破解人家应用哟,安卓聚合渠道的拆包业务),回编代码的时候失败了。即便是拿原包反编译,什么都不做,也是回编失败,以至于我差点出现心里阴影。还以为现在apk加固这么牛逼,可以让你反编译后无法回编~~囧
当然,经过排查,还是能找到问题所在的:
Caused by: java.io.IOException: Cannot run program "/var/folders/bx/_02z7lgs15scqv23wyrgf8q40000gn/T/brut_util_Jar_1195159888365150093.tmp": error=7, Argument list too long
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at brut.util.OS.exec(OS.java:90)
    ... 6 more
Caused by: java.io.IOException: error=7, Argument list too long
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 7 more

如果来看到这个问题的朋友,那么恭喜你,有救了。这个问题的原因是apktool中,去调用aapt的时候,写的参数太多了。下面直接说处理方案,毕竟能进来看,估计是遇到同样问题了。

  • 方案一:删改文件
    找到被反编译的文件目录,里面有个apktool.yml,这个是反编译的时候,对apk的一些配置信息,主要是回编的时候用到它。打开里面看到doNotCompress这一层,你会看到里面有n条记录,如下:
    apk反编译后回编失败--java.io.IOException: error=7, Argument list too long_第1张图片
    就是红框里的值,会在调用aapt的时候,每一条都会作为一个”-0”参数写入,如果多大的话,参数过长也就理所当然了。然后简单粗暴的方案,就是把红框里的值都删了吧,注意,只能删assets目录或者raw目录下的映射记录,因为aapt默认是对这些目录下的文件采取不压缩的形式,如果是非assets下的文件,那只估计只能老老实实给这些资源改拓展名了。apktool源码里的初衷是反编译的时候把一些未知的资源作为不编译资源记录下来的,然后assets下的资源也是不编译。但是应该没想到会出现大量的不编译资源,导致参数爆炸,此处不往下考究。

  • 方案二:修改apktool工具
    这个,也是我目前采用的方式,针对性的更改一下apktool工具,让他能够满足普通apk的逆向工作,也能兼容下这种变态的apk包体。至于具体实现方案,我后续会在另一篇博客中做详细说明。

你可能感兴趣的:(apk反编译后回编失败--java.io.IOException: error=7, Argument list too long)