Autor Beitrag
Maric
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 28.10.10 20:14 
Es hat für mich keinen praktischen nutzen, jedoch möchte ich mit einem Zeiger der auf das allererste Offset $00000001 zeigt und inkrementiert wird, den gesamten Arbeitspeicher zu einem Zeitpunkt auslesen. Einfach interessehalber.
Wie schalte ich den Zugriffsschutz ab, der kommt, wenn ich auf fremden Arbeitsspeicher zugreife? Jetzt sagt nicht das geht nicht ich weiß das es nicht schön ist, aber unter FreePascal ging das auch.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 28.10.2010 um 23:26
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Do 28.10.10 20:22 
Dürfte tatsächlich nicht so einfach gehen, da Windows kontrolliert, wo du zugreifen willst. Und dort, wo du nun mal keinen Zugriff drauf hast, hast du keinen Zugrif...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.10.10 20:38 
user profile iconMaric hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt sagt nicht das geht nicht ich weiß das es nicht schön ist, aber unter FreePascal ging das auch.
Du kannst mit den entsprechenden Rechten auch auf manche Speicherbereiche zugreifen, die sonst nicht erreichbar sind.

Ab Windows 2000/XP geht das aber in jedem Fall nicht so wie du das jetzt möchtest. Die Zeit, in der man einfach so auf einen gemeinsamen Speicherbereich zugreifen konnte, ist schon lange vorbei.

Was es gibt sind Funktionen wie ReadProcessMemory. Da brauchst du natürlich die Rechte zum Zugriff auf die entsprechenden Prozesse.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 28.10.10 21:20 
Je nachdem, WELCHEN Speicher du lesen möchtest, gibt es verschiedene Möglichkeiten.

Eigener Arbeitsspeicher: Rechte mit VirtualQuery abfragen und nur Bereiche mit Leserechten wirklich verarbeiten

Fremde Prozesse: Fremden Prozess öffnen, alloziierte Bereiche mit VirtualQueryEx abfragen und mit ReadProcessMemory lesen.

Physikalischer Speicher: Admin-Rechte (oder Debugging Privilege) vorausgesetzt Zugriff auf die korrekte Device-File mit nem normalen TFileStream und Daten lesen. Oder direkt über die WinAPI den Dateizugriff realisieren.

Ansonsten gilt, was die anderen bereits schrieben: GANZ so trivial, wie unter W32-Kerneln und DOS ist es schon lange nicht mehr.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Maric Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 29.10.10 12:56 
Ich will den gesamten Arbeitsspeicher haben.

Ich glaube ich schreibe ein FreePascal Programm, was Schritt für Schritt den Arbeitsspeicher in eine Datei schreibt und wenn es am ende angekommen ist abstürzt. Dann lese ich die Datei mit Delphi ein... mal gucken was sich tut und
danke euch
-Maric

____
Edit:
hmm am ende meines Programmes scheinen folgende Wörter zu stehen
Coeade CetEet CetFlA CetTra DltCiiaScin Etrrtcleto EiPoes EiTra FeLbay GtC GtomnLnA usw usf
klingen und lesen tun sie sich wie variablen oder internes gezeug, allerdings habe ich jeden einzeln in google eingegeben und dazu kam nichts. Was könnten diese ...Wörter sein?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 29.10.10 14:18 
Wenn es mit deinem Code dort klappt, kannst du das oft 1:1 in Delphi kompilieren. Oder zumindest mit wenigen Änderungen... Wie sieht dein Code denn aus? Hast du einmal versucht den mit Delphi zu kompilieren?
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 29.10.10 15:14 
user profile iconMaric hat folgendes geschrieben Zum zitierten Posting springen:
Ich will den gesamten Arbeitsspeicher haben.
Du kommst nicht an alle Speicheradressen unter Windows 7 heran. Installiere mal folgendes Tool, dann siehst Du es: technet.microsoft.co...ff700229(en-us).aspx
Die einzige Möglichkeit (ohne sich jetzt mal auf Treiberebene herumzuplagen), die ich sehe, ist mit extremer Vorsicht zu genießen:
1. Totalen RAM-Dump in den Systemeinstellungen aktivieren und dann
2. Dein Windows zum Crashen bringen.
Danach kannst Du den Dump auswerten. Keine Ahnung, ob dann auch wirklich alle Speicheradressen dabei sind.
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Fr 29.10.10 17:13 
Mich würde der Freepascal Code auch interessieren...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 29.10.10 21:56 
Ich wünsch übrigens auf nem 64-Bit-System EXTREM viel Spaß beim Dumpen des Speichers ;-)

Ansonsten hab ich aber für Delphi bereits oben alles genannt. Müsste man nur noch kurz in Code gießen und schon hätte man was.

Kann ich aber derzeit mangels IDE und gestartetem Windows schlecht machen ;-)

P.S.: Um Windows zu crashen gibt's nen Shortcut. ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Maric Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 29.10.10 22:13 
Der FreepascalCode greift auch nur auf seinen eigenen Speicher zu, das was ich damals beobachtet habe, war uninitalisierter Speicher, in dem noch Namen aus einem anderen Programm standen. Ich hab kein 64 sondern ein gutes altes 32 bit system. XP um genau zu sein. Und Abstürzen lassen würde ich es ungern, ich habe seit 4 Jahren keinen Bluescreen. Never touch a running system.

Den Code habe ich nicht gespeichert, allerdings war er etwas in der art:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
[...]
var c:pointer;
    i:integer;
[...]
c := pointer([Adresse die im Programmspeicher liegt, zB i oder durch probieren rausfinden]);
repeat
inc(c);
write(chr(integer(c^)));
If integer(c^) > 32 then delay(50);
until keypressed;
end.


irgendwie so.

Moderiert von user profile iconMartok: Delphi-Tags eingefügt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 30.10.10 23:32 
Jetzt mal so grob aus'm Kopf (hab grad kein Delphi hier unter Linux verfügbar):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
var
    P: Pointer;
    MBI: TMemoryBasicInformation;
    FS: TFileStream; //KEINEN TMemoryStream nehmen ;-)
begin
    FS := TFileStream.Create('memdump.img', fmcreate or fmShareDenyWrite);
    try

    P := nil;
    repeat
        // Get the memory information
        if not VirtualQuery(P, MBI, sizeof(MBI)) then
            break;

        // Check if we got what we asked for
        if P <> MBI.BaseAddress then
            break;

        // Check if memory is readable
        // $EE = bitwise all of all access flags with read access
        if MBI.Protection and $EE = 0 then
            break;

        // Actually write the memory dump
        FS.Write(MBI.BaseAddress, MBI.RegionSize);

        // Jump to next memory region
        Inc(P, MBI.RegionSize);
    until P = nil;

    finally
        FreeAndNil(FS);
    end;
end;


Wie gesagt: Ungetestet, aber sollte tun für 32 Bit (eigener Prozess). Für Fremde Prozesse muss für den Zielprozess passend ein 32-Bit- bzw. 64-Bit-MemoryBasicInformation-Block verwendet werden. Auch ändert sich der Aufruf von VirtualQuery zu VirtualQueryEx. Aber das findet man auch in der MSDN-API-Doku.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.