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; import java.util.Random; 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;i0) { 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(); } } public static void unpackCSRFS(File firmware, File outfolder) { try (RandomAccessFile f = new RandomAccessFile(firmware,"r")) { int filler = -1; byte[] fillershort = new byte[]{(byte)0xff,(byte)0xff}; RandomAccessFile boobs = new RandomAccessFile(new File(outfolder,"debug.dat"),"rw"); byte[] javaisDipshit = new byte[4]; byte[] javaShorty = new byte[2]; int magic = f.readInt(); //ignored f.read(javaisDipshit); boobs.write(filler); int sizeFile = Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]); //old shit calculates in words and not in bytes on sizes if((sizeFile*2)>f.length()) { System.out.println(sizeFile); System.err.println("ZOINKS!!!, mismatch"); return; } byte[] background = new byte[(int)f.length()]; for(int i=0;i>"+sizeAndFlags); System.out.println("SZExtr>>"+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[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]); f.read(javaisDipshit); fmd.length=Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]); files[i]=fmd; boobs.write(fakeFileRecord); } for(int i=0;i0) { f.seek(fmd.offset*2); int readme = f.read(filecontent); RandomAccessFile out = new RandomAccessFile(outfolder+fmd.parentpath+fmd.filename,"rw"); out.write(filecontent); if(readme