AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wozu Relocation?

Ein Thema von Namenloser · begonnen am 16. Mär 2014 · letzter Beitrag vom 30. Mär 2014
Antwort Antwort
Seite 1 von 3  1 23      
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

Wozu Relocation?

  Alt 16. Mär 2014, 15:31
Ich bereite mich gerade auf eine Betriebssysteme-Klausur vor, und da bin ich gerade am Punkt Relocation.

Also dabei werden ja wohl irgendwelche Adressen angepasst, wenn das Image (z.B. Exe, DLL) an eine bestimmte Stelle im Speicher geladen wird.

Ich frag mich nur: Wo braucht man das überhaupt? Ich habe mich ja mal ein bisschen mit der Generierung von Assembler-Code befasst, und alle JMPs, CALLs usw. beziehen sich in der Regel auf relative Offsets an und nicht auf absolute Adressen. Ich weiß, dass es auch zwar entsprechende Codes für absolute Adressen gibt, hab die aber noch nie in Verwendung gesehen. Ist Relocation nur für diese Instruktionen nötig, die sowieso in der Praxis praktisch nie verwendet werden? Bei relativen Sprüngen wüsste ich nicht, warum da etwas angepasst werden müsste.

Wozu/Wann verwendet man absolute Adressen überhaupt jemals? Der einzige Grund, den ich mir vorstellen könnte, wäre eine minimale Performancesteigerung, da man z.B., wenn man Code aus einer DLL anspringen will, nicht erst einen Pointer dereferenzieren muss, um das Sprungziel zu ermitteln*. Aber das könnte man auch zur Not im Programm selbst regeln mit selbstmodifizierendem Code, Betriebssystemunterstützung bräuchte man eigentlich nicht.

* Häufig macht man das ja so (in der Art):
Delphi-Quellcode:
type
  TMyAPICall = procedure (Foo: DWord); cdecl;
var
  MyAPICall: TMyAPICall = nil;
initialization
  MyAPICall := GetProcAdress(...);
Delphi-Quellcode:
MyAPICall(42);
// =>
// MOV EAX, [MyAPICall]; <- dereferenzierung
// CALL EAX;
// (oder so ähnlich zumindest)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Wozu Relocation?

  Alt 16. Mär 2014, 15:48
Ich bereite mich gerade auf eine Betriebssysteme-Klausur vor, und da bin ich gerade am Punkt Relocation.

Also dabei werden ja wohl irgendwelche Adressen angepasst, wenn das Image (z.B. Exe, DLL) an eine bestimmte Stelle im Speicher geladen wird.

Ich frag mich nur: Wo braucht man das überhaupt? Ich habe mich ja mal ein bisschen mit der Generierung von Assembler-Code befasst, und alle JMPs, CALLs usw. beziehen sich in der Regel auf relative Offsets an und nicht auf absolute Adressen.
Das kann nicht sein, denn dazu muessten alle Prozessoren das auch koennen. Das ist aber definitiv nicht der Fall. Du hast Dir vermutlich nur halbwegs aktuelle Intel-kompatible Prozessoren angeschaut.

Ich weiß, dass es auch zwar entsprechende Codes für absolute Adressen gibt
Genau.

Wozu/Wann verwendet man absolute Adressen überhaupt jemals? Der einzige Grund, den ich mir vorstellen könnte, wäre eine minimale Performancesteigerung, da man z.B., wenn man Code aus einer DLL anspringen will, nicht erst einen Pointer dereferenzieren muss, um das Sprungziel zu ermitteln*. Aber das könnte man auch zur Not im Programm selbst regeln mit selbstmodifizierendem Code, Betriebssystemunterstützung bräuchte man eigentlich nicht.
Wie schon oben geschrieben: Nicht alle Prozessoren beherrschen relative Adressierung oder es ist ggf. ineffizienter als absolulte Adressierung. Selbst modifizierender Code wiederum ist ein Sicherheitsrisiko und wird deshalb von aktuellen Betriebssystemen teilweise blockiert.
Thomas Mueller
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Wozu Relocation?

  Alt 16. Mär 2014, 16:00
Das kann nicht sein, denn dazu muessten alle Prozessoren das auch koennen. Das ist aber definitiv nicht der Fall. Du hast Dir vermutlich nur halbwegs aktuelle Intel-kompatible Prozessoren angeschaut.
Ja, bei Prozessoren, die nur absolute Adressen unterstützen, leuchtet es mir ein. Also braucht man das wirklich nur da?

Und wenn Relocation ausgeführt wird, dann wird vom Betriebssystem jeder einzelne Sprung gepatcht, ist das richtig? Das heißt, das Betriebssystem müsste unter Umständen Assembler-Code disassemblieren können? Denn es ist ja nicht gesagt, dass auf jeder Prozessorarchitektur die Zieladresse einfach so „als Klartext“ an einer Byte-Grenze im Code steht.

