FlashFSUnWiggler.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package de.nplusc.izc.senabitwiggler;
  2. import com.google.common.primitives.Ints;
  3. import com.google.common.primitives.Shorts;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.io.RandomAccessFile;
  8. public class FlashFSUnWiggler {
  9. private static class FileMetadata
  10. {
  11. private int offset;
  12. private boolean is_dir;
  13. private int length;
  14. private int offset_fname;
  15. private String filename;
  16. private String parentpath;
  17. }
  18. public static void unpackFSQCC512x(File firmware, File outfolder)
  19. {
  20. try (RandomAccessFile f = new RandomAccessFile(firmware,"r")) {
  21. byte[] javaisDipshit = new byte[4];
  22. byte[] javaShorty = new byte[2];
  23. int magic = f.readInt(); //ignored
  24. f.read(javaisDipshit);
  25. int sizeFile = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
  26. if(sizeFile>f.length())
  27. {
  28. System.out.println(sizeFile);
  29. System.err.println("ZOINKS!!!, mismatch");
  30. return;
  31. }
  32. f.read(javaisDipshit);
  33. int countFileRecords = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
  34. FileMetadata[] files = new FileMetadata[countFileRecords];
  35. for(int i=0;i<countFileRecords;i++)
  36. {
  37. FileMetadata fmd = new FileMetadata();
  38. f.read(javaisDipshit);
  39. int sizeAndFlags = Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
  40. int size = sizeAndFlags&0x00FFFFFF;
  41. System.out.println(sizeAndFlags);
  42. System.out.println(size);
  43. fmd.offset_fname=size;
  44. if((sizeAndFlags&0xFF000000)<0)
  45. {
  46. System.out.println("dir");
  47. fmd.is_dir=true;
  48. }
  49. f.read(javaisDipshit);
  50. fmd.offset=Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
  51. f.read(javaisDipshit);
  52. fmd.length=Ints.fromBytes(javaisDipshit[3],javaisDipshit[2],javaisDipshit[1],javaisDipshit[0]);
  53. files[i]=fmd;
  54. }
  55. for(int i=0;i<countFileRecords;i++)
  56. {
  57. FileMetadata fmd = files[i];
  58. if(fmd.offset_fname==0)
  59. {
  60. fmd.filename="";
  61. fmd.parentpath="";
  62. }
  63. else
  64. {
  65. f.seek(fmd.offset_fname);
  66. f.read(javaShorty);
  67. short fnlength = Shorts.fromBytes(javaShorty[1],javaShorty[0]);
  68. byte[] fname = new byte[fnlength];
  69. f.read(fname);
  70. String s = File.separator+new String(fname);
  71. fmd.filename=s;
  72. }
  73. if(fmd.is_dir)
  74. {
  75. new File(outfolder+fmd.parentpath+fmd.filename).mkdirs();
  76. for(int j= 0;j< fmd.length;j++)
  77. {
  78. int subfiles = fmd.offset+j-1;
  79. files[subfiles].parentpath=fmd.parentpath+fmd.filename;
  80. }
  81. }
  82. else
  83. {
  84. System.out.println("Reading:"+fmd.parentpath+fmd.filename+"("+fmd.length+")@"+fmd.offset);
  85. byte[] filecontent = new byte[fmd.length];
  86. if(fmd.length>0)
  87. {
  88. f.seek(fmd.offset);
  89. f.read(filecontent);
  90. RandomAccessFile out = new RandomAccessFile(outfolder+fmd.parentpath+fmd.filename,"rw");
  91. out.write(filecontent);
  92. }
  93. }
  94. }
  95. } catch (FileNotFoundException e) {
  96. e.printStackTrace();
  97. } catch (IOException e) {
  98. e.printStackTrace();
  99. }
  100. }
  101. }