Преглед изворни кода

codedump on LBHEatmapper & partial furmware crawler for Sena

LH пре 3 година
родитељ
комит
ca9896c304

+ 43 - 4
LogBlockHeatMapper/src/main/java/de/nplusc/izc/logblockheatmapper/LogBlockHeatmapper.java

@@ -45,6 +45,7 @@ public class LogBlockHeatmapper
     static int maxy=0;
     static int targetBlockID=-1;
     static boolean removalsOnly=false;
+    static boolean placemode = false;
     static BufferedImage gradient = new BufferedImage(1024,1,BufferedImage.TYPE_4BYTE_ABGR);
     /**
      * @param args the command line arguments
@@ -58,10 +59,17 @@ public class LogBlockHeatmapper
         }
         if(args.length>2)
         {
-            targetBlockID = Integer.valueOf(args[2]);
-            if(args.length>3)
+            if(args[2].equals("place"))
             {
-                removalsOnly = Boolean.valueOf(args[3]);
+                placemode=true;
+            }
+            else
+            {
+                targetBlockID = Integer.valueOf(args[2]);
+                if(args.length>3)
+                {
+                    removalsOnly = Boolean.valueOf(args[3]);
+                }
             }
         }
         int size = Integer.valueOf(args[1]);
@@ -164,7 +172,38 @@ public class LogBlockHeatmapper
                 }
                 else
                 {
-                    if(max>1050)
+                    if(placemode)
+                    {
+                        k=k/10;
+                        //k/=steps;
+                        if(k<50)
+                        {
+                            color= gradient.getRGB(k*16, 0);
+
+                        }
+                        else
+                        {
+                            if(k<1050)
+                            {
+                                k-=50;
+                                color= gradient.getRGB(800+k/10, 0);
+                            }
+                            else
+                            {
+                                k-=1050;
+                                int stepWidth = (max-1050)/(123);
+                                if(stepWidth==0)
+                                    stepWidth++;
+                                color= gradient.getRGB(Math.min(1023,900+k/stepWidth), 0);
+                            }
+                            int r=(color&0xFF0000)>>16;
+                            int g=(color&0xff00)>>8;
+                            int b=color&0xff;
+                            //bw.write(r);bw.write(g);bw.write(b);
+                            //writeBy(r+" "+g+" "+b);
+                        }
+                    }
+                    else if(max>1050)
                     {
                         //k/=steps;
                         if(k<50)

+ 6 - 2
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/EntryPoint.java

@@ -21,7 +21,7 @@ public class EntryPoint implements Runnable
     @Parameters(index = "2", description = "Disassembled Data Folder")
     private File output;
 
-    @Parameters(index = "3", arity = "0..1", description = "Headset ID. Any value if not in the Prompt unpacking mode")
+    @Parameters(index = "3", arity = "0..1", description = "Headset ID. Any value if not in the Prompt unpacking mode.")
     private String headset;
 
     @Option(names = { "-d", "--deep" }, description = "Deep Dissect. Splits everything down and reassembles from those low-level modules. Also yields a partial disassembly.")
@@ -129,6 +129,9 @@ public class EntryPoint implements Runnable
             case DfuS512x:
                 FlashFSUnWiggler.unpackQCC512DFU(input,output);
                 break;
+            case ScanForSenaFirmware:
+                FirmwareAutoDumper.pullFirmwares(input,output,weNeedToGoDeeper);
+                break;
         }
     }
 }
@@ -147,7 +150,8 @@ enum Modes
     ResignDFU,
     FlashFS512x,
     FlashFSCSR86xx,
-    DfuS512x
+    DfuS512x,
+    ScanForSenaFirmware
 }
 
 // http://www.tinyosshop.com/download/ADK_CSR867x.WIN4.3.1.5.zip für die tools

+ 61 - 0
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/Firmware.java

@@ -0,0 +1,61 @@
+package de.nplusc.izc.senabitwiggler;
+
+import java.util.HashMap;
+
+public class Firmware {
+    private String DeviceId;
+    private HashMap<String, FirmwareVersion> versions;
+    private boolean InitialDLDone;
+
+    private int major;
+    private int minor;
+    private int patch;
+
+    public int getMajor() {
+        return major;
+    }
+
+    public void setMajor(int major) {
+        this.major = major;
+    }
+
+    public int getMinor() {
+        return minor;
+    }
+
+    public void setMinor(int minor) {
+        this.minor = minor;
+    }
+
+    public int getPatch() {
+        return patch;
+    }
+
+    public void setPatch(int patch) {
+        this.patch = patch;
+    }
+
+    public HashMap<String, FirmwareVersion> getVersions() {
+        return versions;
+    }
+
+    public void setVersions(HashMap<String, FirmwareVersion> versions) {
+        this.versions = versions;
+    }
+
+    public boolean isInitialDLDone() {
+        return InitialDLDone;
+    }
+
+    public void setInitialDLDone(boolean initialDLDone) {
+        InitialDLDone = initialDLDone;
+    }
+
+    public String getDeviceId() {
+        return DeviceId;
+    }
+
+    public void setDeviceId(String deviceId) {
+        DeviceId = deviceId;
+    }
+}

+ 260 - 0
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/FirmwareAutoDumper.java

@@ -0,0 +1,260 @@
+package de.nplusc.izc.senabitwiggler;
+
+import org.yaml.snakeyaml.Yaml;
+
+import javax.swing.plaf.nimbus.State;
+import java.io.*;
+import java.nio.file.CopyOption;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.*;
+
+public class FirmwareAutoDumper
+{
+
+    static Statefile state = null;
+    static File outfolder_base;
+    public static final boolean IA_UPLOAD_ENABLED = false;
+
+    public static void pullFirmwares(File statefile, File outfolder, boolean deepmode)
+    {
+        outfolder_base=outfolder;
+        try{
+
+
+
+            Yaml y = new Yaml();
+
+            if(statefile.exists())
+            {
+                try {
+                    state = (Statefile) y.load(new FileReader(statefile));
+                } catch (FileNotFoundException e) {
+                    System.err.println("Hurz");
+                    e.printStackTrace();
+                }
+            }
+            else
+            {
+                state = new Statefile();
+                state.setFirmwares(new LinkedHashMap<>());
+            }
+
+            File outfolder_tmp = new File(outfolder,"tmp");
+            outfolder_tmp.mkdirs();
+            Utils.runTool(outfolder_tmp,
+                    "wget",
+                    "http://firmware.sena.com/senabluetoothmanager/Firmware"
+                    );
+
+            BufferedReader br = new BufferedReader(new FileReader(new File(outfolder_tmp,"firmware")));
+            final HashMap<String,String> basenamelookup = new HashMap<>();
+            // filename --> real basename
+            br.lines().forEach((line)->
+                {
+                    String[] linesplitted = line.split(":");
+
+                    String FWFileName;
+                    String FWBAsename = "ZÖINKS!";
+                    if(linesplitted.length==4)
+                    {
+                        FWBAsename = linesplitted[0]+"-"+linesplitted[2];
+                        FWFileName = linesplitted[3];
+                    }
+
+                    if(linesplitted.length==3)
+                    {
+                        FWBAsename = linesplitted[0]+"-NOLNG";
+                        FWFileName = linesplitted[2];
+                    }
+                    else
+                    {
+                       return;
+                    }
+                    if(basenamelookup.containsKey(FWFileName))
+                    {
+                        return; //languageless file, no need to handle multiple times.
+                    }
+
+
+
+                    if(!state.getFirmwares().containsKey(FWBAsename))
+                    {
+                        Firmware tmp = new Firmware();
+                        tmp.setDeviceId(FWBAsename);
+                        tmp.setInitialDLDone(false);
+                        tmp.setVersions(new HashMap<>());
+                        state.getFirmwares().put(FWBAsename,tmp);
+                    }
+
+                    Firmware f = state.getFirmwares().get(FWBAsename);
+
+                    try {
+                        int[] fwnumber = splitVersionAndPullFW(FWFileName,f.getVersions());
+                        f.setMajor(fwnumber[0]);
+                        f.setMinor(fwnumber[1]);
+                        f.setPatch(fwnumber[2]);
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                });
+            br.close();
+            y.dump(state,new FileWriter(statefile));
+            new File(outfolder_tmp,"firmware").delete();
+        }
+        catch (IOException ex)
+        {
+            ex.printStackTrace();
+        }
+    }
+
+    private static int[] splitVersionAndPullFW(String filename,HashMap<String,FirmwareVersion> knownVersions) throws IOException {
+        String[] magic = filename.split("-v");
+        boolean fuckingoddity = false;
+        if(magic.length==1)
+        {
+            fuckingoddity = true;
+            magic = filename.split("_v");
+        }
+        String version = magic[1];
+        String[] vsplit = version.split("\\.");
+
+        String suffix = "";
+        int major=0,minor=0,patch=0;
+        major=Integer.valueOf(vsplit[0]);
+        if(vsplit.length==4)
+        {
+            minor = Integer.valueOf(vsplit[1]);
+            patch = Integer.valueOf(vsplit[2].substring(0,1));
+            if(vsplit[2].length()>1)
+            {
+                suffix = vsplit[2].substring(1)+"."+vsplit[3];
+            }
+            else
+            {
+                suffix = "."+vsplit[3];
+            }
+        }
+        else
+        {
+            if(vsplit[1].length()>1)
+            {
+                minor = Integer.valueOf(vsplit[1].substring(0,1));
+                suffix = vsplit[1].substring(1)+"."+vsplit[2];
+            }
+            else
+            {
+                minor = Integer.valueOf(vsplit[1].substring(0,1));
+                suffix = "."+vsplit[2];
+            }
+        }
+
+        String prefix = magic[0]+(fuckingoddity?"_":"-")+"v";
+        //suffix = suffix+".img";
+
+        scanDownwards(major,minor,patch,prefix,suffix,knownVersions);
+
+        return new int[]{major,minor,patch};
+    }
+
+    private static void scanDownwards(
+            int major,
+            int minor,
+            int patch,
+            String prefix,
+            String suffix,
+            HashMap<String,FirmwareVersion> knownVersions) throws IOException {
+        System.out.println(major+"--"+minor+"--"+patch);
+        List<FirmwareVersion> temp = new ArrayList<>();
+        //temp.add(prefix+(major+1)+".0.0"); // poking for next major
+        //temp.add(prefix+(major+1)+".0"); // poking for next major
+        //temp.add(prefix+(major)+"."+(minor+1)+".0"); // poking for next minor
+        //temp.add(prefix+(major)+"."+(minor+1)); // poking for next minor
+        //temp.add(prefix+(major)+"."+minor+"."+(patch+1)); // poking for next patch
+        System.out.println(prefix+"."+major+"."+minor+"."+patch+"."+suffix);
+
+        while(major>=1&&minor>=0&&patch>=0) //older versions won't be bruteforced, check for existence in the index prevents a redownload.
+        {
+            String synthesizedFileName = prefix+(major)+"."+minor+"."+(patch)+suffix;
+
+            if(knownVersions.containsKey(synthesizedFileName)) //skipping redownload and setting it as "not hidden" if it was a hidden version
+            {
+                knownVersions.get(synthesizedFileName).setHidden(false);
+            }
+            else
+            {
+                FirmwareVersion f = getFirmware(major,minor,patch,false,synthesizedFileName);
+                knownVersions.put(synthesizedFileName,f);
+            }
+            if(patch==0)
+            {
+                synthesizedFileName = prefix+(major)+"."+minor+suffix;
+                if(knownVersions.containsKey(synthesizedFileName)) //skipping redownload and setting it as "not hidden" if it was a hidden version
+                {
+                    knownVersions.get(synthesizedFileName).setHidden(false);
+                }
+                else
+                {
+                    FirmwareVersion f2 = getFirmware(major,minor,patch,false,synthesizedFileName);
+                    knownVersions.put(synthesizedFileName,f2);
+                }
+            }
+            patch--;
+            if(patch<0)
+            {
+                patch=9;
+                minor--;
+            }
+            if(minor<0)
+            {
+                minor=9;
+                major--;
+            }
+        }/**/
+    }
+
+
+    private static FirmwareVersion getFirmware(int major, int minor, int patch, boolean hidden, String fwname) throws IOException {
+        FirmwareVersion f = new FirmwareVersion();
+        f.setFilename(fwname);
+        f.setHidden(hidden);
+        f.setMajor(major);
+        f.setMinor(minor);
+        f.setPatch(patch);
+        File downloadFolderBase = new File(outfolder_base,"downloadstage");
+        if(true) return f;
+        Utils.runTool(downloadFolderBase,
+                "wget",
+                "http://firmware.sena.com/senabluetoothmanager/"+fwname
+        );
+        System.err.println("New Version spotted:"+fwname); //intentionally a output. that should be mailed by the cron daemon if its
+        File dlf = new File(downloadFolderBase,fwname);
+        File dst = new File(outfolder_base,fwname);
+        if(dlf.exists()&&!dst.exists())
+        {
+            f.setFiller(false);
+            f.setServerCreationDate(new Date(dlf.lastModified()));
+            Files.copy(dlf.toPath(),dst.toPath());
+
+            if(IA_UPLOAD_ENABLED)
+            {
+                Utils.runTool(downloadFolderBase,
+                        "ia",
+                        "upload",
+                        "sena-firmware-files",
+                        "--no-derive",
+                        fwname
+                );
+            }
+        }
+        else
+        {
+            f.setFiller(true);
+            f.setServerCreationDate(new Date(0));
+        }
+        return f;
+    }
+
+
+
+}

