AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit ProcessMemory

Ein Thema von Lord Shadow · begonnen am 20. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Lord Shadow

Registriert seit: 10. Okt 2007
15 Beiträge
 
#1

Problem mit ProcessMemory

  Alt 20. Feb 2008, 22:51
Guten Tag,

Also ich beschäftige mich zurzeit mit dem Auslesen von dem Prozess Speicher von Anwendungen. Das Prinzip habe ich verstanden und auch erfolgreich umgesetzt. Ich kann nun bestimmte Bereiche von Programmen auslesen. Ich habe aber folgende Probleme. Da ich nicht von Offset $000000 bis in die Milliarden gehen möchte da es einfach zu lange dauert möchte ich irgendwie Erfahren wo das Programm nun wirklich seinen Speicher abläd. Da in diesen Offset Berreichen teilweise sehr große Lücken herschen die einfach Leer sind möchte ich irgendwie Erfahren wo genau nun der Speicher zu finden ist. Ich habe hierbei ein Programm was die gesuchten Daten dynamisch abspeichert und somit sind keine festen Offset Berreiche angebbar. Aber ich weiß von Tools wie ArtMoney das es ja möglich sein muss wirklich nur die wichtigen Daten zu erfassen.

Könnt ihr mir vllt. Helfen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 08:24
Du könntest mit virtualquery durch den Addressraum durchmarschieren.

Edit: Hier hatte ich mal etwas geschrieben.
Abgeändert auf deine Sache:
Delphi-Quellcode:
function getType(Typ:cardinal):string;
begin
  case typ of
    MEM_Image:result:='Image';
    MEM_Private:result:='Private';
    MEM_Mapped:result:='Mapped';
    else result:='';
  end;
end;

procedure TForm1.getmemInfo;
var mbi:memory_basic_information;
    si:system_info;
    pos:cardinal;
begin
  getsysteminfo(si);
  pos:=cardinal(si.lpMinimumApplicationAddress);
  while pos<cardinal(si.lpMaximumApplicationAddress) do begin
    virtualquery(pointer(pos),mbi,sizeof(mbi));
    if ((mbi.State and mem_commit)>0) then
      memo1.Lines.Add(inttohex(integer(mbi.BaseAddress),8)+
                ' Größe: '+inttostr(mbi.RegionSize)+
                ' Type: '+gettype(mbi.type_9));
    inc(pos,mbi.regionsize);
  end;
end;
Für einen anderen Process müsste man sicherlich virtualqueryEx nehmen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Lord Shadow

Registriert seit: 10. Okt 2007
15 Beiträge
 
#3

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 12:40
Delphi-Quellcode:
  

function BufferToString (Byt : Integer) : String;
begin
if (((Byt>31) and (Byt<127))) then result:=CHR(Byt)
else result:='';
end;


...
  getsysteminfo(si);
  Count:=cardinal(si.lpMinimumApplicationAddress);
  while Count<cardinal(si.lpMaximumApplicationAddress) do begin
    virtualqueryex(XHwnd,pointer(Count),mbi,sizeof(mbi));
    if ((mbi.State and mem_commit)>0) then
      Content:=Content+ToString(integer(mbi.BaseAddress));
    inc(Count,mbi.regionsize);
  end;
...
Auf dem Handle liegt der richtige ProcessHandle. Aber dieser Algorithmus gibt trotzdem nichts zurück
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 13:33
Delphi-Quellcode:
function getType(Typ:cardinal):string;
begin
  case typ of
    MEM_Image:result:='Image';
    MEM_Private:result:='Private';
    MEM_Mapped:result:='Mapped';
    else result:='';
  end;
end;

procedure TForm1.getmemInfo(hProcess:Thandle);
var mbi:memory_basic_information;
    si:system_info;
    pos:cardinal;
begin
  getsysteminfo(si);
  pos:=cardinal(si.lpMinimumApplicationAddress);
  while pos<cardinal(si.lpMaximumApplicationAddress) do begin
    virtualqueryEx(HProcess,pointer(pos),mbi,sizeof(mbi));
    if ((mbi.State and mem_commit)>0) then
      memo1.Lines.Add(inttohex(integer(mbi.BaseAddress),8)+
                ' Größe: '+inttostr(mbi.RegionSize)+
                ' Type: '+gettype(mbi.type_9));
    inc(pos,mbi.regionsize);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var wnd:hwnd;
    pid:cardinal;
    hProcess:THandle;
begin
  wnd:=$209E8; //Notepad (aus WinSpector)
  getwindowthreadprocessid(wnd,pid);
  memo1.lines.add(inttohex(pid,8));
  hProcess:=openprocess(Process_ALL_Access,false,pid);
  getmeminfo(hprocess);
  closehandle(hProcess);
end;
Funktioniert bei mir super.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Lord Shadow

Registriert seit: 10. Okt 2007
15 Beiträge
 
#5

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 16:39
Mh naja gut ich bekomm ein bisschen was zurück:

