Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozess Dumpen (https://www.delphipraxis.net/70681-prozess-dumpen.html)

_rEdoX 2. Jun 2006 16:11


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:
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;
Das ganze funktioniert soweit auch gut, nur wenn ich ToAddress auf $00461FFF oder groeßer setzte gibts ne AV.

Wieso gibts diese AV? Und was kann ich dagegen tun?

NicoDE 2. Jun 2006 16:34

Re: Prozess Dumpen
 
MSDN-Library durchsuchenVirtualQuery

himitsu 2. Jun 2006 16:38

Re: Prozess Dumpen
 
Zitat:

Zitat von _rEdoX
Wieso gibts diese AV? Und was kann ich dagegen tun?

Weil vielleicht dein Programm nicht größer ist? :zwinker:

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.

brechi 2. Jun 2006 16:38

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

_rEdoX 2. Jun 2006 17:18

Re: Prozess Dumpen
 
Danke an alle, jetzt gehts.

Zitat:

aber irgendwie sind das die Grundlagen und du kennst sie immer noch nicht.
Das Probelm ist das ich gerade nicht drauf gekommen bin ...

himitsu 2. Jun 2006 17:45

Re: Prozess Dumpen
 
Aber an Grundlagen fehlt es dennoch etwas ;)

Delphi-Quellcode:
setlength(aob, high(aob) + 2);
entspricht
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:
setlength(aob, length(aob) + 1);
ich hoffe es geht jetzt nicht zu schnell:
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:
setlength(aob, ToAddress - FromAddress - 1);
CopyMem(FromAddress^, aob[0], length(aob);
1. weißt du, wie oft SETLENGTH aufgerufen wird? (für jedes Byte der Datei einmal ... nicht gerade effizient.

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.

_rEdoX 2. Jun 2006 19:25

Re: Prozess Dumpen
 
Hmm, das sind fuer mich aber keine "Grundlagen" mehr ;b

Ich habe es jetzt so:

Delphi-Quellcode:
setlength(aob, ToAddress - FromAddress + 1);
CopyMemory(@aob[0],pointer(FromAddress), length(aob));
Und was soll ich sagen, es ist viel schneller danke :thumb: .

ciao


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