Geändert von Namenloser (16. Mär 2014 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wozu Relocation?

  Alt 16. Mär 2014, 16:31
Und wenn Relocation ausgeführt wird, dann wird vom Betriebssystem jeder einzelne Sprung gepatcht, ist das richtig? Das heißt, das Betriebssystem müsste unter Umständen Assembler-Code disassemblieren können? Denn es ist ja nicht gesagt, dass auf jeder Prozessorarchitektur die Zieladresse einfach so „als Klartext“ an einer Byte-Grenze im Code steht.
Dafür schreibt der Compiler oder Linker eine Relocation Table mit den Adressen die gepatcht werden müssen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Wozu Relocation?

  Alt 16. Mär 2014, 16:37
Und wenn Relocation ausgeführt wird, dann wird vom Betriebssystem jeder einzelne Sprung gepatcht, ist das richtig? Das heißt, das Betriebssystem müsste unter Umständen Assembler-Code disassemblieren können? Denn es ist ja nicht gesagt, dass auf jeder Prozessorarchitektur die Zieladresse einfach so „als Klartext“ an einer Byte-Grenze im Code steht.
Dafür schreibt der Compiler oder Linker eine Relocation Table mit den Adressen die gepatcht werden müssen.
Ja, aber es könnte ja sein, dass ein Pointer z.B. 20 Bits lang ist und die JMP-Instruction so aussieht:

Code:
jjjj aaaa aaaa aaaa aaaa aaaa
Wobei hier jedes Zeichen für 1 Bit stehen soll. Die ersten 4 Bit kodieren die JMP-Instruktion selbst, und die restlichen 20 Bit geben die Zieladresse an.

Dann kann man nicht einfach dem Betriebssystem eine Byte-Adresse zum Patchen geben, weil die zu patchende Adresse nicht an einer Byte-Grenze anfängt.

Geändert von Namenloser (16. Mär 2014 um 16:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: Wozu Relocation?

  Alt 16. Mär 2014, 16:42
Dafür schreibt der Compiler oder Linker eine Relocation Table mit den Adressen die gepatcht werden müssen.
Relocation ist das Konzept, wie es konkret umgesetzt wird, ist eine andere Sache. Es könnte auch einfach bedeuten, eine Sprungtabelle an einer wohl-bekannten Stelle im Code zu patchen.

Wenn Relocation vom Betriebssystem auf eine bestimmte Weise unterstützt wird, dann müssen sich die Programme daran halten. Wenn das Betriebssystem einen Sprungbefehl nicht unterstützt, darf der eben nicht verwendet werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:14
Zitat:
Ich frag mich nur: Wo braucht man das überhaupt?
Einer der Hauptgründe liegt z.B. dran, daß Viele einfach so doof sind und und blind die Vorgaben verwenden.

Drum liegen auch fast alle Delphi-DLLs an der selben Stelle, wenn man mal eigentliche Zieladresse aus den DLLs ausliest.
Nur gibt es da ein Problem, denn an einer Stelle kann nur eine DLL geladen werden, also müssen Nachfolgende verschoben werden.

Und dann gibt es auch noch den Sicherheitsaspekt, wo dann das System die DLLs absichtlich verschiebt.
Wenn eine DLL immer an der selben Stelle liegt, dann können Angreifer direkt auf statische Adressen zugreifen und z.B. Buffer-Overruns so auslegen, daß sie geziehlt bestimmte Strukturen angreifen.
Tja, und wenn man nun absichtlich die DLLs jedes Mal an einer anderen Stelle läd, dann kann man nicht mehr so einfach auf diese "festen" Adressen losgehen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Mär 2014 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:16
Ja, aber es könnte ja sein, dass ein Pointer z.B. 20 Bits lang ist ...
Kann er nicht! Für ein 32-Bit Anwendung sind die Pointer immer 32 Bit lang, unter 64 Bit immer 64 Bit. "Früher" gabs mal noch 16-Bit Adressen und sowas wie Pages um mehr als 64 kByte Adressraum zu haben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:22
Zitat:
Ich frag mich nur: Wo braucht man das überhaupt?
Einer der Hauptgründe liegt z.B. dran, daß Viele einfach so doof sind und ...
Dem möchte ich widersprechen. Ich habe absichtlich alle unserer DLL's an die gleiche Base-Adresse gelegt damit Windows (auch ohne Adressverwürfler) diese immer nach eigener Logik optimal läd. Was nützt mir eine unterschiedliche Angabe pro DLL wenn ich nicht weiß wie viel Platz die aktuelle DLL-Inkarnation benötig und ich mit einer unterschiedlichen Base-Adresse mir meinen beschränkten 32-Bit Adressraum "zukleistere" so das ich nur noch sehr kleine nicht unterbrochene Adressräume habe.

Und die Zeit die Windows benötigt die zwangsweise nötige Realocation durchzuführen ist seit Jahren irrelevant.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Wozu Relocation?

  Alt 16. Mär 2014, 17:22
Das gilt für heutige Intelprozessoren. Bei anderen Prozessoren kann es anders sein, bzw. war es.
So hatten 8-Bit-Prozessoren 16-Bit Adressregister ( den 256 Bytes wären etwas wenig Speicher). 68000er Prozessoren hatten auch bei 16-Bit Datenbus schon 32-Bit für Prozessoren ( von denen aber anfänglich nur 24 Bit ausgewertet wurden).
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz