Llamada del sistema PTRACE en C

Llamada del sistema PTRACE en C
Ptrace () La llamada del sistema generalmente se usa para depurar puntos de interrupción y llamadas al sistema de rastreo. La llamada del sistema PTRACE () "PROCESO RATER" se usa con frecuencia para fines de depuración. Es la forma principal en que los depugadores nativos hacen un seguimiento. Se pueden pausar los trazas, se pueden inspeccionar y establecer la memoria, las llamadas del sistema se pueden monitorear e incluso las llamadas del sistema se pueden interceptar utilizando la llamada del sistema PTRACE. El tracee primero debe estar conectado al trazador. En un proceso múltiple, cada hilo se puede unir por separado a un marcador posiblemente distinto o dejar no unir y, por lo tanto, sin debilitar. Como resultado, "tracee" siempre se refiere a "un proceso potencialmente multiproceso, nunca o tal vez un proceso multiproceso.

Todas las señales proporcionadas al proceso rastreado, excepto uno, hacen que se detenga, independientemente del procesamiento de señal registrado, y entregue un evento hacia el proceso de rastreo, que puede identificarse utilizando la función de sistema Wait (). La señal Sigkill es una excepción, ya que se entrega al instante y logra el comportamiento esperado. Nunca ha habido un estándar para la llamada del sistema Ptrace. Su interfaz es comparable entre los sistemas operativos, especialmente en términos de funcionalidad esencial, pero difiere ligeramente de un sistema a otro.

Las llamadas del sistema se pueden rastrear utilizando la edición de Linux de Ptrace. La solicitud de syscall Ptrace reinicia el proceso infantil de la misma manera que lo hace Ptrace Cont, pero organiza que se detenga en la siguiente entrada o salida de llamadas del sistema. Esto plantea muchas oportunidades nuevas. Para las solicitudes de Ptrace Peek, Ptrace () devolverá los datos deseados; devolverá cero para todas las otras solicitudes. Todas las solicitudes que fallan retorno -1, con errno establecido en el valor óptimo. En el caso de las solicitudes de Ptrace Peek, -1 puede ser un valor de retorno legítimo; El programa es responsable de determinar si esta es una situación de error o un valor de retorno válido. Esta guía le explicará la funcionalidad de la llamada del sistema Ptrace () en el lenguaje C con un ejemplo.

Ejemplo para comprender la llamada del sistema Ptrace () en el lenguaje C

Para comprender la llamada del sistema Ptrace () en el idioma C, usamos Ubuntu 20.04 Sistema Linux para implementar su ejemplo. El compilador GCC ya se ha instalado en nuestro sistema para la ejecución del código. Puede instalarlo utilizando las instrucciones citadas a continuación en la carcasa terminal del Ubuntu 20.04 Sistema Linux.

$ sudo apt install gcc

Ahora, comencemos con nuestro ejemplo. Crear un archivo con cualquiera de sus nombres deseados con el .Extensión C en el terminal utilizando instrucción nano. Puede crear directamente el archivo yendo a cualquier directorio de inicio o usando el comando "toque" también. El propósito de usar la instrucción nano es abrir el editor GNU sobre el terminal directamente. Ahora ejecute la instrucción citada a continuación en la cubierta terminal del Ubuntu 20.04 Sistema Linux.

$ nano Q.C

GNU Nano 4.8 aparecerán en tu pantalla. Ahora escriba el código que se muestra en la imagen a continuación.

En el código atacado anteriormente, hemos utilizado algunas bibliotecas estándar. Ptrace Traceme especifica que el padre de este proceso debería poder rastrearlo. Si su padre no espera rastrearlo, un proceso simplemente no debe enviar esta solicitud. El PID, el ADRR y los datos no están reservados en cuenta. El Tracee es el único que usa la llamada Ptrace Traceme; El trazador solo usa las otras solicitudes. El proceso de los padres bifurca el proceso de un niño y lo monitorea en el escenario anterior. El subproceso ejecuta la función PTRACE con Ptrace Traceme como el primer parámetro antes de invocar la función EXEC, que informa al núcleo: el proceso infantil luego controla el proceso principal después de llamar a Execve ().

El proceso principal estaba utilizando la función Wait () para esperar alertas de kernel, y ahora que ha sido notificado, puede observar lo que los procesos infantiles han estado haciendo, como inspeccionar los valores de registro. El núcleo guarda las características completas del registro "EAX", que capta el número de llamadas del sistema cada vez que ocurre la llamada del sistema. Ptrace Peekuser lee una palabra de la sección de usuario de Tracee, que contiene los registros del proceso y otros datos (SYS/Usuario.H>). Como consecuencia de la llamada ptrace (), la cadena se devuelve. El desplazamiento generalmente debe estar alineado en las palabras, aunque esto puede variar según la arquitectura.

Ptrace Cont reanuda el proceso de tracee si se ha detenido. Si los datos no son cero, se entiende como el número de señales que se enviarán al tracee; Entonces, no se envían señales. El trazador, por ejemplo, puede regular si se transmite una señal enviada al traquee o no. La compilación y la ejecución se pueden realizar ejecutando las instrucciones citadas a continuación en la cubierta terminal del Ubuntu 20.04 Sistema Linux.

$ GCC Q.C
ps ./a.afuera

La salida exitosa se ha mostrado en la imagen atacada anteriormente.

Conclusión

La llamada del sistema PTRACE () se ha utilizado ampliamente en el lenguaje de programación C, pero puede identificar y cambiar un programa en ejecución; la función de la ptrace puede parecer rara. Los rastreadores de llamadas de depuradores y sistemas emplean comúnmente esta técnica. Al final del usuario, permite a los programadores hacer cosas más interesantes. Este artículo proporcionó la comprensión e implementación básica de la llamada del sistema Ptrace (). El código de ejemplo se puede enmendar si es necesario/