Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
22.05.2012, 14:49:58
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  WinAPI Forum
| | |-+  Die Memory eines anderen Programmes auslesen
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: Die Memory eines anderen Programmes auslesen  (Gelesen 3430 mal)
EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« am: 07.05.2002, 18:27:45 »

Hallo Leute!
Ich habe im Internet eine Methode für Visual Basic gefunden, mit der man die Memory eines anderen Programmes auslesen kann! Nun möchte ich dieses aber in Delphi umsetzen. Kann mir da wer helfen??

Der Vb Code:
Code:
thehwnd = FindWindow(vbNullString, "Programm Name")

GetWindowThreadProcessId thehwnd, ProcessId

ProcessHandle = OpenProcess(&H1F0FFF, False, ProcessId)

ReadProcessMemory ProcessHandle, &h55ff0c, NewString, 3, 0&

 



Danke euch
Gespeichert

EgoFelix
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #1 am: 07.05.2002, 18:32:48 »

Ist das der vollständige Code ?

In Delphi müsste es etwa wie folgt heissen.
Bei den Parametern von ReadProcessMemory war ich mir nicht
so sicher.


[font size=2 face="Courier New"][font color="#000000"]var
  
ProcessId : DWORD; [font color="#000080"]// Prozess ID
  
[/font]NewString : array [0..255] of char;
begin
  
thehwnd :=FindWindow(nil, 'Programm Name');
  GetWindowThreadProcessID(thehwnd, @ProcessId);
  ProcessHandle  := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
  ReadProcessMemory(ProcessHandle, ???, @NewString, 3, 0);
  [font color="#000080"]//...
  
[/font]CloseHandle(ProcessHandle);
end;

[/font][/font]
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #2 am: 07.05.2002, 18:48:11 »

Hallo Thomas!
Danke erstmal, aber ich habe noch ein Problem.
Code:
procedure TForm1.Button1Click(Sender: TObject);

var

  thehwnd : THandle;

  ProcessHandle: THandle;

  ProcessId : DWORD; // Prozess ID

  NewString : array [0..0] of char;

  Pos: Pointer;

begin

  thehwnd :=FindWindow(nil, 'Winamp');

  GetWindowThreadProcessID(thehwnd, @ProcessId);

  ProcessHandle  := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

  Pos := 0;

  ReadProcessMemory(ProcessHandle, Pos, @NewString, 3, 1);

  //...

  CloseHandle(ProcessHandle);

end;


Soe sieht der Code bis jetzt aus. ich bekomme immer den Fehler:
[Error] Unit1.pas(38): Types of actual and formal var parameters must be identical

Kannst du mir vielleicht nochmal helfen? :DD

DANKE
Gespeichert

EgoFelix
Lemy
Hero Member
*****
Offline Offline

Beiträge: 605



« Antworten #3 am: 07.05.2002, 18:59:46 »

Bei
ReadProcessMemory(ProcessHandle, Pos, @NewString, 3, 1);
velangt der compiler eine VAR als 5. parameter, dies kann keine Konstante sein sondern muss ein Cardinal sein.

Also:
Var
  NumRead: Cardinal;
begin
{...}
ReadProcessMemory(ProcessHandle, Pos, @NewString, 3, NumRead);
{...}
end;
Gespeichert
EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #4 am: 07.05.2002, 20:35:08 »

Danke Lemy!!!!!!!

So Leute! Ich habs jetzt! Für alle die es interessiert, hier ist der Code!
Viel Spass damit! (Dieses Beispiel liest den aktuellen Titel von Winamp aus)

Code:
function FindWindowByTitle(WindowTitle: string): Hwnd;

var

  NextHandle: Hwnd;

  NextTitle: array[0..260] of char;

begin

  // Get the first window

  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);

  while NextHandle > 0 do

  begin

    // retrieve its text

    GetWindowText(NextHandle, NextTitle, 255);

    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then

    begin

      Result := NextHandle;

      Exit;

    end

    else

      // Get the next window

      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);

  end;

  Result := 0;

end;



function ReadFromMemtoString(HandleName: String; Position: Pointer): String;

var

  thehwnd : THandle;

  ProcessHandle: THandle;

  ProcessId : DWORD; // Prozess ID

  NewString : array [0..255] of char;

  Pos: Pointer;

  NumRead: Cardinal;

begin

  thehwnd := FindWindowByTitle('Winamp');

  if thehwnd = 0 then ShowMessage('Kein Handle');



try

  GetWindowThreadProcessID(thehwnd, @ProcessId);

  ProcessHandle  := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

  Pos := Position;

  ReadProcessMemory(ProcessHandle, Pos, @NewString, SizeOf(NewString), NumRead);

  except

  CloseHandle(ProcessHandle);

  end;

  if thehwnd <> 0 then CloseHandle(ProcessHandle);

  Result := NewString;

