| Autor |
Beitrag |
Maric
Hält's aus hier
Beiträge: 8
|
Verfasst: 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 Narses: Topic aus Sonstiges (Delphi) verschoben am Do 28.10.2010 um 23:26
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 28.10.10 20:38
Maric hat folgendes geschrieben : | | 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Fr 29.10.10 15:14
Maric hat folgendes geschrieben : | | 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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:
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 Martok: Delphi-Tags eingefügt
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 30.10.10 23:32
Jetzt mal so grob aus'm Kopf (hab grad kein Delphi hier unter Linux verfügbar):
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; begin FS := TFileStream.Create('memdump.img', fmcreate or fmShareDenyWrite); try
P := nil; repeat if not VirtualQuery(P, MBI, sizeof(MBI)) then break;
if P <> MBI.BaseAddress then break;
if MBI.Protection and $EE = 0 then break;
FS.Write(MBI.BaseAddress, MBI.RegionSize);
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.
|
|
|