Code:
10000200001200001210001300001400001500002500002600002700002900002E000033000034000034
10003460003470003500003600003700003800003900003A00003B00003C00003D00003E00003F000040
00004010005730005740005BA0005C00006800006900007A0000AA0000CA0000CF0000D30000D40000D5
0000D60000D70000D71000D7E000D82000D85000D90000DA0000EE0000EF0000F00000F10000FA000010
2000010000000100010001000D000100110001001400043F6000043F6100043F9B00043F9C00043F9D00
0441E0000441E10004427C0004427F00044284000590B0000590B1000590B4000590B50005AD700005AD
710005ADA10005ADA2000719B0000719B1000719E7000719E8000719E900071A0000071A0100071A0500
071A0600071A1000071A1100071A2400071A2500072F7000072F7100072F9100072F9200072F93000732
50000732510007325200073253000746A0000746A1000746E3000746E500074DB000074DB100074E1000
074E11000752500007525100075278000752790007633000076331000763460007634700076350000763
5100076381000763820007638500076EE000076EE100076F0100076F0200076F0400076F1000076F2000
076F2100076F4100076F4200076F4900076F7000076F7100076F7500076F76000770F0000770F1000771
710007717200077174000773A0000773A10007743200077433000774B0000774B1000775D6000775D800
0775DD00077BD000077BD100077BD500077BD600077BE000077BE100077C2D00077C2F00077C3000077C
3100077C3400077DA000077DA100077E1600077E1700077E1B00077E5000077E5100077EDA00077EDB00
077EF000077EF100077F3300077F3400077F4000077F4100077FAD00077FAE0007C8000007C8010007C8
020007C8030007C8830007C8840007C8870007C8890007C9100007C9110007C98C0007C98F0007C99100
07E3600007E3610007E3C00007E3C10007E3C20007E6700007E6710007E86F0007E87F0007E8850007E8
8C0007EEA00007F6F00007FFB00007FFDA0007FFDF0007FFE0000
Aber 1. ist das viel zuwenig für den gesamten Prozessspeicher meines Zielprozesses und 2. bekomm ich aus diesem Code keine Stringtypische Zeichen herraus. In dem Prozess sind Links drinne wenn ich die per ReadProcessMemory raushole geht das nur das ich wie gesagt das Problem der Begrenzung der Offsetberreiche habe. Deine Methode liefert mir aber leider nur das oben wieder

Achso und was ich noch nie gesehen habe das du in einer Procedure einen Wert benutzt der in einer anderen Procedure deklariert ist ohne Parameter o_O also ich muste den per Parameter übergeben weil dies nicht bei mir funktionierte.

