Bootloader und XOR

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Bootloader und XOR

      Hallo,

      möchte gerne die Firmware eines ATMega168 ganz einfach verschlüsseln. Hab mir die paar Beispiele angeschaut aber leider etwas zu hoch für mich. Deswegen hab ich gedacht, ich fange als Anfänger, am Anfang an damit ich auch verstehe was da passiert.

      Hab mich für eine ganz einfache XOR Verschlüsselung entschieden. Im Beispiel sende ich von einem VB.NET Programm eine Zeichen (Wert XOR "a") lasse es vom Controller entschlüsseln und zurückschicken.

      Source Code

      1. Declare Function Dekrypt(byval Wert As String) As String
      2. Do
      3. Toggle Led_betriebszustand
      4. Waitms 100
      5. Loop
      6. Serial0charmatch:
      7. Dim Incoming_data As String * 40
      8. Input Incoming_data
      9. Dim Z As String * 2
      10. Z = Dekrypt(incoming_data)
      11. Print "=>" ; Z
      12. Return ')
      13. Function Dekrypt(byval Wert As String ) As String
      14. Local By As Byte
      15. By = Hexval(wert) Xor Asc( "a")
      16. Dekrypt = Chr(by)
      17. End Function
      Display All
      Soweit funktioniert das aber ich glaube dass ich auf dem falschen Weg bin. Vor allem weiß ich nicht wie und wo ich das in den Quelltext vom Bascom Bootloader einfügen muss. Alle meine Versuche (zig Trail & Error) sind fehl geschlagen.

      Bitte um Denkanstöße aber gerne so dass ein Anfänger sie versteht und nachvollziehen kann.

      Gruß, Martin
    • six1 wrote:

      naja, ich habe das schon gemacht. Wenn ich dir jetzt aber meine Codierung sende, dann hätte ich die auch nicht zusammen bauen müssen
      Das möchte ich auch nicht. Ich möchte es ja selbst verstehen.

      six1 wrote:

      Du brauchst ein Programm, welches dir die BIN oder HEX codiert und im angepassten Bootloader schlüsselt du wieder zurück.
      Soweit ist es mir schon klar. Ein Programm welches die BIN Datei codiert hab ich mir in VB.NET zusammengenagelt. Update im Klartext funktioniert ja. Die Daten kann ich auch XOR codieren, der Controller codiert auch zurück (siehe Programmschnipsel oben) aber weiter komme ich nicht. Verstehe den Bootloader von MCS nicht wirklich. Der muss ja zurück codieren.


      Source Code

      1. 'write one or more pages
      2. Writepage:
      3. If Bkind = 0 Then
      4. For J = 1 To 128 Step 2 'we write 2 bytes into a page
      5. Vl = Buf(j) : Vh = Buf(j + 1) 'get Low and High bytes
      6. R0 = Vl 'store them into r0 and r1 registers
      7. R1 = Vh
      8. Spmcrval = 1 : Gosub Do_spm 'write value into page at word address
      9. Wrd = Wrd + 2
      Dachte ich codieren einfach die zwei Bytes (Vl und Vh. Auszug aus originalem Bootloader) zurück aber bei allem was ich versuche meckert der Compiler.

      Gruß
    • Also, das gemeckerte hab ich ihm abgewöhnt trotzdem klappt es nicht. Hier meine Versuche:
      Dekodieren tue ich jetzt so:


      Source Code

      1. 'write one or more pages
      2. Writepage:
      3. If Bkind = 0 Then
      4. For J = 1 To 128 Step 2 'we write 2 bytes into a page
      5. Vl = Buf(j) : Vh = Buf(j + 1) 'get Low and High bytes
      6. 'original
      7. 'R0 = Vl
      8. 'R1 = Vh
      9. Dim Zz As Byte
      10. Zz = Vl Xor "a"
      11. R0 = Zz
      12. Zz = Vh Xor "a"
      13. R1 = Zz
      14. 'Vh
      15. Spmcrval = 1 : Gosub Do_spm 'write value into page at word address
      16. Wrd = Wrd + 2 ' word address increases with 2 because LS bit of Z is not used
      17. If Wrd = Maxword Then ' page is full
      18. Wrd = 0 'Z pointer needs wrd to be 0
      19. Spmcrval = 5 : Gosub Do_spm 'write page
      20. Spmcrval = 17 : Gosub Do_spm ' re-enable page
      21. Page = Page + 1 'next page
      22. Spmcrval = 3 : Gosub Do_spm ' erase next page
      23. Spmcrval = 17 : Gosub Do_spm ' re-enable page
      24. End If
      25. Next
      Display All
      Vl und Vh tue ich vor dem verschieben XOR mir "a". Dann flashe ich einen Text, und zwar den Satz "The quick brown fox jumps over the lazy dog." ebenfalls XOR mit "a". Im Flas des Controllers steht nun das hier:

      Test krypt.jpg

      Also denke ich, dass die Entschlüsselung funktioniert. AAAAber wenn ich jetzt ein kleines Blinkprogramm ebenso kodiere und flasche hab ich dieses im Controller:
      Blinken krypt.jpg

      Statt diesem
      Blinken orig.jpg

      Warum? Ich blicke es nicht...

      Gruß, Martin
    • Ich glaub, dann machste was falsch!

      Vielleicht solltest du mal deinen Algorithmus aufzeigen und beschreiben, den du zum Verschlüsseln und zum entschlüsseln verwendest.
      Außderdem würde ich dir empfehlen das mal nicht gleich mit dem Bootloader zu probieren.

      Nutze Bascom und den Simulator zum testen.
      Encrypten und decrypten kannst du dann Daten in einem Array.

      Wenn das Klappt, kannst du einen Schritt weiter gehen.

      Außerdem glaube ich auch nicht, dass dein Programm an Adresse 0 mit wie hier gezeigt anfangen kann.
      Da fehlt ja die komplette Vektor-Tabelle.
    • Ich Depp! Ich hab nur die ASCII Daten codiert! Ab "7F" war Schluss.


      Mitch64 wrote:

      Nutze Bascom und den Simulator zum testen.
      Naja, dazu müsste ich mich in den erst einarbeiten.


      Mitch64 wrote:

      Außerdem glaube ich auch nicht, dass dein Programm an Adresse 0 mit wie hier gezeigt anfangen kann.
      Natürlich nicht. War ja nur eine Testdatei damit ich sehen kann was der Bootloader daraus macht.


      Mitch64 wrote:

      Vielleicht solltest du mal deinen Algorithmus aufzeigen und beschreiben
      Ist ganz einfach...

      Source Code

      1. Dim br As New BinaryReader(readStream)
      2. Dim data(ReadStream.Length - 1) As Byte
      3. Dim myByte As Byte
      4. Dim Xdata(ReadStream.Length - 1) As Byte
      5. For i As Integer = 0 To ReadStream.Length - 1
      6. data(i) = br.ReadByte()
      7. myByte = data(i) Xor 97
      8. Xdata(i) = myByte
      9. WriteStream.WriteByte(Xdata(i))
      10. Next
      11. br.Close()
      12. ReadStream.Close()
      13. WriteStream.Close()
      Display All
      Gruß, Martin
    • So wie ich das verstehe liest du eine Datei binär ein, und tust jedes Byte mit XOR 97 (Asci "a") Xoren.
      Ich weiß jetzt nicht, ob in der Datei noch Steuerzeichen enthalten sind und du die auch noch ver-XOrst.

      Ansonsten wenn du es speicherst als Binärdatei nachdem Xoren, sollte nachdem du die geXorte Datei nochmal lädst und Xorst und speicherst, wieder das herauskommen, was vorher drin stand.
    • Mitch64 wrote:

      So wie ich das verstehe liest du eine Datei binär ein, und tust jedes Byte mit XOR 97 (Asci "a") Xoren.
      Ja, genau.


      Mitch64 wrote:

      Ich weiß jetzt nicht, ob in der Datei noch Steuerzeichen enthalten sind und du die auch noch ver-XOrst.
      Das weiß ich auch nicht. Es ist halt eine *.BIN Datei vom Compiler. Ich gehe mal davon aus dass alle Zeigen (von HEX 00 bis HEX FF) darin enthalten sein können. Deswegen muss natürlich auch Byteweise eingelesen werden. Bei meinen ersten Versuchen habe ich nur den Inhalt als String eingelesen und geXORd.


      Mitch64 wrote:

      Ansonsten wenn du es speicherst als Binärdatei nachdem Xoren, sollte nachdem du die geXorte Datei nochmal lädst und Xorst und speicherst, wieder das herauskommen, was vorher drin stand.
      Ja, klar. Dadurch dass ich die Datei als String eingelesen habe und geXORd habe habe ich natürlich auch immer ein passendes Ergebnis bekommen. Bis ich dann eine *.BIN Datei eingelesen habe. Da habe ich gemerkt dass ich nur die ASCII Zeichen geXORd habe.

      Gruß