Nie jestem pewien, w jaki sposób zrzucasz całą pamięć do pliku, nie robiąc tego wielokrotnie (jeśli ktoś zna automatyczny sposób, aby zmusić gdb do zrobienia tego, daj mi znać), ale poniższe działania działają dla każdej partii pamięci, zakładając, że wiesz pid:
Niesamowite! Po prostu użyłem go, aby dowiedzieć się, który skrypt uruchomił tajemniczą instancję bash.
Tobia,
Dlaczego tylko szukacie i zrzucacie zakresy z rw-puprawnieniami?
mxmlnkn
@mxmlnkn To dane ( rw-p), pozostałe zakresy dotyczą kodu ( r-xp). Jeśli chcesz rzucić jedno i drugie, idź dalej i wymień grepna np cat.
A. Nilsson,
39
próbować
gcore $pid
gdzie $pidjest faktyczna liczba pid; Aby uzyskać więcej informacji zobacz:info gcore
zrzut może zająć trochę czasu, a część pamięci może nie być czytelna, ale jest wystarczająco dobra ... pamiętaj, że może tworzyć duże pliki, właśnie utworzyłem w ten sposób plik 2 GB ...
To nie wystarczy, odczyt innego procesu wymaga kombinacji / proc / <pid> / {mem, * map}, ptrace i pewnej obsługi sygnałów, aby uniknąć zawieszenia procesu docelowego.
Stworzyłem również własny program do zrzucania całej pamięci procesu, jest on w C, więc można go skompilować krzyżowo na Androida, czego potrzebowałem.
Możesz także podać adres IP i port TCP. Kod źródłowy tutaj .
Z tego, co rozumiem, idea czystszego zrzutu polega na tym, że tylko pliki w pamięci mają rozmiar dołączony do obszaru pamięci w przeciwieństwie do rzeczywistej pamięci aplikacji, która ma rozmiar 0 (ponieważ rozmiar faktycznie używany rozmiar jest nieznany przez OS).
mxmlnkn
Jednym ze problemów, które mam z tym skryptem, jest to, że rozmiar bloku 1 prowadzi do przepustowości niedopuszczalnie powolnej ~ 30kB / s w porównaniu do użycia rozmiaru bloku równego rozmiarowi strony (4096 dla mnie), dla którego dostaję ~ 100MB / s! Zobacz tutaj . getconf PAGESIZEsłuży do uzyskania rozmiaru strony, a następnie adresy i liczby są przez niego dzielone.
mxmlnkn
1
Narzędzie do zrzutu procesu na standardowe wyjście, pcat / memdump:
Ten jest przestarzały (usunięty na żądanie opiekuna); I tak zainstalowałem stary pakiet i nie powiódł się komunikat „Błąd wejścia / wyjścia; czy korzystałeś z GCC z plikami nagłówkowymi innego komputera?”.
Tobu,
0
Możesz teraz używać procdump z pakietu SysInternals w systemie Linux:
Jeśli chcesz zrzucić oddzielny segment pamięci uruchomionego procesu bez tworzenia ogromnego pliku podstawowego (powiedzmy z gcore), możesz użyć małego narzędzia z tego miejsca . W README znajduje się również jeden wiersz, jeśli chcesz zrzucić wszystkie czytelne segmenty do osobnych plików.
/proc/$pid/mem
.Odpowiedzi:
Nie jestem pewien, w jaki sposób zrzucasz całą pamięć do pliku, nie robiąc tego wielokrotnie (jeśli ktoś zna automatyczny sposób, aby zmusić gdb do zrobienia tego, daj mi znać), ale poniższe działania działają dla każdej partii pamięci, zakładając, że wiesz pid:
Będzie to miało format (przykład):
Wybierz jedną partię pamięci (na przykład 00621000-00622000), a następnie użyj gdb jako root, aby dołączyć do procesu i zrzucić tę pamięć:
Następnie przeanalizuj / root / wyjście za pomocą polecenia strings, mniej niż chcesz PuTTY na całym ekranie.
źródło
Stworzyłem skrypt, który wykonuje to zadanie.
Pomysł pochodzi z odpowiedzi Jamesa Lawrie i tego posta: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
umieść to w pliku (np. „dump-all-memory-of-pid.sh”) i uczyń go wykonywalnym
stosowanie:
./dump-all-memory-of-pid.sh [pid]
Dane wyjściowe są drukowane do plików o nazwach:
pid-startaddress-stopaddress.dump
Zależności:
gdb
źródło
rw-p
uprawnieniami?rw-p
), pozostałe zakresy dotyczą kodu (r-xp
). Jeśli chcesz rzucić jedno i drugie, idź dalej i wymieńgrep
na npcat
.próbować
gdzie
$pid
jest faktyczna liczba pid; Aby uzyskać więcej informacji zobacz:info gcore
zrzut może zająć trochę czasu, a część pamięci może nie być czytelna, ale jest wystarczająco dobra ... pamiętaj, że może tworzyć duże pliki, właśnie utworzyłem w ten sposób plik 2 GB ...
źródło
gcore
zrzut jest rzadki?man proc mówi:
Może to może ci pomóc
źródło
Stworzyłem również własny program do zrzucania całej pamięci procesu, jest on w C, więc można go skompilować krzyżowo na Androida, czego potrzebowałem.
Możesz także podać adres IP i port TCP. Kod źródłowy tutaj .
źródło
Rozwiązanie Pure Bash:
Zastosowanie: procdump PID
dla czystszego zrzutu:
źródło
getconf PAGESIZE
służy do uzyskania rozmiaru strony, a następnie adresy i liczby są przez niego dzielone.Narzędzie do zrzutu procesu na standardowe wyjście, pcat / memdump:
źródło
Możesz teraz używać procdump z pakietu SysInternals w systemie Linux:
https://github.com/Microsoft/ProcDump-for-Linux
źródło
Jeśli chcesz zrzucić oddzielny segment pamięci uruchomionego procesu bez tworzenia ogromnego pliku podstawowego (powiedzmy z gcore), możesz użyć małego narzędzia z tego miejsca . W README znajduje się również jeden wiersz, jeśli chcesz zrzucić wszystkie czytelne segmenty do osobnych plików.
źródło