PTRACE SYSTEM CALL IN C

PTRACE SYSTEM CALL IN C
PTRACE () System wywołujący jest zwykle używane do debugowania punktów przerwania i śledzenia wywołań systemowych. Systemowe połączenie systemu „Process Trace” jest często używane do celów debugowania. Jest to główny sposób, w jaki rodzime debuggery śledzą. Ślady mogą być wstrzymane, rejestry i pamięć mogą być sprawdzane i ustawione, połączenia systemowe mogą być monitorowane, a nawet połączenia systemowe można przechwycić za pomocą połączenia systemowego PTRACE. Tracee musi być najpierw podłączony do znacznika. W procesie wielociepowym każda wątek może być osobno przymocowany do ewentualnie wyraźnego znacznika lub pozostawić bez przywiązania, a zatem niezadowolony. W rezultacie „Tracee” zawsze odnosi się do „potencjalnie wielowątkowego procesu, nigdy lub może wielostronnego procesu.

Wszystkie sygnały dostarczone do prześledzonego procesu, z wyjątkiem jednego, powodują, że zatrzyma się, niezależnie od zarejestrowanego przetwarzania sygnału i dostarczają zdarzenie w kierunku procesu śledzenia, które można zidentyfikować za pomocą funkcji systemowej Wait (). Sygnał Sigkill jest wyjątkiem, ponieważ jest dostarczany natychmiast i wykonuje oczekiwane zachowanie. Nigdy nie było standardu dla połączenia systemowego PTRACE. Jego interfejs jest porównywalny w systemach operacyjnych, w szczególności pod względem podstawowej funkcjonalności, ale różni się nieznacznie w zależności od systemu do drugiego.

Połączenia systemowe można prześledzić za pomocą edycji Linux PTRACE. Żądanie Ptrace Syscall ponownie uruchamia proces dziecka w taki sam sposób, jak Ptrace Cont, ale ułoży się, aby zatrzymał się przy następnym systemie wywoławczym lub wyjściu. To wywołuje wiele nowych możliwości. W przypadku żądań PTRACE PTRACE () zwróci żądane dane; Zwróci zero dla wszystkich pozostałych żądań. Wszystkie żądania, które nie upadają, zwracają -1, z Errno ustawionymi na wartość optymalną. W przypadku żądań PTRACE PEEK -1 może być uzasadnioną wartością zwrotną; Program jest odpowiedzialny za ustalenie, czy jest to sytuacja błędu, czy prawidłowa wartość zwrotna. Ten przewodnik wyjaśni Ci funkcjonalność wywołania systemu ptrace () w języku c za pomocą jednego przykładu.

Przykład do zrozumienia wywołania systemu ptrace () w języku c

Aby zrozumieć wywołanie systemu ptrace () w języku C, używamy Ubuntu 20.04 system Linux do zaimplementowania swojego przykładu. Kompilator GCC został już zainstalowany w naszym systemie do wykonywania kodu. Możesz go zainstalować za pomocą poniżej cytowanej instrukcji w końcowej powładzie Ubuntu 20.04 System Linux.

$ sudo apt instal gcc

Teraz zacznijmy od naszego przykładu. Utwórz plik z dowolnymi pożądanymi nazwami z .Rozszerzenie C w terminalu za pomocą instrukcji Nano. Możesz bezpośrednio utworzyć plik, przechodząc do dowolnego katalogu domowego lub używając również polecenia „dotyk”. Celem użycia instrukcji Nano jest bezpośrednio otwarcie edytora GNU na terminalu. Teraz wykonaj poniżej cytowaną instrukcję w terminalu powłoki Ubuntu 20.04 System Linux.

$ nano q.C

GNU Nano 4.8 pojawi się na ekranie. Teraz napisz kod wyświetlany na obrazie poniżej.

W powyższym kodzie wykorzystaliśmy standardowe biblioteki. PTRACE TRACEME określa, że ​​rodzic tego procesu powinien być w stanie go śledzić. Jeśli jego rodzic nie spodziewa się go śledzić, proces nie powinien po prostu przedstawić tego żądania. PID, ADDR i dane nie są rozważane. Tracee jest jedynym, który używa połączenia Traceme Ptrace; znacznik używa tylko innych żądań. Proces nadrzędny rozwija proces dziecka i monitoruje go w powyższym scenariuszu. Podproces uruchamia funkcję PTRACE z PTRACE TRACEME jako pierwszym parametrem przed wywołaniem funkcji EXEC, która informuje jądro: Proces dziecięcy następnie kontroluje proces nadrzędny po wywołaniu execve ().

Proces nadrzędny korzystał z funkcji Wait (), aby czekać na alerty jądra, a teraz, gdy została powiadomiona, może obserwować, co robią procesy dziecięce, takie jak kontrola wartości rejestru. Jądro zapisuje całe funkcje rejestru „EAX”, co chwyta liczbę wywołania systemu, gdy nastąpi połączenie systemowe. Ptrace Pekuuser Przeczytaj słowo z sekcji użytkownika Tracee, która zawiera rejestry procesu i inne dane (SYS/Użytkownik.h>). W wyniku wywołania ptrace () ciąg jest zwracany. Przesunięcie musi być zwykle wyrównane słowem, choć może to się różnić w zależności od architektury.

Ptrace cont wznawia proces Tracee, jeśli został zatrzymany. Jeśli dane nie są zerowe, jest to rozumiane jako liczba sygnałów, które należy wysłać do Tracee; Następnie nie wysyłają żadnych sygnałów. Na przykład znacznik może regulować, czy sygnał wysłany do tracee jest przesyłany. Kompilacja i wykonanie można wykonać poprzez wykonywanie poniżej cytowanych instrukcji w terminalu powłoki Ubuntu 20.04 System Linux.

$ gcc q.C
$ ./A.na zewnątrz

Udane wyjście zostały pokazane na wyżej wymienionym obrazie.

Wniosek

Wezwanie systemowe PTRACE () było szeroko stosowane w języku programowania C, ale może zidentyfikować i zmienić uruchomiony program; Funkcja Ptrace może wydawać się dziwna. Debuggery i systemy wywołują śledzenie powszechnie wykorzystują tę technikę. Na końcu użytkownika umożliwia programistom robienie ciekawszych rzeczy. W tym artykule przedstawiono podstawowe zrozumienie i wdrożenie połączenia systemowego Ptrace (). Przykładowy kod może zostać zmieniony w razie potrzeby/