NFsec Logo

CryoPID – Zamrażanie pojedynczych procesów

04/07/2009 w Debug Brak komentarzy.  (artykuł nr 88, ilość słów: 529)

W

iększość z nas jest zaznajomiona z możliwościami typowego laptopa pod względem hibernacji. W tym trybie cała zawartość pamięci RAM zostaje zapisana na dysk naszej maszyny, a ona sama wyłączana. Przy ponownym uruchomieniu system jest odtwarzany dokładnie do tego samego stanu, przed którym został uśpiony, z wszystkimi programami, które były uruchomiony w taki sposób w jaki działały dotychczas.

A, co jeśli byśmy posiadali taką możliwość na poziomie pojedynczych procesów? Byśmy mogli zamrozić dowolny proces / aplikację, która jest odpalona na naszym komputerze oraz zrobić jej kopię w dowolnym momencie jej działania oraz przywrócić ją nawet po ponownym uruchomieniu systemu do dokładnie takiego samego stanu, w jakim została zamrożona.

Istnieje mały program dla Linuksa umożliwiający taki zabieg – nazywa się CryoPID. Nie potrzebuje on żadnych modyfikacji ze strony jądra systemu w dodatku działa z powodzeniem w trybie zwykłego użytkownika, tak więc nie musimy posiadać praw administratora by zamrażać procesy. Wystarczy odpalić program na procesie, którego jesteśmy właścicielem. Oczywiście zaczniemy od kompilacji samego programu:

tar -zxvf cryopid.tar.gz
cd cryopid/src/
make
cd ..
testers/
make

By zademonstrować jego działanie, wystarczy z katalogu testers/ w jednej konsoli odpalić programik o nazwie mypids – podający, co jakiś czas identyfikator swojego procesu. W drugiej konsoli odpalić sam programik freeze ze składnią, na końcu której będzie wcześniej wspomniany PID programu mypids:

freeze /tmp/zamrozony_mypids 3535

Po czym powinniśmy otrzymać komunikat podobny do tego:

[+] Terminal device appears to be 136:3

Map: 08048000-08049000 r-xp 00000000 03:02 2331341    /root/testers/mypidis
Map: 08049000-0804a000 rw-p 00000000 03:02 2331341    /root/testers/mypidis
Map: b7dbb000-b7dbc000 rw-p b7dbb000 00:00 0          (null)
[+] Found scribble zone: 0xb7dbb000
Map: b7dbc000-b7f02000 r-xp 00000000 03:02 1362614    /lib/libc-2.7.so
[+] Found a syscall location at 0xb7ddbf7a
Map: b7f02000-b7f03000 r--p 00146000 03:02 1362614    /lib/libc-2.7.so
Map: b7f03000-b7f05000 rw-p 00147000 03:02 1362614    /lib/libc-2.7.so
Map: b7f05000-b7f09000 rw-p b7f05000 00:00 0          (null)
Map: b7f16000-b7f17000 rw-p b7f16000 00:00 0          (null)
Map: b7f17000-b7f33000 r-xp 00000000 03:02 1363807    /lib/ld-2.7.so
Map: b7f33000-b7f35000 rw-p 0001b000 03:02 1363807    /lib/ld-2.7.so
Map: bfaac000-bfac1000 rw-p bffeb000 00:00 0          [stack]
     Ignoring map - vsyscall page.
     Error parsing map: ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

Saved console chunk (0).
Saved console chunk (1).
Saved console chunk (2).
[+] Process is probably in syscall. Returning EINTR.
Heap was at 0x12b00. Want to be at 0xb7dbb000. offset = 0xb7da8500
Compressed 138751 bytes into 10940 bytes (93% compression)
Written image.

Co powinno skutkować zapisaniem stanu procesu 3535 do samo rozpakowującego, skompresowanego pliku o nazwie /tmp/zamrozony_mypids. Teraz możemy z powodzeniem wykonać ponowny rozruch systemu, a następnie odtworzyć nasz zamrożony proces poprzez jego zwyczajne odpalenie:

$ /tmp/zamrozony_mypids

Po wydaniu tej komendy nasz proces zostanie odtworzony, dolinkowany do poprzednio załadowanych bibliotek oraz przypisany odpowiednim deskryptorom plików, które otworzył. Podczas pracy z różnymi aplikacjami sieciowymi oraz tymi pracującymi pod systemem X, możemy napotkać na błędy w otwieraniu poprzednich soketów połączeń. Dlatego należy podchodzić do programu, który jest jeszcze w fazie eksperymentalnej z pewnym dystansem, ale rozwiązanie to wydaje się obiecującym scenariuszem w świecie programów konsolowych.

Więcej informacji: CryoPID

Kategorie K a t e g o r i e : Debug

Tagi T a g i : , , ,

Komentowanie tego wpisu jest zablokowane.