![]() |
Prozess Dumpen
Hi,
ich habe mir Heute mal Gedanken gemacht wie ich einen Prozess dumpen koennte. Dann bin ich zu diesem Ergebniss gekommen :
Delphi-Quellcode:
Das ganze funktioniert soweit auch gut, nur wenn ich ToAddress auf $00461FFF oder groeßer setzte gibts ne AV.
aob: array of byte;
FromAddress, ToAddress, CalcAddress: integer; ... FromAddress := $00400000; ToAddress := $00400100 CalcAddress := FromAddress; while FromAddress < ToAddress do begin setlength(aob, high(aob) + 2); aob[FromAddress - CalcAddress] := pByte(FromAddress)^; inc(FromAddress, 1); end; Wieso gibts diese AV? Und was kann ich dagegen tun? |
Re: Prozess Dumpen
|
Re: Prozess Dumpen
Zitat:
ab $00400000 beginnt standardmäßig das Abbild deiner EXE im Speicher und irgendwann ist die Datei zuende ... und weil oftmals nicht direkt dahinter noch ein weiterer Speicherblock reserviert ist, greifst du demnach auf nicht vorhandenen Speicher zu und daß ergibt 'ne EV ^^ Also entweder gucken wie groß deine EXE ist und dann Startposition+Dateigröße-1=letztes verfügbares Byte in dem Block, Oder Startposition des Abbilds ermitteln und mit diesem Pointer Abfragen wie groß der Reservierte Block ist ... dann ist die Startposition+diese Größe-1 ebenfalls das letzte verfügbare Byte dieses Blocks. |
Re: Prozess Dumpen
Die Adresse ist da nicht mehr lesbar. Um was ordentliches dagegen zu tun sollte man sich damit auskennen. Ich hab schon öfter für dich mal was gecoded, aber irgendwie sind das die Grundlagen und du kennst sie immer noch nicht.
VirtualQuery, PE-Header, Virtuelle Adressen, VirtualProtect, Pages usw. solltest dir mal anschauen |
Re: Prozess Dumpen
Danke an alle, jetzt gehts.
Zitat:
|
Re: Prozess Dumpen
Aber an Grundlagen fehlt es dennoch etwas ;)
Delphi-Quellcode:
entspricht
setlength(aob, high(aob) + 2);
setlength(aob, (length(aob) - 1) + 2); HIGH ruft LENGTH auf und zieht (bei len>0 ?? oder prüft es garnicht ... bin mir gerade nicht ganz sicher) eins ab.
Delphi-Quellcode:
ich hoffe es geht jetzt nicht zu schnell:
setlength(aob, length(aob) + 1);
Delphi-Quellcode:
while FromAddress < ToAddress do
begin setlength(aob, length(aob) + 1); aob[high(aob)] := pByte(FromAddress)^; inc(FromAddress, 1); end;
Delphi-Quellcode:
while FromAddress < ToAddress do
begin i := length(aob) setlength(aob, i + 1); aob[i] := pByte(FromAddress)^; inc(FromAddress, 1); end;
Delphi-Quellcode:
for i2 := FromAddress to ToAddress - 1 do
begin i := length(aob) setlength(aob, i + 1); aob[i] := pByte(i2)^; end;
Delphi-Quellcode:
setlength(aob, ToAddress - FromAddress - 1);
for i := 0 to high(aob) do aob[i] := pByte(i + FromAddress)^;
Delphi-Quellcode:
1. weißt du, wie oft SETLENGTH aufgerufen wird? (für jedes Byte der Datei einmal ... nicht gerade effizient.
setlength(aob, ToAddress - FromAddress - 1);
CopyMem(FromAddress^, aob[0], length(aob); 2. und warum jedes byte einzeln auslesen? (Integer, statt byte järe ja schon effizienter gewesen, vorallem weil es den bus/die register besser ausnutzt ... oder halt gleich alles auf einmal) selbst wenn du jedes Byte einzeln auslesen willst ... SETLENGTH hättest du dennoch vorher setzten können. Du weißt doch schließlich schon vorher wie groß es werden wird. (ToAddress - FromAddress - 1); 3. aber warum willst du deine eigene EXE kopieren (notfalls ließ es doch direkt aus der Datei, da fängt der Inhalt immer bei null an und der Anfang muß nicht erst gesucht werden) 4. laß ich jetzt lieber :angel2: 5. außerdem klingt ToAddress irgendwie falsch, denn nach deinem AusgangsCode ist es nicht das letzte Byte, welches gelesen wird, sondern das Byte danach. |
Re: Prozess Dumpen
Hmm, das sind fuer mich aber keine "Grundlagen" mehr ;b
Ich habe es jetzt so:
Delphi-Quellcode:
Und was soll ich sagen, es ist viel schneller danke :thumb: .
setlength(aob, ToAddress - FromAddress + 1);
CopyMemory(@aob[0],pointer(FromAddress), length(aob)); ciao |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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