end;



procedure TForm1.Button1Click(Sender: TObject);

begin

  Label1.Caption := ReadfrommemtoString('Winamp',Pointer($120B74)) + ' - ' + ReadfrommemtoString('Winamp',Pointer($120B80));

end;


Die Pointer Addressen sind einfach mit WinHex herauszufinden!
Gespeichert

EgoFelix
BRAiNCrusher
Jr. Member
**
Offline Offline

Beiträge: 74



WWW
« Antworten #5 am: 08.05.2002, 16:16:27 »

bei mit funzt der Code nicht. Nutze Winamp 2.80. Das einzige was ich sehe ist dann "-" und mehr leider nicht.
Gespeichert

EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #6 am: 08.05.2002, 16:33:33 »

Code:

function ReadFromMemory(HandleName: String; Position: Pointer): String;

var

  thehwnd : THandle;

  ProcessHandle: THandle;

  ProcessId : DWORD; // Prozess ID

  NewString : array [0..255] of char;

  Pos: Pointer;

  NumRead: Cardinal;

begin

  thehwnd := FindWindowByTitle(HandleName);

  if thehwnd = 0 then ShowMessage('No Handle')

  else begin



try

  GetWindowThreadProcessID(thehwnd, @ProcessId);

  ProcessHandle  := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);

  Pos := Position;

  NumRead := 1;

  ReadProcessMemory(ProcessHandle, Pos, @NewString, SizeOf(NewString), NumRead);

  except

  CloseHandle(ProcessHandle);

  end;

  if thehwnd <> 0 then CloseHandle(ProcessHandle);

  Result := NewString;

  end;

end;



procedure TForm1.Button1Click(Sender: TObject);

begin

  Label1.Caption := ReadFromMemory('Winamp',Pointer($12AFB0));

end;


Hier ist ein verbesserter Code! (Übrigends, du musst auch nen Lied laufen haben... :P)

EgoFelix
Gespeichert

EgoFelix
BRAiNCrusher
Jr. Member
**
Offline Offline

Beiträge: 74



WWW
« Antworten #7 am: 10.05.2002, 12:19:02 »

Versuch mal lieber folgenden Code..der ist kleiner und funzt bei mir richtig...bei deinem Code musste ich Winamp für jeden neuen Titel den ich abspielte neustarten, damit das Programm den Titel wieder aus dem Speicher auslesen konnte. Und es wurde mir immer nur ein Teil des Titels angezeigt. Mag vielleicht auch ein bischen daran liegen, dass ich Windows XP nutze. Mit dem Code hier unten funzt es bei mir ohne das ich Winamp neustarten muss und es ist weniger Quellcode.

PS: dieser Code funzt mit Winamp Version 1.x bis 2.x ;)

[font  size=2 face="Courier New" color="#000000"]procedure TForm1.Button2Click(Sender: TObject);
var hwndWinamp : THandle;
    this_title: array [0..2048] of char;
    s: string;
    i: integer;
begin
hwndWinamp := FindWindow('Winamp v1.x', nil);
GetWindowText(hwndWinamp,this_title,sizeof(this_title));
s := '';
for i := 0 to 2048 do
  begin
  
s := s+this_title;
  end;
s := Copy(s,1,Pos('- Winamp',s)-2);
label1.caption := s;
end;
[/font]
Gespeichert

EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #8 am: 10.05.2002, 13:19:05 »

Ja stimmt schon, aber das ist nicht das Thema...
Da wird ja nur der Titel von Winamp ausgelsen, bei meinem Code wird es aus der Memory geholt! Das ist ein riesen Unterschied, und außerdem war das mit dem Titel nur ein Beispiel! Ich kann z.B. auch dein ICQ-Passwort oder sonstiges damit auslesen! Einfach alles was ich will!
Gespeichert

EgoFelix
BRAiNCrusher
Jr. Member
**
Offline Offline

Beiträge: 74



WWW
« Antworten #9 am: 10.05.2002, 13:58:21 »

Dann möchte ich mich mit dir noch mal kurz schliessen, weil ich das Thema sehr interesant finde =). Vielleicht könnten wir ja eMailkontak halten. Vor allem würde mich mal interesieren, wie ich halt den Speicheranfang und Speicherende bekomme, damit ich in diesem Berreich nach Werten zu suchen. Vor allem bei Spielen finde ich das manchmal lustig, wenn man da mit Trainern die Werte einfrieren lassen kann. Wäre nett, wenn du mir da noch mal auf die Sprünge helfen könntest.
Gespeichert

EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #10 am: 10.05.2002, 15:16:26 »

Ja genau!
Das ist alles damit Möglich!
Am besten, du schickst mir einfach ne mail, oder schreibst per ICQ (ICQ ist immer besser)!

Einfach Fragen! :D
Gespeichert

EgoFelix
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS