Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Der linken Seite kann nichts zugewiesen werden - Pointer 64bit (https://www.delphipraxis.net/190194-der-linken-seite-kann-nichts-zugewiesen-werden-pointer-64bit.html)

dGeek 9. Sep 2016 22:27

Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
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 :pale:

Uwe Raabe 9. Sep 2016 22:30

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
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.

dGeek 9. Sep 2016 22:33

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
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).

Uwe Raabe 9. Sep 2016 22:35

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
Ersetz doch einfach mal

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

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

dGeek 9. Sep 2016 22:37

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
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}

himitsu 10. Sep 2016 07:00

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
Delphi-Referenz durchsuchenNativeUInt :stupid:
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:

Delphi-Quellcode:
y := integer(NewProcedure) - integer(p) - 5;

Noch mehr Integer.


Und hat in X64 der JUMP-Assembler-Befehl auch die selbe Signatur?

p80286 10. Sep 2016 08:14

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

Zitat von himitsu (Beitrag 1347312)

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

dGeek 10. Sep 2016 11:28

AW: Der linken Seite kann nichts zugewiesen werden - Pointer 64bit
 
Ich weiß nicht was ich tue :lol:
Ich habe diesen Code, da ich ihn brauchte, glücklicherweise hier im Forum gefunden. Er stammt vom CodeLib-Manager.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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