DarkShadow44 schrieb:
Und ich dachte halt, dass C# zu den Interpretern gehört weil es im nicht sofort (vollständig) kompiliert wird.
C# wird sofort "vollständig" compiliert. Dabei wird üblicherweise "IL" Code erzeugt. Dieser kann dann "interpretiert" werden, oder nochmals von einem JIT-Compiler in Code übersetzt den der jeweilige Prozessor direkt ausführen kann. Es wird aber nie C# Code direkt interpretiert, daher sagt man üblicherweise nicht dass C#, oder genau so Java "interpretierte" Sprachen wären.
Und wie gesagt: ob eine Sprache klassische Buffer-Overruns verhindert oder nicht, hängt nicht direkt damit zusammen ob sie vollständig compiliert wird oder interpretiert oder ...
in einem Disassembler werden ja die Adressen der Funktionen und Assemblercode angezeigt.
Sind diese Adressen dann fix ? Weil es sollten ja keine Programme zufällig im selben Speicherbereich arbeiten.
Dafür gibt es virtuellen Speicher. Jeder Prozess hat seinen eigenen Adressraum, daher können in verschiedenen Prozessen problemlos Programme laufen die die selben Adressen für unterschiedliche Dinge verwenden.
Aber als ich mein Programm öfter gestartet habe (zum test auch auf einer virtuellen Maschine) kamen immer die selben adressen raus. wie verhält sich das ?
Und vor allem, wie werden die festgelegt ?
Die Adressen in ".exe" Dateien sind üblicherweise fixiert. Festlegen tut sie der Linker. Das Format von ausführbaren Dateien unter Windows ist "Portable Executable", kurz "PE". Und "PE" File enthalten die nötigen Informationen was an welcher Adresse geladen werden soll.
Die Adressen von DLLs sind üblicherweise nicht fix (ausgenommen ein paar wenige System DLLs), d.h. der Code in DLLs kann an beliebige Adressen geladen werden. Dazu sind Informationen in der DLL (eine DLL ist auch ein "PE" File) abgespeichert wo was angepasst werden muss wenn der Code in der DLL "verschoben" wird. Eine DLL hat aber auch eine "preferred load address", wo sie ohne solche Änderungen verwendet werden kann. Das ist auch der Grund warum auch Code in DLLs oft an den gleichen Adressen landet wenn man ein Programm mehrfach ausführt bzw. sogar auf verschiedenen Systemem ausführt.
Nochmal etwas allgemeiner: sowohl .exe Files als auch DLLs sind "Portable Executable" Files. Und ein "PE" File kann sog. "relocation information" haben, also die nötigen Informationen um den darin enthaltenen Code zu verschieben, oder eben auch nicht. Bei .exe Files ist es unüblich, aber grundsätzlich genau so möglich diese Informationen mit abzuspeichern. Bei DLLs dagegen ist es üblich, aber man kann sie auch weg lassen. Wenn man sie allerdings weg lässt, kann es natürlich passieren dass eine DLL nicht geladen werden kann, weil der von der DLL "gefordert" Adressraum bereits mit etwas anderem belegt wird, z.B. eine andere DLL.
Da es aber pro Prozess normalerweise nur eine ".exe" gibt, ist es bei ".exe" Files kein Problem. Die ".exe" wird als erste geladen, und kann sich daher aussuchen welche Adressen sie verwenden möchte.
Die "Address Space Layout Randomisation" ist ja scheinbar erst ab Vista...
"Address Space Layout Randomisation" ist ein Feature für System-DLLs. Wie oben schon angedeutet gibt es ein paar System DLLs deren Adressen "fix" sind, d.h. die nicht "verschoben" werden können. Damit man diese nicht so einfach für Exploits verwenden kann, wurde "Address Space Layout Randomisation" eingeführt. Dabei sind die Adressen dieser System-DLLs immer noch fix für eine bestimmte OS-Installation, nur beim Installieren wird eine von soweit ich weiss 16 (oder waren es 64?) Versionen der System-DLLs zufällig ausgesucht, so dass die Adressen auf unterschiedlichen Systemen nicht mehr gleich sind.
Wenn du mehr zu dem Thema wissen willst solltest du ja jetzt ein paar Stichworte haben, also z.B. das PE Format, virtuelle Adressen etc.