123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package de.nplusc.izc.senabitwiggler;
- import com.google.common.primitives.Ints;
- import com.google.common.primitives.Shorts;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.RandomAccessFile;
- public class FlashFSUnWiggler {
- private static class FileMetadata
- {
- private int offset;
- private boolean is_dir;
- private int length;
- private int offset_fname;
- private String filename;
- private String parentpath;
- }
- public static void unpackFSQCC512x(File firmware, File outfolder)
- {
- try (RandomAccessFile f = new RandomAccessFile(firmware,"r")) {
- byte[] javaisDipshit = new byte[4];
- byte[] javaShorty = new byte[2];
- int magic = f.readInt(); //ignored
- f.read(javaisDipshit);
- int sizeFile = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
- if(sizeFile>f.length())
- {
- System.out.println(sizeFile);
- System.err.println("ZOINKS!!!, mismatch");
- return;
- }
- f.read(javaisDipshit);
- int countFileRecords = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
- FileMetadata[] files = new FileMetadata[countFileRecords];
- for(int i=0;i<countFileRecords;i++)
- {
- FileMetadata fmd = new FileMetadata();
- f.read(javaisDipshit);
- int sizeAndFlags = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
- int size = sizeAndFlags&0x00FFFFFF;
- System.out.println(sizeAndFlags);
- System.out.println(size);
- fmd.offset_fname=size;
- if((sizeAndFlags&0xFF000000)<0)
- {
- System.out.println("dir");
- fmd.is_dir=true;
- }
- f.read(javaisDipshit);
- fmd.offset=Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
- f.read(javaisDipshit);
- fmd.length=Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
- files[i]=fmd;
- }
- for(int i=0;i<countFileRecords;i++)
- {
- FileMetadata fmd = files[i];
- if(fmd.offset_fname==0)
- {
- fmd.filename="";
- fmd.parentpath="";
- }
- else
- {
- f.seek(fmd.offset_fname);
- f.read(javaShorty);
- short fnlength = Shorts.fromBytes(javaShorty[1],javaShorty[0]);
- byte[] fname = new byte[fnlength];
- f.read(fname);
- String s = File.separator+new String(fname);
- fmd.filename=s;
- }
- if(fmd.is_dir)
- {
- new File(outfolder+fmd.parentpath+fmd.filename).mkdirs();
- for(int j= 0;j< fmd.length;j++)
- {
- int subfiles = fmd.offset+j-1;
- files[subfiles].parentpath=fmd.parentpath+fmd.filename;
- }
- }
- else
- {
- System.out.println("Reading:"+fmd.parentpath+fmd.filename+"("+fmd.length+")@"+fmd.offset);
- byte[] filecontent = new byte[fmd.length];
- if(fmd.length>0)
- {
- f.seek(fmd.offset);
- f.read(filecontent);
- RandomAccessFile out = new RandomAccessFile(outfolder+fmd.parentpath+fmd.filename,"rw");
- out.write(filecontent);
- }
- }
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
|