+ 71 - 0
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/FirmwareVersion.java

@@ -0,0 +1,71 @@
+package de.nplusc.izc.senabitwiggler;
+
+import java.util.Date;
+
+public class FirmwareVersion {
+    private Date ServerCreationDate;
+    private String Filename;
+    private int major;
+    private int minor;
+    private int patch;
+    private boolean hidden;
+
+    // signifies that a version is not a valid one and only "inserted" due to the guesser going over it. prevents re-guessing;
+    private boolean filler;
+
+    public boolean isFiller() {
+        return filler;
+    }
+
+    public void setFiller(boolean filler) {
+        this.filler = filler;
+    }
+
+    public Date getServerCreationDate() {
+        return ServerCreationDate;
+    }
+
+    public void setServerCreationDate(Date serverCreationDate) {
+        ServerCreationDate = serverCreationDate;
+    }
+
+    public String getFilename() {
+        return Filename;
+    }
+
+    public void setFilename(String filename) {
+        Filename = filename;
+    }
+
+    public int getMajor() {
+        return major;
+    }
+
+    public void setMajor(int major) {
+        this.major = major;
+    }
+
+    public int getMinor() {
+        return minor;
+    }
+
+    public void setMinor(int minor) {
+        this.minor = minor;
+    }
+
+    public int getPatch() {
+        return patch;
+    }
+
+    public void setPatch(int patch) {
+        this.patch = patch;
+    }
+
+    public boolean isHidden() {
+        return hidden;
+    }
+
+    public void setHidden(boolean hidden) {
+        this.hidden = hidden;
+    }
+}

+ 2 - 2
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/PromptHandlerSuite.java

@@ -106,7 +106,7 @@ public class PromptHandlerSuite {
                         throw new InputInvalidException();
                 }
                 List<String> cmd = new ArrayList<>();
-                cmd.add("sox");
+                cmd.add(EntryPoint.SoxPath);
                 cmd.addAll(soxIn);
                 cmd.add(f.getPath());
                 cmd.add("-e");
@@ -196,7 +196,7 @@ public class PromptHandlerSuite {
                             throw new InputInvalidException();
                     }
                     List<String> cmd = new ArrayList<>();
-                    cmd.add("sox");
+                    cmd.add(EntryPoint.SoxPath);
                     cmd.add(new File(prompts,fn+".wav").getPath());
                     cmd.addAll(soxIn);
                     cmd.add(f.getPath());

+ 15 - 0
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/Statefile.java

@@ -0,0 +1,15 @@
+package de.nplusc.izc.senabitwiggler;
+
+import java.util.HashMap;
+
+public class Statefile {
+    private HashMap<String, Firmware> firmwares;
+
+    public HashMap<String, Firmware> getFirmwares() {
+        return firmwares;
+    }
+
+    public void setFirmwares(HashMap<String, Firmware> firmwares) {
+        this.firmwares = firmwares;
+    }
+}