pTrace System Call in c

pTrace System Call in c
La chiamata di sistema pTrace () viene generalmente utilizzata per il debug di breakpoint e le chiamate di sistema di tracciamento. La chiamata di sistema "Trace di processo" pTrace () viene spesso utilizzata per scopi di debug. È il modo principale in cui i debugger nativi tengono traccia. Le tracce possono essere messe in pausa, i registri e la memoria possono essere ispezionati e impostati, le chiamate di sistema possono essere monitorate e anche le chiamate di sistema possono essere intercettate utilizzando PTRACE System Call. Il Tracee deve prima essere collegato al tracciante. In un processo multithread, ogni thread può essere attaccato separatamente a un tracciante forse distinto o lasciato non attaccato e quindi non debotto. Di conseguenza, "Tracee" si riferisce sempre a "un processo potenzialmente multithread, mai o forse multithread.

Tutti i segnali forniti al processo tracciato, ad eccezione di uno, lo fanno arrestare, indipendentemente dall'elaborazione del segnale registrato e consegnano un evento verso il processo di tracciamento, che può essere identificato utilizzando la funzione di sistema Wait (). Il segnale Sigkill è un'eccezione, in quanto viene consegnato all'istante e realizza il comportamento previsto. Non c'è mai stato uno standard per la chiamata di sistema PTrace. La sua interfaccia è comparabile tra i sistemi operativi, in particolare in termini di funzionalità essenziali, ma differisce leggermente da un sistema all'altro.

Le chiamate di sistema possono essere rintracciate utilizzando l'edizione Linux di PTRACE. La richiesta di PTrace Syscall riavvia il processo figlio allo stesso modo di PTRACE Cont, ma si organizza per interrompere la voce di chiamata di sistema successiva o uscita. Questo provoca molte nuove opportunità. Per le richieste di PTRACE Peek, pTrace () restituirà i dati desiderati; restituirà zero per tutte le altre richieste. Tutte le richieste che non riescono a restituire -1, con errno impostata sul valore ottimale. Nel caso delle richieste di PTRACE Peek, -1 può essere un valore di rendimento legittimo; Il programma è responsabile di determinare se si tratta di una situazione di errore o di un valore di restituzione valido. Questa guida ti spiegherà la funzionalità del sistema PTrace () Chiama in un linguaggio C con un esempio.

Esempio per comprendere pTrace () Sistema Chiama in lingua C

Per comprendere la chiamata di sistema pTrace () in lingua C, usiamo Ubuntu 20.04 Sistema Linux per implementare il suo esempio. Il compilatore GCC è già stato installato nel nostro sistema per l'esecuzione del codice. È possibile installarlo utilizzando l'istruzione sotto citazione nella shell del terminale di Ubuntu 20.04 Sistema Linux.

$ sudo APT Installa GCC

Ora, iniziamo con il nostro esempio. Crea un file con uno dei nomi desiderati con il .C Estensione nel terminale usando l'istruzione Nano. È possibile creare direttamente il file andando a qualsiasi directory home o utilizzando anche il comando "tocco". Lo scopo di utilizzare l'istruzione Nano è di aprire direttamente l'editor GNU sul terminale. Ora esegui l'istruzione sotto citazione nella shell del terminale di Ubuntu 20.04 Sistema Linux.

$ nano q.C

Gnu Nano 4.8 apparirà sullo schermo. Ora scrivi il codice visualizzato nell'immagine sotto collegata.

Nel codice sopra attaccato, abbiamo utilizzato alcune librerie standard. PTrace Traceme specifica che il genitore di questo processo dovrebbe essere in grado di rintracciarlo. Se il suo genitore non si aspetta di rintracciarlo, un processo non dovrebbe inviare questa richiesta. Il PID, ADDR e i dati non sono riservati. Il Tracee è l'unico che usa la chiamata PTrace Traceme; Il tracciante utilizza solo le altre richieste. Il processo dei genitori fa il processo di un bambino e lo monitora nello scenario sopra. Il sottoprocesso esegue la funzione PTRACE con PTrace Traceme come primo parametro prima di invocare la funzione Exec, che informa il kernel: il processo figlio controlla quindi il processo genitore dopo aver chiamato Execve ().

Il processo genitore stava usando la funzione wait () per attendere gli avvisi del kernel e ora che è stato avvisato, può osservare ciò che i processi figlio hanno fatto, come l'ispezione dei valori del registro. Il kernel salva le interi funzionalità del registro "EAX", che afferra il numero di chiamate di sistema ogni volta che si verifica la chiamata di sistema. Ptrace Peekuser Leggi una parola dalla sezione utente di Tracee, che contiene i registri del processo e altri dati (SYS/User.H>). Come conseguenza della chiamata pTrace (), la stringa viene restituita. L'offset deve di solito essere allineato alle parole, sebbene ciò possa variare a seconda dell'architettura.

PTrace Cont riprende il processo di tracee se è stato interrotto. Se i dati non sono zero, sono intesi come il numero di segnali da inviare al Tracee; Quindi, non vengono inviati segnali. Il tracciante, ad esempio, può regolare se viene trasmesso un segnale inviato al Tracee. La compilazione e l'esecuzione possono essere eseguite eseguendo le istruzioni sotto citazione nella shell del terminale di Ubuntu 20.04 Sistema Linux.

$ GCC Q.C
$ ./UN.fuori

L'output riuscito è stato mostrato nell'immagine sopra attaccata.

Conclusione

La chiamata di sistema PTrace () è stata ampiamente utilizzata nel linguaggio di programmazione C, ma può identificare e modificare un programma in esecuzione; La funzione pTrace può sembrare strana. I debugger e i sistemi chiamate tracker impiegano comunemente questa tecnica. Alla fine dell'utente, consente ai programmatori di fare cose più interessanti. Questo articolo ha fornito la comprensione e l'implementazione di base della chiamata di sistema PTrace (). Il codice di esempio può essere modificato se necessario/