2009-08-18 15 views
5

Mam problem ze znalezieniem rozsądnego sposobu na zrzucenie pamięci innego procesu do pliku.Jak utworzyć zrzut binarny/szesnastkowy pamięci innego procesu?

Po długich poszukiwaniach udało mi się znaleźć w CodeProject fajny artykuł, który ma * najbardziej * potrzebną funkcjonalność: Performing a hex dump of another process's memory. To dobrze rozwiązuje problemy z uprawnieniami i stanowi dobrą podstawę.

Jednak dzięki temu narzędziu zauważyłem, że nawet niewielki proces, na przykład czysty Notepad.exe lub Calc.exe, może wygenerować plik zrzutu o rozmiarze większym niż 24 MB, podczas gdy sam proces działa pod 20 KB w pamięć według TaskManager.

Artykuł doprowadził mnie do przekonania, że ​​być może jest to również zrzucanie rzeczy we wspólnej pamięci, prawdopodobnie w przestrzeni DLL i tym podobnych. Na przykład zrzut calc.exe będzie zawierać sekcje, które zawierają nazwy metod (i przypuszczalnie pamięci) z Kernel32.dll:

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

Czy istnieje lepszy sposób do zrzutu pamięci innego procesu, który nie robi doprowadzić do tego narzutów, a może poprawić kod połączonego artykułu, który rozwiązuje ten problem? Chcę uzyskać pamięć, która faktycznie należy do samego procesu. Byłbym w porządku z wyrzucaniem przestrzeni pamięciowej funkcji, które są faktycznie używane w bibliotekach DLL, ale wydaje się zbędne zrzucanie * całej * zawartości wielu bibliotek DLL, aby uzyskać działającą pamięć procesu.

Szukam sposobu na uzyskanie 30-60 KB procesu 30 KB, a nie 25 MB w procesie 30 KB. Lub przynajmniej bliżej, niż mogę uzyskać obecnie.

Z góry dziękujemy za sugestie i wskazówki, które są mile widziane.

Uwaga: Jest to narzędzie konsoli, więc elementy GUI, takie jak te w artykule CodeProject, są nieistotne.

Odpowiedz

3

Zasadniczo prosisz o minizrzek użytkownika. Biblioteka programu Debug Helper dla Windows ma gotową do tego funkcję, MiniDumpWriteDump.

Istnieje gruba kontrola ilości szczegółów zawartych w mini zrzutach z parametru MINIDUMP_TYPE przekazywanego do funkcji. Najbardziej podstawowy, MiniDumpNormal, przechwyci tylko stos wywołań każdego wątku w procesie. Ilość pamięci staje się stopniowo bardziej szczegółowa wraz z innymi typami mini-zrzutów.

Możesz także precyzyjnie kontrolować ilość informacji, które mają być zapisane w mini-zrzut, zapewniając wywołanie zwrotne do funkcji MiniDumpWriteDump, a w zestawie zwrotnym ustawić flagi na strukturze MINIDUMP_CALLBACK_OUTPUT.

Wyniki mini-zrzutów mogą być read z debuggerem takim jak Windbg lub Visual Studio, lub mogą być przetwarzane przez bibliotekę various functions in the dbghelp.dll.

1

Naprawdę nie „jak go zaprogramować” odpowiedź, ale ja po prostu znaleźć swoje pytanie, patrząc na narzędzie, które mogłyby to zrobić, kiedy wpadłem na PMDump:

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

To banalnie proste i proste w użyciu, i tworzy poprawne zrzuty (po prostu wypróbowałem to z niektórymi programami).

+0

Dzięki za link. Po prostu chciałbym, aby link zawierał źródło = ( – KevenK

+0

Cóż, może mógłbyś skontaktować się z autorem .. Większość ludzi piszących freeware chętnie pomoże i współpracować, jeśli uzna twój program za użyteczny. –

Powiązane problemy