2009-08-18 9 views
5

Ich habe Probleme, eine sinnvolle Möglichkeit zu finden, den Speicher eines anderen Prozesses in eine Datei zu schreiben.Wie erstellt man einen Binär-/Hex-Speicherauszugsspeicher eines anderen Prozesses?

Nach umfangreichen Suche, ich habe in der Lage gewesen, einen schönen Artikel auf Codeproject zu finden, die meisten * der Funktionalität * hat ich will: Performing a hex dump of another process's memory. Dies macht einen guten Job Berechtigungsprobleme anzugehen und stellt eine gute Grundlage.

Allerdings habe ich gesehen, dass selbst ein kleiner Prozess, wie eine saubere Notepad.exe oder Calc.exe-Instanz, eine Dump-Datei über 24 MB Größe generieren kann, während der Prozess selbst unter 20 KB in ausgeführt wird Speicher nach TaskManager.

Der Artikel hat mich dazu gebracht zu glauben, dass es vielleicht auch Dinge in Shared Memory, möglicherweise DLL-Raum und dergleichen. Zum Beispiel wird ein Dump von Calc.exe umfassen Abschnitte, die Methodennamen enthalten (und vermutlich Speicher) von Kernel32.dll:

²³´µKERNEL32.dll ActivateActCtx AddAtomA AddAtomW AddConsoleAliasA AddConsoleAliasW AddLocalAlternateComputerNameA AddLocalAlternateComputerNameW AddRefActCtx AddVectoredExceptionHandler AllocConsole AllocateUserPhysicalPages AreFileApisANSI AssignProcessToJobObject AttachConsole BackupRead BackupSeek BackupWrite BaseCheckAppcompatCache BaseCleanupAppcompatCache 

Gibt es einen besseren Weg, um die Erinnerung an einen anderen Prozess zu entleeren, die doesn führt dies nicht zu einem Mehraufwand oder vielleicht zu einer Verbesserung des Codes des verknüpften Artikels, der dieses Problem löst? Ich möchte die Erinnerung bekommen, die eigentlich zum Prozess selbst gehört. Ich wäre damit einverstanden, den Speicherplatz von Funktionen zu verschwenden, die tatsächlich in DLLs verwendet werden, aber es scheint unnötig zu sein, den * gesamten * Inhalt mehrerer DLLs auszugeben, um den laufenden Speicher des Prozesses zu erhalten.

Ich bin auf der Suche nach einer Möglichkeit, die 30-60KB eines 30KB-Prozesses zu erhalten, anstatt 25MB für einen 30KB-Prozess. Oder zumindest näher, als ich momentan bekommen kann.

Vielen Dank im Voraus für Ihre Anregungen und Anleitungen, es wird geschätzt.

Hinweis: Dies ist für ein Konsolendienstprogramm, daher sind GUI-Elemente wie die im CodeProject-Artikel unwichtig.

Antwort

3

Sie fragen im Grunde nach einem Benutzerprozess Minidump. Die Windows Debug Helper-Bibliothek verfügt über eine bereitgestellte Funktion für dieses MiniDumpWriteDump.

Es gibt eine grobe Kontrolle über die Menge der im Minidump enthaltenen Details aus dem MINIDUMP_TYPE Parameter, der an die Funktion übergeben wurde. Das einfachste, MiniDumpNormal, erfasst nur den Aufruf-Stack jedes Threads im Prozess. Die Speichermenge wird mit den anderen Mini-Dump-Typen immer detaillierter.

Sie können auch die Menge der in den Minidump zu schreibenden Informationen feineinstellen, indem Sie einen Rückruf an die MiniDumpWriteDump-Funktion senden und im Callback die Flags auf der Struktur MINIDUMP_CALLBACK_OUTPUT setzen. Die resultierenden Minidumps können read mit einem Debugger wie Windbg oder Visual Studio sein, oder sie können von der various functions in the dbghelp.dll-Bibliothek verarbeitet werden.

1

Nicht wirklich eine „wie es zu programmieren“ Antwort, aber ich habe gerade Ihre Frage, während für ein Werkzeug suchen, der das tun könnte, wenn ich in PMDump lief:

http://ntsecurity.nu/toolbox/pmdump/

es einfach ist tot und einfach zu bedienen, und erstellt korrekte Dumps (Ich habe es gerade mit einigen Programmen versucht).

+0

Danke für den Link. Ich wünschte nur, der Link enthalten Quelle = ( – KevenK

+0

Nun, vielleicht könnten Sie den Autor kontaktieren. Die meisten Leute, die Freeware schreiben, sind bereit zu helfen und zu kooperieren, wenn Sie ihr Programm nützlich finden. –

Verwandte Themen