![]() |
Problem mit ProcessMemory
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 :) |
Re: Problem mit ProcessMemory
Du könntest mit virtualquery durch den Addressraum durchmarschieren.
Edit: ![]() Abgeändert auf deine Sache:
Delphi-Quellcode:
Für einen anderen Process müsste man sicherlich virtualqueryEx nehmen.
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; |
Re: Problem mit ProcessMemory
Delphi-Quellcode:
Auf dem Handle liegt der richtige ProcessHandle. Aber dieser Algorithmus gibt trotzdem nichts zurück :(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; ... |
Re: Problem mit ProcessMemory
Delphi-Quellcode:
Funktioniert bei mir super.
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; |
Re: Problem mit ProcessMemory
Mh naja gut ich bekomm ein bisschen was zurück:
Code:
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 :(
10000200001200001210001300001400001500002500002600002700002900002E000033000034000034
10003460003470003500003600003700003800003900003A00003B00003C00003D00003E00003F000040 00004010005730005740005BA0005C00006800006900007A0000AA0000CA0000CF0000D30000D40000D5 0000D60000D70000D71000D7E000D82000D85000D90000DA0000EE0000EF0000F00000F10000FA000010 2000010000000100010001000D000100110001001400043F6000043F6100043F9B00043F9C00043F9D00 0441E0000441E10004427C0004427F00044284000590B0000590B1000590B4000590B50005AD700005AD 710005ADA10005ADA2000719B0000719B1000719E7000719E8000719E900071A0000071A0100071A0500 071A0600071A1000071A1100071A2400071A2500072F7000072F7100072F9100072F9200072F93000732 50000732510007325200073253000746A0000746A1000746E3000746E500074DB000074DB100074E1000 074E11000752500007525100075278000752790007633000076331000763460007634700076350000763 5100076381000763820007638500076EE000076EE100076F0100076F0200076F0400076F1000076F2000 076F2100076F4100076F4200076F4900076F7000076F7100076F7500076F76000770F0000770F1000771 710007717200077174000773A0000773A10007743200077433000774B0000774B1000775D6000775D800 0775DD00077BD000077BD100077BD500077BD600077BE000077BE100077C2D00077C2F00077C3000077C 3100077C3400077DA000077DA100077E1600077E1700077E1B00077E5000077E5100077EDA00077EDB00 077EF000077EF100077F3300077F3400077F4000077F4100077FAD00077FAE0007C8000007C8010007C8 020007C8030007C8830007C8840007C8870007C8890007C9100007C9110007C98C0007C98F0007C99100 07E3600007E3610007E3C00007E3C10007E3C20007E6700007E6710007E86F0007E87F0007E8850007E8 8C0007EEA00007F6F00007FFB00007FFDA0007FFDF0007FFE0000 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] |
Re: Problem mit ProcessMemory
Zitat:
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:
|
Re: Problem mit ProcessMemory
Es gibt die Unit TLHelp32 in Delphi. Damit solltest du dich mal befassen!
Die Funktionen sind auch bei ![]() 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... |
Re: Problem mit ProcessMemory
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:
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:
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;
Code:
Verzweiflung ist nahe :(
[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]
|
Re: Problem mit ProcessMemory
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:
Wie könnte man das schneller bekommen?
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; |
Re: Problem mit ProcessMemory
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 :kotz: aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz