AGB  ·  Datenschutz  ·  Impressum  







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

Prozess Dumpen

Ein Thema von _rEdoX · begonnen am 2. Jun 2006 · letzter Beitrag vom 2. Jun 2006
Antwort Antwort
_rEdoX

Registriert seit: 2. Jun 2006
Ort: Bochum
24 Beiträge
 
Delphi 7 Professional
 
#1

Prozess Dumpen

  Alt 2. Jun 2006, 16:11
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?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: Prozess Dumpen

  Alt 2. Jun 2006, 16:34
MSDN-Library durchsuchenVirtualQuery
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.151 Beiträge
 
Delphi 12 Athens
 
#3

Re: Prozess Dumpen

  Alt 2. Jun 2006, 16:38
Zitat von _rEdoX:
Wieso gibts diese AV? Und was kann ich dagegen tun?
Weil vielleicht dein Programm nicht größer ist?

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Prozess Dumpen

  Alt 2. Jun 2006, 16:38
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
  Mit Zitat antworten Zitat
_rEdoX

Registriert seit: 2. Jun 2006
Ort: Bochum
24 Beiträge
 
Delphi 7 Professional
 
#5

Re: Prozess Dumpen

  Alt 2. Jun 2006, 17:18
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.151 Beiträge
 
Delphi 12 Athens
 
#6

Re: Prozess Dumpen

  Alt 2. Jun 2006, 17:45
Aber an Grundlagen fehlt es dennoch etwas

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.


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

5. außerdem klingt ToAddress irgendwie falsch, denn nach deinem AusgangsCode ist es nicht das letzte Byte, welches gelesen wird, sondern das Byte danach.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
_rEdoX

Registriert seit: 2. Jun 2006
Ort: Bochum
24 Beiträge
 
Delphi 7 Professional
 
#7

Re: Prozess Dumpen

  Alt 2. Jun 2006, 19:25
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 .

ciao
  Mit Zitat antworten Zitat
Antwort Antwort


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 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