Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Gibt es zu jedem String einen Pointer? (https://www.delphipraxis.net/121530-gibt-es-zu-jedem-string-einen-pointer.html)

Neutral General 29. Sep 2008 21:12


Gibt es zu jedem String einen Pointer?
 
Hi,

Ich durchsuche den Speicher eines fremden Programms nach einem String. Den finde ich auch. (Text eines Labels z.B.)
Jetzt versuche ich die Adresse eines Pointers rauszufinden, die auf diesen String zeigt. Ich gehe dabei so vor:

Delphi-Quellcode:
var buff,i: Cardinal;
begin
  StrAddr := GetStrAddr; // nicht das Problem
  i := 0;
  repeat
    inc(i);
    ReadProcessMemory(Process,Pointer(i),@Buff,SizeOf(Pointer),br);
  until Pointer(Buff) = StrAddr;
end;
Allerdings werde ich nicht fündig. Aber es müsste doch einen geben oder nicht? Wie will man sonst drauf zugreifen?? Oder ist der Code falsch? (Das der Code etwas unperformant ist, ist mir bewusst :P )

Gruß
Neutral General

Hawkeye219 29. Sep 2008 21:43

Re: Gibt es zu jedem String einen Pointer?
 
Hallo Michael,

wer garantiert dir, dass ein Zeiger genau auf das erste Zeichen des Textes zeigt? Der Text könnte beispielsweise auch ein ShortString mit einem führenden Längenbyte sein.

Gruß Hawkeye

jbg 29. Sep 2008 21:45

Re: Gibt es zu jedem String einen Pointer?
 
Zitat:

Zitat von Hawkeye219
Der Text könnte beispielsweise auch ein ShortString mit einem führenden Längenbyte sein.

Oder der Zeiger wird zur Laufzeit aus einer Startadresse und einem Offset in eine String-Tabelle (resourcestring) berechnet.

Neutral General 29. Sep 2008 21:50

Re: Gibt es zu jedem String einen Pointer?
 
Zitat:

Zitat von Hawkeye219
Hallo Michael,

wer garantiert dir, dass ein Zeiger genau auf das erste Zeichen des Textes zeigt? Der Text könnte beispielsweise auch ein ShortString mit einem führenden Längenbyte sein.

Gruß Hawkeye

Zitat:

Zitat von jbg
Zitat:

Zitat von Hawkeye219
Der Text könnte beispielsweise auch ein ShortString mit einem führenden Längenbyte sein.

Oder der Zeiger wird zur Laufzeit aus einer Startadresse und einem Offset in eine String-Tabelle (resourcestring) berechnet.

Es handelt sich ja um die Caption eines Labels. Also Quasi TCustomLabel.FCaption.
Da dürfte eigentlich keine der beiden genannten Fälle auftreten oder?

Namenloser 29. Sep 2008 22:57

Re: Gibt es zu jedem String einen Pointer?
 
Was sagt dir, dass alle Pointer auf 4 Bytes (oder hatte ein Cardinal 8? Egal, geht um's Prinzip) aligned sind?
Das kann doch auch so aussehen:
Code:
BPPPP
(B steht hier für irgendein byte, die 4 P für einen Pointer)
Code:
BPPPP
----
Wenn du jetzt bei Position 0 anfängst zu zählen, wirst du den wert hier nicht finden, obwohl er vorhanden ist.

Eine blöde Sache in dem Zusammenhang ist auch noch die Endianumrechnung. Denn je nachdem wo du anfängst zu zählen, haben die Bytes unter Umständen eine andere Reihenfolge (hab ich bei meinen kläglichen ROM-Hacking versuchen zu spüren bekommen).

Dax 29. Sep 2008 23:45

Re: Gibt es zu jedem String einen Pointer?
 
Cardinal ist ein machine word, ein Int. Inc(int) == int := int + 1; Inc(pointer) == integer(pointer) := integer(pointer) + sizeof(pointer^).

nicodex 30. Sep 2008 10:15

Re: Gibt es zu jedem String einen Pointer?
 
Es gibt auch relative Adressangaben (zum Beispiel relativ zum Befehlszählregister).


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