|
@@ -112,10 +112,17 @@ public class FlashFSUnWiggler {
|
|
public static void unpackCSRFS(File firmware, File outfolder)
|
|
public static void unpackCSRFS(File firmware, File outfolder)
|
|
{
|
|
{
|
|
try (RandomAccessFile f = new RandomAccessFile(firmware,"r")) {
|
|
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[] javaisDipshit = new byte[4];
|
|
byte[] javaShorty = new byte[2];
|
|
byte[] javaShorty = new byte[2];
|
|
int magic = f.readInt(); //ignored
|
|
int magic = f.readInt(); //ignored
|
|
|
|
+
|
|
|
|
+
|
|
f.read(javaisDipshit);
|
|
f.read(javaisDipshit);
|
|
|
|
+ boobs.write(filler);
|
|
int sizeFile = Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]);
|
|
int sizeFile = Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]);
|
|
//old shit calculates in words and not in bytes on sizes
|
|
//old shit calculates in words and not in bytes on sizes
|
|
if((sizeFile*2)>f.length())
|
|
if((sizeFile*2)>f.length())
|
|
@@ -125,21 +132,41 @@ public class FlashFSUnWiggler {
|
|
System.err.println("ZOINKS!!!, mismatch");
|
|
System.err.println("ZOINKS!!!, mismatch");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ byte[] background = new byte[(int)f.length()];
|
|
|
|
+ for(int i=0;i<background.length;i++)
|
|
|
|
+ {
|
|
|
|
+ background[i]=0;
|
|
|
|
+ }
|
|
|
|
+ boobs.seek(0);
|
|
|
|
+ boobs.write(background);
|
|
|
|
+ boobs.seek(0);
|
|
|
|
+ boobs.write(filler);
|
|
|
|
+ boobs.write(filler);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
f.read(javaisDipshit);
|
|
f.read(javaisDipshit);
|
|
int countFileRecords = (Ints.fromBytes(javaisDipshit[2],javaisDipshit[3],javaisDipshit[0],javaisDipshit[1]) &0x00FFFFFF);
|
|
int countFileRecords = (Ints.fromBytes(javaisDipshit[2],javaisDipshit[3],javaisDipshit[0],javaisDipshit[1]) &0x00FFFFFF);
|
|
System.out.println(countFileRecords);
|
|
System.out.println(countFileRecords);
|
|
int countFileRecordsXXX = (Ints.fromBytes(javaisDipshit[1],javaisDipshit[0],javaisDipshit[3],javaisDipshit[2])&0x00FFFFFF);
|
|
int countFileRecordsXXX = (Ints.fromBytes(javaisDipshit[1],javaisDipshit[0],javaisDipshit[3],javaisDipshit[2])&0x00FFFFFF);
|
|
System.out.println(countFileRecordsXXX);
|
|
System.out.println(countFileRecordsXXX);
|
|
- f.seek(8);
|
|
|
|
|
|
+ boobs.write(fillershort);
|
|
|
|
+ boobs.seek(10);
|
|
|
|
+ f.seek(10);
|
|
|
|
+ byte[] fakeFileRecord = new byte[12];
|
|
|
|
+ for(int i=0;i<12;i++)
|
|
|
|
+ {
|
|
|
|
+ fakeFileRecord[i]=(byte)0xee;
|
|
|
|
+ }
|
|
FileMetadata[] files = new FileMetadata[countFileRecords];
|
|
FileMetadata[] files = new FileMetadata[countFileRecords];
|
|
for(int i=0;i<countFileRecords;i++)
|
|
for(int i=0;i<countFileRecords;i++)
|
|
{
|
|
{
|
|
FileMetadata fmd = new FileMetadata();
|
|
FileMetadata fmd = new FileMetadata();
|
|
f.read(javaisDipshit);
|
|
f.read(javaisDipshit);
|
|
- int sizeAndFlags = Ints.fromBytes(javaisDipshit[2],javaisDipshit[3],javaisDipshit[0],javaisDipshit[1]);
|
|
|
|
|
|
+ int sizeAndFlags = Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]);
|
|
int size = sizeAndFlags&0x00FFFFFF;
|
|
int size = sizeAndFlags&0x00FFFFFF;
|
|
- System.out.println(sizeAndFlags);
|
|
|
|
- System.out.println(size);
|
|
|
|
|
|
+ System.out.println("SZFlg>>"+sizeAndFlags);
|
|
|
|
+ System.out.println("SZExtr>>"+size);
|
|
|
|
|
|
fmd.offset_fname=size;
|
|
fmd.offset_fname=size;
|
|
if((sizeAndFlags&0xFF000000)<0)
|
|
if((sizeAndFlags&0xFF000000)<0)
|
|
@@ -148,10 +175,11 @@ public class FlashFSUnWiggler {
|
|
fmd.is_dir=true;
|
|
fmd.is_dir=true;
|
|
}
|
|
}
|
|
f.read(javaisDipshit);
|
|
f.read(javaisDipshit);
|
|
- fmd.offset=Ints.fromBytes(javaisDipshit[2],javaisDipshit[3],javaisDipshit[0],javaisDipshit[1]);
|
|
|
|
|
|
+ fmd.offset=Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]);
|
|
f.read(javaisDipshit);
|
|
f.read(javaisDipshit);
|
|
- fmd.length=Ints.fromBytes(javaisDipshit[2],javaisDipshit[3],javaisDipshit[0],javaisDipshit[1]);
|
|
|
|
|
|
+ fmd.length=Ints.fromBytes(javaisDipshit[0],javaisDipshit[1],javaisDipshit[2],javaisDipshit[3]);
|
|
files[i]=fmd;
|
|
files[i]=fmd;
|
|
|
|
+ boobs.write(fakeFileRecord);
|
|
}
|
|
}
|
|
for(int i=0;i<countFileRecords;i++)
|
|
for(int i=0;i<countFileRecords;i++)
|
|
{
|
|
{
|
|
@@ -165,16 +193,22 @@ public class FlashFSUnWiggler {
|
|
{
|
|
{
|
|
f.seek(fmd.offset_fname*2); //words again...
|
|
f.seek(fmd.offset_fname*2); //words again...
|
|
f.read(javaShorty);
|
|
f.read(javaShorty);
|
|
- short fnlength = Shorts.fromBytes(javaShorty[1],javaShorty[0]);
|
|
|
|
|
|
+ short fnlength = Shorts.fromBytes(javaShorty[0],javaShorty[1]);
|
|
byte[] fname = new byte[fnlength*2];
|
|
byte[] fname = new byte[fnlength*2];
|
|
f.read(fname);
|
|
f.read(fname);
|
|
byte[] fname_real = new byte[fnlength];
|
|
byte[] fname_real = new byte[fnlength];
|
|
for(int fi=0;fi<fname_real.length;fi++)
|
|
for(int fi=0;fi<fname_real.length;fi++)
|
|
{
|
|
{
|
|
- fname_real[i]=fname[i*2+1]; //zapping each upper bit...
|
|
|
|
|
|
+ fname_real[fi]=fname[fi*2+1]; //zapping each upper bit...
|
|
}
|
|
}
|
|
-
|
|
|
|
- String s = File.separator+new String(fname);
|
|
|
|
|
|
+ for(int j=0;j<fname.length;j++)
|
|
|
|
+ {
|
|
|
|
+ fname[j]=(byte) 0xCC;
|
|
|
|
+ }
|
|
|
|
+ boobs.seek(fmd.offset_fname*2); //words again...
|
|
|
|
+ boobs.write(new byte[]{(byte)0xDD,(byte)0xDD});
|
|
|
|
+ boobs.write(fname);
|
|
|
|
+ String s = File.separator+new String(fname_real);
|
|
fmd.filename=s;
|
|
fmd.filename=s;
|
|
}
|
|
}
|
|
if(fmd.is_dir)
|
|
if(fmd.is_dir)
|
|
@@ -184,6 +218,10 @@ public class FlashFSUnWiggler {
|
|
for(int j= 0;j< fmd.length;j++)
|
|
for(int j= 0;j< fmd.length;j++)
|
|
{
|
|
{
|
|
int subfiles = fmd.offset+j-1;
|
|
int subfiles = fmd.offset+j-1;
|
|
|
|
+ if(subfiles==-1)
|
|
|
|
+ {
|
|
|
|
+ System.out.println("WTF?");
|
|
|
|
+ }
|
|
files[subfiles].parentpath=fmd.parentpath+fmd.filename;
|
|
files[subfiles].parentpath=fmd.parentpath+fmd.filename;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -191,14 +229,23 @@ public class FlashFSUnWiggler {
|
|
{
|
|
{
|
|
|
|
|
|
System.out.println("Reading:"+fmd.parentpath+fmd.filename+"("+fmd.length+")@"+fmd.offset);
|
|
System.out.println("Reading:"+fmd.parentpath+fmd.filename+"("+fmd.length+")@"+fmd.offset);
|
|
- byte[] filecontent = new byte[fmd.length*2];
|
|
|
|
|
|
+ byte[] filecontent = new byte[fmd.length];
|
|
if(fmd.length>0)
|
|
if(fmd.length>0)
|
|
{
|
|
{
|
|
f.seek(fmd.offset*2);
|
|
f.seek(fmd.offset*2);
|
|
- f.read(filecontent);
|
|
|
|
-
|
|
|
|
|
|
+ int readme = f.read(filecontent);
|
|
RandomAccessFile out = new RandomAccessFile(outfolder+fmd.parentpath+fmd.filename,"rw");
|
|
RandomAccessFile out = new RandomAccessFile(outfolder+fmd.parentpath+fmd.filename,"rw");
|
|
out.write(filecontent);
|
|
out.write(filecontent);
|
|
|
|
+ if(readme<filecontent.length)
|
|
|
|
+ {
|
|
|
|
+ throw new IndexOutOfBoundsException("ZARF");
|
|
|
|
+ }
|
|
|
|
+ for(int k=0;k<filecontent.length;k++)
|
|
|
|
+ {
|
|
|
|
+ filecontent[k]=(byte)0xBB;
|
|
|
|
+ }
|
|
|
|
+ boobs.seek(fmd.offset*2);
|
|
|
|
+ boobs.write(filecontent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|