文章目录

最近在对Dex文件在内存中解密后压缩成zip文件写到本地供DVM加载时出现了Zip: EOCD not found, *.dex is not zip异常,折腾了好几个小时,终于解决了。

按照DVM的错误提示找到了系统源码出错的地方,在dalvik/libdex/ZipArchive.cpp文件mapCentralDirectory0(int fd, const char* debugFileName, ZipArchive* pArchive, off_t fileLength, size_t readAmount, u1* scanBuf)函数中。在解析ZIP文件时,因为缺少 EOCD(End Of Central Directory)段的内容,即没有找到50 4b 05 06这样的魔数内容,导致entry数量和目录大小及偏移地址等重要数据不能解析,所以DVM提示解析失败,这个段内容是在ZIP文件的末尾部分,所以只需要补上去就OK。对照自己使用ZIP mini写的压缩出来的文件,发现没有EOCD段,但是使用RAR解压却没有问题,纠结了好长时间,于是乎到zlib中全局搜索EOCD关键字,在zlib/src/contrib/minizip/zip.c文件中的找到了ENDHEADERMAGIC宏定义,使用是在Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)函数中使用,被zipClose (zipFile file, const char* global_comment)函数调用。原来是自己写的压缩代码中没有调用zipClose函数,补上就OK了。

在google上搜索发现很多人也出现类似的问题,很大一部分原因是apk文件被破坏,极有可能是文件在传输过程中没有传输完整,比如USB传输中断,网络传输中断导致文件 EOCD段缺失(因为这部分内容在文件的末尾)。也发现网上的有些代码中有坑,需谨慎使用,谨记。

文章目录