Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suche nach bestimmten Integern im Speicher einer Anwendung! (https://www.delphipraxis.net/127279-suche-nach-bestimmten-integern-im-speicher-einer-anwendung.html)

Hedge 10. Jan 2009 03:28


Suche nach bestimmten Integern im Speicher einer Anwendung!
 
Ich bastel gerade ein kleines Tool, dass aus dem Speicher einer anderen Anwendung insgesamt 8 Integer (DWORD) ausliest.
Diese haben zwar unterschiedliche Abstände zueinander, dafür bleiben die aber immer gleich.
Somit brauch ich nur die Start-Adresse um alle Variablen auslesen zu können.

Genau da ist der Haken, denn die Start-Adresse ändert sich nach jedem Neustart.
Da es nicht nur für den Eigengebrauch bestimmt ist und die potentielle Nutzerschar meist eher weniger Technik-affin ist, wollte ich nach Ansätzen fragen wie ich rausfinden kann wo die Variablen liegen?
Die Tatsache, dass beim Programmstart alle Variablen auf 0 gesetzt sind, macht die Sache nicht gerade leichter.

Cyf 10. Jan 2009 05:15

Re: Suche nach bestimmten Integern im Speicher einer Anwendu
 
Wird dir wohl nicht übrig bleiben, als im Zweifelsfall den kompletten Programmspeicher durchzuscannen.
Es könnte helfen zu wissen, ob es globale Variablen sind oder welche in einem Objekt (so dass es RTTI gibt), in welcher Sprache das andere Programm überhaupt geschrieben ist (wenn bekannt) und ob es im Userspace läuft.

[Edit] ein t

Hedge 10. Jan 2009 11:11

Re: Suche nach bestimmten Integern im Speicher einer Anwendu
 
der komplette Programmspeicher umfasst direkt nach dem Start 400MB. Also ne ganze Menge Asche. Bisher nutz ich folgenden Code um im Speicher rumzulesen

Delphi-Quellcode:
function LeseSpeicher(adresse,size:integer):integer;
var p : pointer;
    puffer : array[0..1] of DWord;
    BytesRead: DWord;
    ProcessId,ThreadId,HandleWindow : integer;
   begin
        p := ptr(adresse);  //Adresse umwandeln:
        ThreadId := GetWindowThreadProcessId(ProgrammHandle,@ProcessId); //ProgrammHandle = globale Variable
        HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
        ReadProcessMemory( HandleWindow, p , @puffer[0], size, BytesRead );
        closehandle(HandleWindow);//close
        LeseSpeicher := Puffer[0];
   end;//von LeseSpeicher
Gibt es da noch schnellere Variante.
Der andere Knackpunkt ist, dass alle Variablen 0 sind beim Start.
Die Variablen können einen Wert von 1 bis 7 annehmen.
Ich könnte den User bitten einen Key zu drücken der die erste Variable auf 7 legt, dann die Zweite auf 6, die Dritte auf 5 usw. aber nach Möglichkeit möchte ich das umgehen.

Das Programm wurde in C++ geschrieben, welcher Compiler weiß ich jedoch nicht.
Globale Variablen kann ich mir auch nicht vorstellen, da es ein großes Programm ist und es ja so leicht schlechten Code gibt.


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