返回

文件结尾恶意修改的zip格式错误1及其解决办法

Android

众所周知,apk文件其实就是zip格式,如下图所示,apk文件末尾增加了comment(红线标记的范围内是文件尾,后面是comment),正常来说没有问题,但是comment里面还包含了zip文件的内容。这里只处理comment里zip文件的问题。

由此导致读取apk文件末尾时可能会读取到错误的Comment内容。比如使用zip4j读取apk文件时会直接抛出异常。

java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:225)
    at java.util.zip.ZipFile.<init>(ZipFile.java:156)
    at net.lingala.zip4j.core.ZipFile.init(ZipFile.java:84)
    at net.lingala.zip4j.core.ZipFile.<init>(ZipFile.java:58)
    at net.lingala.zip4j.core.ZipFile.<init>(ZipFile.java:38)
    at com.apkfuns.logutils.util.FileUtils.unZip(FileUtils.java:172)
    at com.apkfuns.logutils.util.FileUtils.unZip(FileUtils.java:124)
    at com.apkfuns.logutils.util.FileUtils.unZip(FileUtils.java:101)
    at com.apkfuns.logutils.util.FileUtils.unZip(FileUtils.java:82)

解决办法是将该文件读取后调整流的位置:

int len = inputStream.available();
inputStream.reset();
byte[] content = new byte[len];
inputStream.read(content, 0, len);

或者更简单的方式是直接使用ZipInputStream:

ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry nextEntry = zipInputStream.getNextEntry();
if (nextEntry != null) {
    // do something
}

需要注意的是,如果comment里包含了zip文件,那么读取zip文件时可能会抛出异常。这种情况一般是由于comment里的zip文件损坏导致的。