AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
Thema durchsuchen
Ansicht
Themen-Optionen

Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

Ein Thema von dGeek · begonnen am 9. Sep 2016 · letzter Beitrag vom 10. Sep 2016
Antwort Antwort
dGeek
(Gast)

n/a Beiträge
 
#1

Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 9. Sep 2016, 23:27
Ich habe hier im Forum, Link suche ich noch raus, eine schöne Funktion gefunden:

Delphi-Quellcode:
procedure OverwriteProcedure(OldProcedure, NewProcedure: Pointer; Data: POverwrittenData = nil);
{OverwriteProcedure originally from Igor Siticov}
{Modified by Jacques Garcia Vazquez}
var
 x: PAnsiChar;
 y: integer;
 ov2, ov: Cardinal;
 p: Pointer;
begin
 if OldProcedure = nil then
  begin
   Data.Location := nil;
   Exit;
  end;
 if Assigned(Data) then
  if (Data.Location <> nil) then
   Exit; {procedure already overwritten}

 // need six bytes in place of 5
 x := PAnsiChar(OldProcedure);
 VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov);

 // if a jump is present then a redirect is found
 // $FF25 = jmp dword ptr [xxx]
 // This redirect is normally present in bpl files, but not in exe files
 p := OldProcedure;

 if Word(p^) = $25FF then
  begin
   Inc(integer(p), 2); // skip the jump
   // get the jump address p^ and dereference it p^^
   p := Pointer(Pointer(p^)^);

   // release the memory
   VirtualProtect(Pointer(x), 6, ov, @ov2);

   // re protect the correct one
   x := PAnsiChar(p);
   VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov);
  end;

 if Assigned(Data) then
  begin
   Move(x^, Data.OldCode, 6);
   {Assign Location last so that Location <> nil only if OldCode is properly initialized.}
   Data.Location := x;
  end;

 x[0] := AnsiChar($E9);
 y := integer(NewProcedure) - integer(p) - 5;
 x[1] := AnsiChar(y and 255);
 x[2] := AnsiChar((y shr 8) and 255);
 x[3] := AnsiChar((y shr 16) and 255);
 x[4] := AnsiChar((y shr 24) and 255);

 VirtualProtect(Pointer(x), 6, ov, @ov2);
end;
Er funktioniert beim Kompilieren mit 32bit wunderbar. Bei 64bit kracht es bei "// skip the jump" mit der Meldung "Der linken Seite kann nichts zugewiesen werden".
Ich bin kein Pointer-Profi und weiß hier daher nicht weiter.

Was kann man hier machen
  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
 
#2

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 9. Sep 2016, 23:30
Unter 64-Bit belegt ein Pointer 8 Byte, weswegen der Cast auf Integer in die Hose geht.

Je nach Delphi-Version bietet sich dafür UIntPtr oder NativeUInt an.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#3

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 9. Sep 2016, 23:33
Ich versuche gerade irgendwie hinter die Logik zu kommen, aber schaffe es nicht und finde deswegen keinen Lösungsansatz.
Pointer sind Chinesisch für mich (noch nie wirklich benutzt).
  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: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 9. Sep 2016, 23:35
Ersetz doch einfach mal

Delphi-Quellcode:
   
Inc(integer(p), 2); // skip the jump
durch

Delphi-Quellcode:
   
Inc(UIntPtr(p), 2); // skip the jump
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#5

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 9. Sep 2016, 23:37
Danke für die Hilfe.

Folgende Lektüre kann ich auch empfehlen. Die habe ich mir gerade auch durchgelesen:

-- Konvertieren von 32-Bit-Delphi-Anwendungen in 64-Bit-Windows: http://docwiki.embarcadero.com/RADSt...64-Bit-Windows

Delphi-Quellcode:
{$IFDEF WIN32}
   Inc(integer(p), 2); // skip the jump
{$ELSE}
   Inc(UIntPtr(p), 2); // skip the jump
{$ENDIF}
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 10. Sep 2016, 08:00
Delphi-Referenz durchsuchenNativeUInt
Der Typ IntPtr oder UIntPtr wäre aber richtiger, er ist in Delphi aber nicht immer definiert.

PS: Delphi-Referenz durchsuchenTPtrWrapper (Emba sollte da aber dringend noch bissl was erweitern, vorallem Inc und Dec-Methoden)

Zitat:
y := integer(NewProcedure) - integer(p) - 5;
Noch mehr Integer.


Und hat in X64 der JUMP-Assembler-Befehl auch die selbe Signatur?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Sep 2016 um 08:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 10. Sep 2016, 09:14

Und hat in X64 der JUMP-Assembler-Befehl auch die selbe Signatur?
Gute Frage. Darum Incrementiert man ja auch Pointer nicht. Das ist denen vorbehalten, die wirklich wissen was sie tun.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#8

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit

  Alt 10. Sep 2016, 12:28
Ich weiß nicht was ich tue
Ich habe diesen Code, da ich ihn brauchte, glücklicherweise hier im Forum gefunden. Er stammt vom CodeLib-Manager.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:00 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