2009-07-08 2 views
0

Hey alle. Ich lese von einer Datei im SQL-Format zu einer anderen, und zwei Bytes in der Mitte werden beschädigt, und ich nehme an, dass es etwas Vorbereitung oder Schutz ist, die ich nicht gemacht habe.RandomAccessFile.write nicht schreiben, was ich sage es zu

Beispiel für beschädigte Daten:

//From the file that is read from. added ** to emphasize the corrupted byte 
insert into viruses (virusSig,virusHash) values (
X'579fdc569b170419e15750f0feb360aa9c58d8**90**eede50def97ee7cb03b9e905', 
X'ee002fe5'); 

//From the file that is written to. added ** to emphasize the corrupted byte 
insert into changes (filepath,loc,dat,vir,hash) values (
'E:\MyDocs\intel\antivirus\RandomFiles\0\2\5\11\24\49\EG1AxxeJSr.data', 
243540, 
X'9f4246ff8c73c5a5b470cab8c38416929c4eacc1e0021d5ac1fdbb88145d3e6f', 
X'579fdc569b170419e15750f0feb360aa9c58d8**3f**eede50def97ee7cb03b9e905', 
X'6546dd27'); 

Code, der von liest/schreibt:

public static void insertViruses(FileLocation[] locations, byte[][] viruses, String logpath) 
{ 
    int numViruses = viruses.length; 
    int virusLength = GenerateRandomCorpus.virusSignatureLengthInBytes; 

    try{ 


     for (int i = 0; i < numViruses; i++) 
     { 
      FileOutputStream logwriter = new FileOutputStream(logpath, true); 

      // Prep to copy section 
      int locationOfChange = locations[i].index; 
      String filepathToChange = locations[i].filepath; 
      File checkIfBackupExists = new File(filepathToChange + ".bak"); 
      if (!checkIfBackupExists.exists()) 
       copyFile(filepathToChange, filepathToChange + ".bak"); 
      copyFile(filepathToChange, filepathToChange + ".tmp"); 

      RandomAccessFile x = new RandomAccessFile(filepathToChange, "rw"); 
      x.seek(locationOfChange); 

      // Copy section into byte array to write in log 
      byte[] removedSection = new byte[virusLength]; 
      x.read(removedSection, 0, virusLength); 
      if (GenerateRandomCorpus.dbg) 
       System.out.println(filepathToChange + ":" + locationOfChange); 
      x.close(); 

      // Write changes to log 
      byte[] removedSectionConvertedToHexString = StringUtils.getHexString(removedSection).getBytes(); 
      byte[] virusConvertedToHexString = StringUtils.getHexString(viruses[i]).getBytes(); 
      byte[] hashConvertedToHexString = StringUtils.getHexString(GenerateRandomViruses.intToByteArray(new String(viruses[i]).hashCode())).getBytes(); 
      System.out.println(StringUtils.getHexString(removedSection)); 
      System.out.println(StringUtils.getHexString(viruses[i])); 
      logwriter.write(String.format("insert into changes (filepath,loc,dat,vir,hash) values " + 
        "('%s',%d,X'", filepathToChange, locationOfChange).getBytes()); 
      logwriter.write(removedSectionConvertedToHexString); 
      logwriter.write("',X'".getBytes()); 
      logwriter.write(virusConvertedToHexString); 
      logwriter.write("',X'".getBytes()); 
      logwriter.write(hashConvertedToHexString); 
      logwriter.write("');\n".getBytes()); 

      // Insert virus into file 
      File original = new File(filepathToChange); 
      original.delete(); 
      RandomAccessFile fileToInsertIn = new RandomAccessFile(filepathToChange + ".tmp", "rw"); 
      fileToInsertIn.seek(locationOfChange); 
      fileToInsertIn.write(viruses[i]); 
      fileToInsertIn.close(); 

      File a = new File(filepathToChange + ".tmp"); 
      original = new File(filepathToChange); 
      a.renameTo(original); 
      a.delete(); 

      logwriter.close(); 
     } 


    } catch (Exception e) 
    { 
     System.err.println(e.toString()); 
     System.err.println("Error: InsertVirusesIntoCorpus, line 100"); 
    } 
} 

Irgendwelche Ideen?

+2

Ja, ich habe eine Idee, dass Sie Ihren Code zu den relevanten Teilen vereinfachen könnten. Auf diese Weise könnte jemand es wirklich lesen wollen. – skaffman

Antwort

0

Ich bin ein bisschen von Ihrem Code verwirrt und warum gibt es so viele Conversions los ist, aber hier gehe ich ...

Mein Bauch sagt mir, Sie entweder einige Zeichensatz-Konvertierung los haben, unbeabsichtigt, oder dass die Beschädigung durch den Wechsel zwischen rohen Bytes, Java-Byte-Primitiven und Java-Int-Primitiven verursacht wird. Denken Sie daran, dass Java der byte Wertebereich zwischen -127 und 128 ist und String .getBytes() Zeichencodierungsschema bewusst ist.

Insbesondere sieht das gerade wirklich seltsam für mich:

byte[] virusConvertedToHexString = StringUtils.getHexString(viruses[i]).getBytes(); 

Dies ist, was passiert:

  1. viruses[i] gibt Ihnen eine byte Array
  2. StringUtils.getHexString() nimmt, dass die Byte-Array und gibt Sie eine hexadezimale Darstellung dieser byte Array als String (angenommen: Was ist das StringUtils? Es sieht nicht m sein, von [org.apache.commons.lang][1].)
  3. Schließlich Sie die String ‚s byte Array Speicherung in virusConvertedToHexString

Schritt 2 wäre, würde ich Probleme vermuten.

Auch oberhalb der Codeblock enthält nicht den Code, der erzeugt:

//From the file that is read from. added ** to emphasize the corrupted byte 
insert into viruses (virusSig,virusHash) values (
X'579fdc569b170419e15750f0feb360aa9c58d8**90**eede50def97ee7cb03b9e905', 
X'ee002fe5'); 

Es helfen würde.

+0

StringUtils ist nur eine andere Klasse an anderer Stelle, die ich habe. – montooner

+0

und was genau macht diese Klasse? –

Verwandte Themen