PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lockbits per Programm setzen



Quagmire
11.10.2006, 16:39
Hallo,
ich habe da mal eine Frage: kann man ein Programm (Sprache beliebig ASM/C/Bascom) schreiben, welches lockbits auf Atmels setzen kann ?

Wie würde so etwas ASM-Hardcoded aussehen ?

Ich würde den Atmel gerne locken, nach x fehlerhaften zugriffen. Um brute force attaken zu verhindern. Ist ne spielerei, aber es interessiert mich brennend.

Danke für alle Tipps von euch Profis
Ciao
Quagmire

SIGINT
11.10.2006, 17:11
Hi Quagmire,
ich hab zwar noch nicht oft mit den Lockbits rumgespielt, aber mir scheint du hast die Funktion davon noch nicht ganz verstanden (oder ich hab nicht verstanden, was du überhaupt machen möchtest): Die Lockbits dienen dazu den Schreib- und/oder Lesezugriff auf den FLASH-Speicher zu sperren.
Da kannste nix mit brute force herausfinden.... wenn die Lockbits einmal programmiert wurden kannst du den Flash nurnoch löschen (und dafür gibts, wenn ich mich richtig erinnere, auch ein Lockbit für).

Gruß,
SIGINT

Jon
11.10.2006, 18:28
Ich hab zwar noch nicht oft mit den Lockbits rumgespielt, aber mir scheint du hast die Funktion davon noch nicht ganz verstanden (oder ich hab nicht verstanden, was du überhaupt machen möchtest): Die Lockbits dienen dazu den Schreib- und/oder Lesezugriff auf den FLASH-Speicher zu sperren.
Das stimmt!!


Da kannste nix mit brute force herausfinden.... wenn die Lockbits einmal programmiert wurden kannst du den Flash nurnoch löschen (und dafür gibts, wenn ich mich richtig erinnere, auch ein Lockbit für).
Lass die Lockbits am Besten ganz in Ruhe.
Wenn dein Gerät mal ganz vertig ist und du dir 100%tig sicher bist, dass du das Programm nie wieder ändern willst,dann kannst du die Lockbits setzten.

jon

Quagmire
11.10.2006, 19:10
Hallo,
zunächst mal danke für die Antworten, aber ich habe mich nicht gut ausgedrückt. Das Programm ist bereits fertig.
Das Programm auf der Karte wird angesprochen (per I/O-Port), nach sagen wir mal 3 Fehlzugriffen, möchte ich einen Programmteil aufrufen der ungefähr so aussieht: (Menschensprache, Deutsch)

3_fehlzugriffe_lockbit_setzen:
setze lockbit;
beende programm

Gegebenenfalls möchte ich die Fehlzugriffe noch im EEPROM speichern, damit das Programm auf der Karte gar nicht erst startet (nach 3 Fehlzugriffen)

Ich hoffe das Problem ist deutlicher geworden
Danke für euer Interesse
Ciao
Quagmire

linux_80
11.10.2006, 19:40
Hallo,

ich glaub Du weisst aber trotzdem noch nicht genau was die Lockbits eigentlich machen.
Ob die Lockbits gesetzt sind oder nicht, merkt man erst, wenn man eine neues Programm flashen will, was dann nicht geht, wenn die Lockbits gesetzt sind.

Man kann die Lockbits auch nur einmal setzen per Software, zum löschen muss man den ganzen AVR zurücksetzen in den Urzustand sozusagen, also Flash und so alles wieder leer.
Ist es das was Du meinst ?

Jon
11.10.2006, 19:41
Du willst also wie auch beim DVD-Player eine Sperre einbauen, die nur 5 Änderungen des Herkunftladndes zulässt.

Wenn du das willst, kannst du das machen, du musst dir nur im Klaren sein, dass der Chip dann verloren ist und du zum weiteren Betrieb eien neuen brauchst.
Wie du das aber Programmierst kann ich die nicht sagen.

Wie das mit dem Programmieren den EEPROMs geht kann ich dir nicht sagen. Auf jeden fall hört das sich für mich am besten an.
Ich würde das empfehlen.

jon

Felix G
11.10.2006, 19:50
Also ich verstehe auch nicht ganz wo der Sinn liegen soll...

wenn du feststellen willst ob Jemand deinen Code klauen will: das kannst du nicht, da dein Program währenddessen ja eh nicht läuft.

wenn du die Funktion deines Programmes nach soundsoviel wie auch immer gearteten Fehleingaben sperren willst, helfen dir die Lockbits nicht, da du damit ja nur das Auslesen sperren kannst.

Quagmire
11.10.2006, 19:52
Nochmal danke für eure Interesse:
wie kommen der Sache schon näher. Ich bin mir voll und ganz im Klaren was Lockbits für eine Funktion haben, ich habe damit auch schon rumgespielt, und weiß, dass der Atmel dann unwiderruflich unprogrammierbar ist. Ich möchte jetzt nicht die Lockbits per hand im AVR-Studio oder wo auch immer mit der Maus anklicken und so setzten. Sondern das Programm auf dem Atmel soll das selbst machen. Ich habe mir das mal so ganz billig vorgestellt (weiss nicht ob das im Detail richtig ist - bin mir ziemlich sicher es ist falsch, aber ich stell mir das so vor):

out $ADDRESSE_VOM_LOCKBIT , 1

mal so exemplarisch.
Geht das und wenn ja wie ?
Ich würde es gerne in ASM schreiben, es sollten sich nach meiner auffassung nur um wenige Zeilen handeln.

Dann noch eine Frage, das mit dem Kompletterase geht das ? Und wenn ja wie ? Der EEPROM und alles auf dem Atmel darf gelöscht werden, ich will ihn nur unlocken. Denn das war meine Laborratte (siehe oben) für den Lockbittest, und da das Programm was drauf ist nur eine LED blinken lässt, wäre ich froh wenn ich den wieder verwenden könnte.


FelixG: Interessanter Beitrag: du hast mich auf die Idee gebracht:
ich könnte doch vor dem eigentlichen Programmstart prüfen ob das lockbit gesetzt wurde:

input ($ADDRESSE_LOCK_BIT, LOCK)
if LOCK=1 EXIT ; Programm beenden
else Programm_ausführen


Danke für eure Antworten (endlich mal ein Board wo die Antworten Hand und Fuß haben)

Ciao
Quagmire

izaseba
11.10.2006, 19:56
Wenn du das willst, kannst du das machen, du musst dir nur im Klaren sein, dass der Chip dann verloren ist und du zum weiteren Betrieb eien neuen brauchst.

Kannst Du mir das mal erklären ?

Felix G
11.10.2006, 20:01
FelixG: Interessanter Beitrag: du hast mich auf die Idee gebracht:
ich könnte doch vor dem eigentlichen Programmstart prüfen ob das lockbit gesetzt wurde:

input ($ADDRESSE_LOCK_BIT, LOCK)
if LOCK=1 EXIT ; Programm beenden
else Programm_ausführenOb das möglich ist oder nicht, weiss ich nicht...
aber warum speicherst du dir diesen Wert nicht einfach im EEPROM??

Quagmire
11.10.2006, 20:15
Ob das möglich ist oder nicht, weiss ich nicht...
aber warum speicherst du dir diesen Wert nicht einfach im EEPROM??
Ich möchte einfach das Lockbit setzen, aus dem Programm heraus, das ist mir einfach wichtig, und hat keinen tieferen Grund.

Hat noch jemand einen Tipp zur Umsetzung ?
Oder sollte ich mich in die ASM-Abteilung begeben ?

Danke
Quagmire

Felix G
11.10.2006, 20:28
Ich habe mir gerade mal das Datenblatt des ATmega32 angeschaut...

dort im Kapitel Bootloader, genauergesagt auf Seite 250, steht ein Abschnitt mit folgendem Titel: "Reading the Fuse and Lock Bits from Software"

Also ist es zumindest schonmal möglich die Lockbits zu lesen, ob sie sich auch schreiben lassen habe ich bisher nicht herausfinden können. Wenn es geht wird es aber vermutlich auch im Kapitel über Bootloader stehen, denn das wäre ja die einzig sinnvolle Anwendung. Wobei man sich natürlich darüber streiten kann ob es sinnvoll ist wenn sich ein Bootloader selbst sperrt ;)
(nötig ist es jedenfalls nicht, denn ein Bootloader hat onehin schon die Möglichkeit sich selbst zu löschen)

Für die von dir geforderte Funktionalität würde ich jedenfalls bei zu vielen falschen Zugriffen einfach einen entsprechenden Wert ins EEPROM schreiben den dann dein Programm direkt nach dem Start bequem auslesen kann. Wenn du dann die Lockbits schon bei der Programmierung so setzt, daß FLASH und EEPROM weder gelesen noch geschrieben werden dürfen hast du das Maximum an Sicherheit das mit diesen Controllern möglich ist.

Jon
11.10.2006, 23:06
Wenn du das willst, kannst du das machen, du musst dir nur im Klaren sein, dass der Chip dann verloren ist und du zum weiteren Betrieb eien neuen brauchst.

Kannst Du mir das mal erklären ?

Ich meine damit, dass der Chip dann so noch zu verwenden ist. Aber halt nichts mehr geschrieben werden kann.
Wenn z.B. das Lockbit für den Flash gesetzt wird, kannst du kein neues Programm mehr auf den Chip laden.
Das Programm, das drauf ist, kann aber noch ohne weiteres genutzt werden, (vorausgesetzt eine richtige Programmierung).

Oder habe ich das irgendwie falsch verstanden??

jon

izaseba
12.10.2006, 00:26
Bevor Du den AVR wegwirfst, kannst Du immernoch Chip Erase benutzen :wink:

Gruß Sebastian

Jon
12.10.2006, 09:46
Bevor Du den AVR wegwirfst, kannst Du immernoch Chip Erase benutzen :wink:
Kann ich mit "Chip Erase" etwa die Lockbits zurücksetzten?

Wenn ja, dann habe ich hier, glaue ich, etwas schei... erzählt. Sorry!!

jon

jschilli
12.10.2006, 11:42
Kann ich mit "Chip Erase" etwa die Lockbits zurücksetzten?
jon

Hallo Jon,

mittels "Chip Erase" lassen sich die Lockbist zurücksetzen, selbst wenn ISP und JTAG/DebugWire abgeschaltet ist. Es gibt bei den meisten ATMega's noch den parallel Prog. Modus. Damit kriegt man fast jeden AVR wieder zum Leben...

Grüsse,
Schimmi

Jon
12.10.2006, 17:57
Da hab ich wohl auch wiedermal etwas Neues gelent.

jon

Quagmire
18.10.2006, 16:20
Mit welcher Addresse steuert man denn nun die Lockbits eines AT90S1200 an, also ich nehme mal an

out $Address,$Valuein Assembler ?

danke
ciao
Quagmire

DeltaEx
18.10.2006, 16:23
@jschilli:
Kannst du mehr Informationen geben wie ich die Lockbits zurücksetzen kann?
Mit PonyPorg? Ich habe einen Mega32 und der will sich nicht mehr beschreiben lassen weil an den Lockbits gespielt habe um extern Quarz mit 16 Mhz zu verwenden.

Und wo kann ich Informationen finden wie ich beim Mega32 die Lockbits setzen muss um 16 Mhz extern Quarz verwenden kann?

Jon
18.10.2006, 19:47
Und wo kann ich Informationen finden wie ich beim Mega32 die Lockbits setzen muss um 16 Mhz extern Quarz verwenden kann?
Schau mal hier:
https://www.roboternetz.de/wissen/index.php/Bascom_-_Erstes_Programm_in_den_AVR_Controller_%C3%BCbertr agen

jon

Quagmire
19.10.2006, 17:28
Könnte mir vielleicht bitte jemand einen Tipp geben,
wie ich die Lockbits per Software, welche auf dem AVR ausgeführt wird setze ?
Macht man das mit out ?
Ich habe etwas für Atmega161 gelesen... ich versuche mal das umzusetzen, und ich hoffe ihr korrigiert mich wenn ich falsch liege...
Laut Atmel:
write desired data to R0 -> ldi r0, 0b00000000
write "1001" to SPMCR -> out SPMCR, 0b00001001
execute SPM within 4 clock cycles after writing SPMCR -> SPM
Also


ldi r0,0b00000000
out SPMCR, 0b00001001
spm


Bitte dringend um Hilfe

Ciao
Quagmire