[edit=Matze]Absätze in den Code eingefügt, da der IE die Seite sonst fehlerhaft darstellt. MfG, Matze[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 16:52
Zitat von Lord Shadow:
Aber
1. ist das viel zuwenig für den gesamten Prozessspeicher meines Zielprozesses und
2. bekomm ich aus diesem Code keine Stringtypische Zeichen herraus. In dem Prozess sind Links drinne wenn ich die per ReadProcessMemory raushole geht das nur das ich wie gesagt das Problem der Begrenzung der Offsetberreiche habe. Deine Methode liefert mir aber leider nur das oben wieder
Wie baust du denn den String zusammen? bzw., was erwartest du?
Ich bekomme in einem Memo alle benutzten Adressen des Processes mit Anfangsadresse und Größe der Seite. Die Funktion liefert nicht, den Inhalt des Speichers zurück, sondern nur: wo was steht.

Zitat von Lord Shadow:
Achso und was ich noch nie gesehen habe das du in einer Procedure einen Wert benutzt der in einer anderen Procedure deklariert ist ohne Parameter o_O also ich muste den per Parameter übergeben weil dies nicht bei mir funktionierte.
Ooops, geändert (war ja in der Deklaration der Klasse enthalten )
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
elliott

Registriert seit: 3. Apr 2006
17 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 17:45
Es gibt die Unit TLHelp32 in Delphi. Damit solltest du dich mal befassen!
Die Funktionen sind auch bei MSDN ganz gut erklärt.
Mit den Heap32... Funktionen erhälst du alle Informationen über die Speicherbelegung des Zielprogramms.
Anfangs ist der Aufbau der "Listen" vielleicht etwas schwer zu verstehen, aber wenn man es einmal kapiert hat...
  Mit Zitat antworten Zitat
Lord Shadow

Registriert seit: 10. Okt 2007
15 Beiträge
 
#8

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 18:23
Ok Sirius danke Das habe ich leider nicht gecheckt Ich werde das Programm jetzt nochmal umbaun und die zurückgelieferten Addressen verwenden

Ok ich hab jetzt ein paar Stunden dran gesessen. Das auslesen geht an sich. Mein Linkfilter funktioniert eigentlich auch wunderbar. aber was der mir da an Speicher zurückliefert ist Katastrophal. Die Links sind total durcheinander und abgehackt. Irgendwas kann da noch net funzen ^^

Delphi-Quellcode:
function IntToString (Byt : Array of Byte) : String;
var i : integer;
    res : string;
begin
for i:=0 to high(Byt) do if (((Integer(Byt[i])>31) and (Integer(Byt[i])<127))) then res:=res+CHR(Integer(Byt[i]))
else res:='';
result:=res;
end;

...

function GetLinks (text : string):TStringList;
var List : TStringList;
    x,y,i : integer;
    rest,tmp : string;
begin
List:=TStringList.Create;
while pos('http://xxx.com/xxx',text)>0 do
 begin
  x:=pos('http://xxx.com/xxx',text);
  y:=pos('.rar',text);
  tmp:='';
  for i:=x to y+3 do tmp:=tmp+text[i];
  rest:=text;
  text:='';
  for i:=y+2 to length(rest) do text:=text+rest[i];
  List.Add(tmp);
 end;
result:=List;
end;

...

procedure TForm1.getmemInfo(HHwnd : Hwnd);
var mbi:memory_basic_information;
    si:system_info;
    pos:cardinal;
begin
  getsysteminfo(si);
  pos:=cardinal(si.lpMinimumApplicationAddress);
  while pos<cardinal(si.lpMaximumApplicationAddress) do begin
    virtualqueryEx(HHwnd,pointer(pos),mbi,sizeof(mbi));
    if ((mbi.State and mem_commit)>0) then
    begin
      setlength(Address,high(Address)+2);
      Address[high(Address)].Offset:=Integer(mbi.BaseAddress);
      Address[high(Address)].Size:=mbi.RegionSize;
    end;
    inc(pos,mbi.regionsize);
  end;
end;

...

GetWindowThreadProcessId(XHwnd,@RSDProID);
XHwnd:=OpenProcess(Process_All_Access,False,RSDProID);
getmeminfo(XHwnd);
for x:=0 to high(Address) do
 begin
  Application.ProcessMessages;
  Count:=Address[x].Offset;
  while Count<(Address[x].Offset+Address[x].Size) do
   begin
    ReadProcessMemory(XHwnd,Pointer(Count),@Buffer,100,rread);
    Content:=content+IntToString(Buffer);
    Inc(Count,100);
   end;
 end;
Links.AddStrings(getLinks(Content));
Memo1.Lines.Clear;
Memo1.Lines.Text:=Links.Text;
Das erste ist die Umwandel funktion hierbei betrachte ich nur bytes welche bestimmten ASCII Codes entsprechen damit ich ordentlichen Text filtere. Das 3. ist mein Linkfilter der auf die Endung .rar anspricht. Das 3. ist deine getMem Funktion so das sie mir die Werte die ich brauch in ein Array speichert. Das 4. ist dann die Auslese Funktion die eigentlich den Gesamten Speicher in den Offsetberreichen ausliest. Raus kommt aber wie gesagt abgehacktes zeug so wie:

Code:
[url]http://xxx.com/xxx/pts.dvd1.part01http://rhttp://xxx.com/xxxhttp://xxx.cohttp://xxx.com/xxx/pts.dvd1.pahttphttp://xxx.com/xxhttp://xhttp://xxx.com/xxx/pts.dvdhttp://xxx.com/files/http://xxx.com/xxx/pts.dvd1.part19.rar[/url]
Verzweiflung ist nahe
  Mit Zitat antworten Zitat
Lord Shadow

Registriert seit: 10. Okt 2007
15 Beiträge
 
#9

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 21:33
Ok der Alrotihmus müste nun funktionieren mir ist klar warum so ein Salat ruaskam.

Aber die Geschwindigkeit läst sehr zu wünschen übrig -.-

Code:
for x:=100 to high(Address) do
 begin
  StatusBar1.Panels[0].Text:='Offset: '+IntToHex(Address[x].Offset,8);
  StatusBar1.Panels[1].Text:='Scanning '+IntToStr(x)+' from '+IntToStr(high(Address))+' Offsets     ';
  Application.ProcessMessages;
  Count:=Address[x].Offset;
  z:=100 - ((Address[x].Offset+Address[x].Size) mod 100);
  while Count<=(Address[x].Offset+Address[x].Size) do
   begin
    ReadProcessMemory(RSDHwnd,Pointer(Count),@Buffer,100,rread);
    Content:=content+IntToString(Buffer);
    Inc(Count,100);
   end;
  delete(content,length(Content)-z,z);
 end;
Wie könnte man das schneller bekommen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Problem mit ProcessMemory

  Alt 21. Feb 2008, 21:39
Eigentlich gar nicht. Das sind ja ne Menge Daten.

Im übrigen solltest du vielleicht auch auf Type_9 achten. Manche Bereiche (oberhalb $70000000) kamen mir verdächtig nach Windows vor.
Ich würde mal probeweise alles was Mem_Mapped ist rauslassen.

Edit:
PS: Bitte mache mal keine leerzeichenfreien Zeilen. Der IE bricht die nicht um und der ganze Thread sieht zum aus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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