![]() |
dynamische Arrays
Hi,
ist nur eine kleine winzige Frage: Warum kann ich bei nullbasierte dynamischen Arrays, die zum Beispiel mit SetLength(Array, 2) dimensionalisiert sind, auch auf eine höhere Dimension etwas zuweisen und zugreifen. Z.B. : Array[10] := 5; ShowMessage(array[10]); Ich dachte man könne nur von 0 bis der angegebenen Länge -1 zugreifen. Kann mir das einer erklären? |
Re: dynamische Arrays
Moin!
Kannst du auch nur, du überschreibst mit der Wertzuweisung den folgenden Speicher und der liegt noch in deinem Datenbereich, daher hast du keine Probleme. Wenn du aber mal unter Projekt->Optionen->Compiler die Bereichsprüfung einschaltest, dann meckert er dich auch an. Ansonsten zur Verdeutlichung:
Delphi-Quellcode:
Wenn du bei der Definition auf das Arr[4] was reinschreibst, dann wird dieses höchstwahrscheinlich danach in Word1 drinne stehen...
Var
Arr : Array[0..3] Of Word; Word1, Word2 : Word; MfG Muetze1 |
Re: dynamische Arrays
Zitat:
Zitat:
Wieso gerade in Word1? Kann es sein, dass ich Word1 einen Wert zuweise, aber dieser dann überschrieben wird, wenn ich auf die 4. Stelle des Arrays zugreife? |
Re: dynamische Arrays
wenn du arr[4] veränderst ja ;)
das Problem hatte ich auch mal, als ich eine falsche Größenangabe für ein Array in einem Test-Crypter hatte... nach dem Entschlüsseln kamen plötzlich gaanz andere Werte raus :roll: da Teile von anderen Variablen/Arrays durch diese Falschangabe verändert wurden... [add] eventuell könnte es sogar vorkommen, das du beim schreibenden Zugriff über die Array-Grenze hinaus Programmcode überschreibst (?) und damit einen BufferOverflow erzeugst wie er in vielen Sicherheitslücken benutzt wird (?) [/add] nich schlagen wenn ich falsch liege, aber ich hab das so in Erinnerung :angle2: [edit] Tepfihler beseitigt :mrgreen: [/edit] |
Re: dynamische Arrays
Erstmal danke für die Antworten, ist sehr aufschlussreich. Das mit dem Buffer Overflow möchte ich aber gerne genauer wissen. Wäre nämlich interessant zu erfahren.
|
Re: dynamische Arrays
Das würde mich auch interessieren.
Zitat:
|
Re: dynamische Arrays
Das Prinzip besteht darin, über die Grenzen eines Arrays hinaus in den Speicher zu schreiben. Damit kommst du unter Umständen in den Speicherbereich eines anderen Prozesses, bzw. in den Bereich wo der Code eines anderen Prozesses liegt. Springt der ProgramCounter des Prozesses nun an die neue Stelle, führt er deinen Code anstatt dem originalen aus. Wenn du das ganze dann ganz gezielt machst, kannst du diese "Fehler" in wichtigen Dateien erzeugen, und somit die Sicherheit eines System kompromittieren.
so glaube ich das Ganze verstanden zu haben, schlagt mich nicht wenns falsch ist |
Re: dynamische Arrays
genau so meinte ich das ;)
wenn kein "gültiger Code" an dieser Stelle steht, dann kommt es meist zum Absturz (ungewollt)... aber durch gezieltes Ändern wird dann schadhafter Code ausgeführt, was zum Beispiel bei System-Prozessen fatale Folgen haben kann... |
Re: dynamische Arrays
Wenn M$ aber den Speicherschutz für Systemprogramme richtig implementieren würde, würde das ganze Problem nicht auftereten. Speicherschutz bedeutet, dass ich nur an meinen Speicherbereich rankomme und den anderen in Frieden lassen muss. Somit kann ich fremden Code nicht mehr überschreiben und 50% der aktuellen Viren wären mal außer Gefecht.
|
Re: dynamische Arrays
Schon, aber dann bleibt trotzdem noch das Problem im lokalen Prozess,
was man ja zu hauf in Internet-Anwenungen findet indem man Fehlerhafte Daten an den Client/server sendet, diese nicht drauf klar kommen und abstürzen :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz