返回
文件结尾恶意修改的zip格式错误1及其解决办法
Android
2023-11-10 11:57:38
众所周知,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文件损坏导致的。