Bootloader und XOR

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • 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.

      Quellcode

      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
      Alles anzeigen
      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
    • Pac-Man schrieb:

      Firmware eines ATMega168 ganz einfach verschlüsseln
      Irgendwie verstehe ich nicht ganz, was du vorhast.
      Möchtest du den Atmega vor dem Auslesen schützen? Da nimm doch die entsprechende Fuse.

      Pac-Man schrieb:

      Quelltext vom Bascom Bootloader
      Bist du sicher, dass du einen Bootloader verwendest?

      Mein Wunsch : Beschreibe bitte, was du vorhast.

      Danke

      MfG von der Spree
      Frank
    • Hi,

      ja, ich hab einen Bootloader auf dem Controller und überspiele dann die *.bin Datei über die serielle Schnittstelle. Diese Datei möchte ich codieren und mit dem Bootloader wieder decodieren damit ich einen einfachen Schutz gegen auslesen habe. Das schützen des Controllers über Fuse Bits ist mir bekannt.

      So wie in diesem Beitrag etwa.

      bascomforum.de/index.php?threa…ight=bootloader#post27850
    • six1 schrieb:

      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 schrieb:

      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.


      Quellcode

      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:


      Quellcode

      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
      Alles anzeigen
      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 schrieb:

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


      Mitch64 schrieb:

      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 schrieb:

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

      Quellcode

      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()
      Alles anzeigen
      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 schrieb:

      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 schrieb:

      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 schrieb:

      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ß