1、解包代码
package cn.l2u.tools.unweapp;
public class WxapkgItem {
private String name;
private int start;
private int length;
public WxapkgItem(String name, int start, int length) {
this.name = name;
this.start = start;
this.length = length;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
@Override
public String toString() {
return "WxapkgItem{" +
"name='" + name + '\'' +
", start=" + start +
", length=" + length +
'}';
}
}
package cn.l2u.tools.unweapp; import java.io.*; import java.util.ArrayList; public class Unweapp { public static void main(String[] args) throws IOException { if (args.length == 0) { System.out.println("用法:\nunweapp 输入文件 [输出文件夹]"); } else { File in = new File(args[0]); File outDir = args.length == 2 ? outDir = new File(args[1]) : new File(in.getAbsolutePath()+"_unpacked"); run(in, outDir); } } private static void run(File in, File outDir) throws IOException { RandomAccessFile r = new RandomAccessFile(in, "r"); try { if (r.readByte() != (byte) 0xBE) { throw new RuntimeException("文件类型错误"); } r.seek(0xE);//前面几个字节不知道含义,估计是校验码之类的;不影响解包 int fileCount = r.readInt();//文件数量 ArrayList<WxapkgItem> wxapkgItems = new ArrayList<WxapkgItem>(fileCount); for (int i = 0; i < fileCount; i++) { int nameLen = r.readInt();//文件名长度 byte[] buf = new byte[nameLen]; r.read(buf, 0, nameLen);//文件名 String name = new String(buf, 0, nameLen); int start = r.readInt();//文件内容起始位置 int length = r.readInt();//文件内容长度 wxapkgItems.add(new WxapkgItem(name, start, length)); } for (WxapkgItem wxapkgItem : wxapkgItems) { File outFile = new File(outDir, wxapkgItem.getName()); System.out.println(wxapkgItem); r.seek(wxapkgItem.getStart()); byte[] buf = new byte[wxapkgItem.getLength()]; r.read(buf, 0, wxapkgItem.getLength()); write(outFile,buf); } } finally { r.close(); } System.out.println("ok"); } private static void write(File outFile,byte[] buf) throws IOException { if (!outFile.getParentFile().exists() && !outFile.getParentFile().mkdirs()) { throw new RuntimeException("无法创建文件夹:" + outFile.getParentFile().getAbsolutePath()); } FileOutputStream out = new FileOutputStream(outFile); try{ out.write(buf); }finally { out.close(); } } }
源码地址:https://github.com/moqi2011/unweapp
相关文档: