40
  Kernel Hacking Conociendo al Kernel Linux

Kernel_Hacking - Conociendo Al Kernel Linux

Embed Size (px)

DESCRIPTION

7o Congreso Nacional de Software Libre. Venezuela

Citation preview

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 1/40

 

 

Kernel Hacking

Conociendo al KernelLinux

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 2/40

 

 

QUE VAMOS A CONOCER?

* Como compilar un Kernel Vanilla.* Que son las syscalls y como utilizarlas.* Que son los modulos y cuales son los tipos

de modulos.* Ejemplo basico de un modulo.* Registro y operaciones de un modulo.* Estructura del codigo fuente del kernel.

* Como compilar un Kernel Vanilla.* Que son las syscalls y como utilizarlas.* Que son los modulos y cuales son los tipos

de modulos.* Ejemplo basico de un modulo.* Registro y operaciones de un modulo.* Estructura del codigo fuente del kernel.

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 3/40

 

 

Conocimientos previos

* Comandos basicos de Linux.

* Lenguaje C, assembler inline.

* Arquitectura o componentes delcomputador.

* Comandos basicos de Linux.

* Lenguaje C, assembler inline.

* Arquitectura o componentes delcomputador.

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 4/40

 

CONCEPTOS BASICOS

Kernel o nucleoEl kernel de un sistema operativo, es un programaencargado de administrar los recursos de unsistema. Ejemplo: Administración de la memoria,administrador de discos, etc.

Kernel o nucleoEl kernel de un sistema operativo, es un programaencargado de administrar los recursos de unsistema. Ejemplo: Administración de la memoria,

administrador de discos, etc.

HackingConocer el funcionamiento interno de un sistema,en particular de computadoras y redesinformáticas.

HackingConocer el funcionamiento interno de un sistema,en particular de computadoras y redesinformáticas.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 5/40

 

CONCEPTOS BASICOS

Modo usuario (user mode): En modo usuario seprohibe el uso de ciertas instrucciones consideradasprivilegiadas. Un proceso de usuario no puede accedera los puertos de E/S ni capturar interrupciones.

Modo usuario (user mode): En modo usuario seprohibe el uso de ciertas instrucciones consideradasprivilegiadas. Un proceso de usuario no puede accedera los puertos de E/S ni capturar interrupciones.

Modo kernel (kernel mode): En modo kernel el CPUpermite la ejecución de todas las instrucciones

máquina, es posible acceder a todas las direccionesde memoria, programar los periféricos.

Modo kernel (kernel mode): En modo kernel el CPUpermite la ejecución de todas las instruccionesmáquina, es posible acceder a todas las direccionesde memoria, programar los periféricos.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 6/40

 

CONCEPTOS BASICOS

MODO USUARIO

MODO KERNEL

HARDWARE

ACCESORESTRINGIDO

ACCESOTOTAL

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 7/40

 

HERRAMIENTAS NECESARIAS

$ sudo apt-get install build-essential wget bzip2kernel-package libncurses-dev fakeroot

module-

init-tools

$ sudo apt-get install build-essential wget bzip2kernel-package libncurses-dev fakeroot

module-

init-tools$ wget -C http://www.kernel.org/pub/linux/kernel/

v2.6/linux-2.6.37.tar.bz2

$ wget -C http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.tar.bz2

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 8/40

 

RECOPILANDO INFORMACION

$ lspci -v -t

$ lsusb$ lsmod$ cat /proc/cpuinfo$ cat /proc/meminfo

$ cat /proc/partitions

$ lspci -v -t

$ lsusb$ lsmod$ cat /proc/cpuinfo$ cat /proc/meminfo

$ cat /proc/partitions

* Manual de la tarjeta madre. Abrir el gabinetedel PC y tomar nota de los componentes.* Manual de la tarjeta madre. Abrir el gabinetedel PC y tomar nota de los componentes.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 9/40

 

COMPILANDO EL KERNEL

# cp linux-2.6.37.tar.bz2 /usr/src/

# tar -xjf linux-2.6.37.tar.bz2

# cd /usr/src/linux-2.6.37

# cp /boot/config-$(uname -r) .config

# make menuconfig

# cp linux-2.6.37.tar.bz2 /usr/src/

# tar -xjf linux-2.6.37.tar.bz2

# cd /usr/src/linux-2.6.37

# cp /boot/config-$(uname -r) .config

# make menuconfig

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 10/40

 

COMPILANDO EL KERNEL

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 11/40

 

COMPILANDO EL KERNEL

Configurar el kernel para cargar y descargarmodulos

Configurar el kernel para cargar y descargarmodulos

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 12/40

 

COMPILANDO EL KERNEL

Guardamos las modificaciones realizadasGuardamos las modificaciones realizadas

Podemos seleccionar el archivo de configuracion para la

arquitectura x86 32 bits en arch/x86/configs/i386_defconfig

Podemos seleccionar el archivo de configuracion para laarquitectura x86 32 bits en arch/x86/configs/i386_defconfig

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 13/40

 

COMPILANDO EL KERNEL

# make-kpkg clean

# fakeroot make-kpkg –-initrdkernel_image

# dpkg -i linux-image-2.6.37_i386.deb

# make-kpkg clean

# fakeroot make-kpkg –-initrd

kernel_image

# dpkg -i linux-image-2.6.37_i386.deb

Puedes compilar la documentacion del kernel envarios formatos. Para mas informacion ejecuta el

comando make help.

Puedes compilar la documentacion del kernel envarios formatos. Para mas informacion ejecuta el

comando make help. 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 14/40

 

VERIFICANDO ERRORES

$ dmesg | grep "Err"

$ dmesg | grep "warning"

$ dmesg | grep "fail"

$ dmesg | grep "Err"

$ dmesg | grep "warning"

$ dmesg | grep "fail"

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 15/40

 

SOLUCION A ERRORES COMUNES

* Solucion: Agrega esta linea en include/linux/version.h

#define UTS_RELEASE “2.6.37”

* Error: The UTS Release version in include/linux/version.hdoes not match current version:

Este error se debe a que el archivo utsrelease.h hasido cambiado de lugar, ahora se encuentra eninclude/generated/utsrelease.h

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 16/40

 

SOLUCION A ERRORES COMUNES

* Solucion: Verificar que el sistema de archivos y el

controlador del disco duro se encuentren integrados en elkernel y no esten compilados como modulos.

* Error: Kernel Panic - not syncing: VFS: Unable to mountroot on fs unknown-block(0,0)

Se debe integrar el sistema de archivos y el controladordel disco duro en el kernel (no como modulo), debido aque una de las primeras tareas que hace el kernel esmontar el sistema de archivos “root” (que es “/”).

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 17/40

 

QUE SON LAS SYSCALLS?

* Es el metodo por el cualun proceso de usuariointeractua con el kernel.

* Las syscalls estan

definidas en arch/x86/include/asm/unistd_32.h(x86 32 bits), en laversion 2.6.37 hay 341syscalls definidas.

* Es el metodo por el cualun proceso de usuariointeractua con el kernel.

* Las syscalls estan

definidas en arch/x86/include/asm/unistd_32.h (x86 32 bits), en laversion 2.6.37 hay 341syscalls definidas.

El numero de syscalls definidas se encuentra en la

constante NR_syscalls en el fichero unistd_32.h

El numero de syscalls definidas se encuentra en laconstante NR_syscalls en el fichero unistd_32.h

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 18/40

 

Para ver las syscalls que utiliza un proceso

utiliza el comando strace.

Para ver las syscalls que utiliza un proceso

utiliza el comando strace.

QUE SON LAS SYSCALLS?

$ echo “Hola Mundo”$ strace echo “Hola Mundo”execve("/bin/echo", ["echo", "Hola Mundo"], [/* 39 vars */]) = 0. . .

 write(1, "Hola Mundo\n"..., 11Hola Mundo) = 11close(1) = 0munmap(0xb7556000, 4096) = 0close(2) = 0exit_group(0) = ?

$ echo “Hola Mundo”$ strace echo “Hola Mundo”execve("/bin/echo", ["echo", "Hola Mundo"], [/* 39 vars */]) = 0

. . . write(1, "Hola Mundo\n"..., 11Hola Mundo) = 11close(1) = 0munmap(0xb7556000, 4096) = 0close(2) = 0

exit_group(0) = ?

* Un comando puede ejecutar cientos de syscalls.* Un comando puede ejecutar cientos de syscalls.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 19/40

 

COMO LAS UTILIZO?

* Codigo C:* Codigo C:

#include <stdio.h> // libreria estandar#include <string.h> // funcion strlen()#include <unistd.h> // syscalls#include <sys/syscall.h> // funcion syscall()

int main(){const char *msg = "Hola mundo desde una syscall\n";ssize_t caracteres;printf("ID del usuario: %ld\n",syscall(__NR_getuid));

caracteres = write(1, msg, strlen(msg));return 0;}

#include <stdio.h> // libreria estandar#include <string.h> // funcion strlen()#include <unistd.h> // syscalls#include <sys/syscall.h> // funcion syscall()

int main(){const char *msg = "Hola mundo desde una syscall\n";ssize_t caracteres;printf("ID del usuario: %ld\n",syscall(__NR_getuid));caracteres = write(1, msg, strlen(msg));return 0;

}

El kernel devuelve un valor negativo en la variable global errnopara indicar un error. Los tipos de errores se encuentran en

include/asm-generic/errno-base.h e include/asm-generic/errno.h

El kernel devuelve un valor negativo en la variable global errnopara indicar un error. Los tipos de errores se encuentran en

include/asm-generic/errno-base.h e include/asm-generic/errno.h 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 20/40

 

COMO LAS UTILIZO?

* Se utiliza la funcion syscall(), tomando como argumento elnombre exacto definido en unistd_32.h:

printf("ID del usuario: %ld\n",syscall(__NR_getuid));

* Tambien se puede escribir directamente el nombre de la syscall(sin __NR_):

caracteres = write(1, msg, strlen(msg));

* Se utiliza la funcion syscall(), tomando como argumento elnombre exacto definido en unistd_32.h:

printf("ID del usuario: %ld\n",syscall(__NR_getuid));

* Tambien se puede escribir directamente el nombre de la syscall(sin __NR_ ):

caracteres = write(1, msg, strlen(msg));

Se puede utilizar la funcion perror() definida en stdio.h, paraobtener los mensajes de error. La variable global errno estadefinida en errno.h en la libreria estandar C.

Se puede utilizar la funcion perror() definida en stdio.h, paraobtener los mensajes de error. La variable global errno esta

definida en errno.h en la libreria estandar C. 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 21/40

 

COMO LAS UTILIZO?

* Asembler inline:* Asembler inline:

En los procesadores actuales, esta habilitado la instruccion SYSENTERpara ejecutar una syscall. Si la syscall recibe parametros, estos sedeben colocar en los registros %ebx, %ecx, %edx, %esi y %edi.

En los procesadores actuales, esta habilitado la instruccion SYSENTERpara ejecutar una syscall. Si la syscall recibe parametros, estos se

deben colocar en los registros %ebx, %ecx, %edx, %esi y %edi.

#include <stdio.h> // libreria estandar

int pid;int main() {

__asm__("movl $20, %eax \n" // numero de la syscall (20 getpid)"int $0x80 \n" // interrupcion 0x80, llama a la syscall"movl %eax, pid \n" // en eax queda el valor devuelto);

printf("El pid del proceso es: %d\n", pid);

return 0;}

#include <stdio.h> // libreria estandar

int pid;int main() {

__asm__(

"movl $20, %eax \n" // numero de la syscall (20 getpid)"int $0x80 \n" // interrupcion 0x80, llama a la syscall"movl %eax, pid \n" // en eax queda el valor devuelto);

printf("El pid del proceso es: %d\n", pid);

return 0;}

  

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 22/40

 

QUE SON LOS MODULOS?

* Son una via eficiente para agregar controladores,sistema de archivos y otros componentes sin tener quecompilar el kernel o reiniciar la maquina.

* Son una via eficiente para agregar controladores,sistema de archivos y otros componentes sin tener quecompilar el kernel o reiniciar la maquina.

modulo

(Lista doblemente enlazada del kernel)

FUNCIONES EXPORTADAS

(Lista doblemente enlazada del kernel)

FUNCIONES EXPORTADAS

insmodinsmod modulormmodrmmod

FUNCIONES EXPORTADASFUNCIONES EXPORTADAS

KERNELKERNEL

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 23/40

 

MANEJO DE MODULOS

# insmod mimodulo.ko // carga un modulo

# rmmod mimodulo.ko // descarga un modulo

# modinfo mimodulo.ko // muestra informacion sobre unmodulo

# modprobe // carga y descarga modulos junto con susdependencias

# lsmod // lista todos los modulos cargados

# insmod mimodulo.ko // carga un modulo

# rmmod mimodulo.ko // descarga un modulo

# modinfo mimodulo.ko // muestra informacion sobre unmodulo

# modprobe // carga y descarga modulos junto con susdependencias

# lsmod // lista todos los modulos cargados

Existe el comando depmod que se utiliza para definir un archivo

de dependencia de modulos.

Existe el comando depmod que se utiliza para definir un archivode dependencia de modulos.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 24/40

 

TIPOS DE MODULOS

Existen diferentes formas en los cuales el kernelintercambia informacion con el hardware, estas se puedenclasificar en:

Existen diferentes formas en los cuales el kernelintercambia informacion con el hardware, estas se puedenclasificar en:

* Character Device: Maneja los datos en flujos de

bytes.

* Character Device: Maneja los datos en flujos de

bytes.

KERNEL HARDWARE

1110010101011010100110100

1110010101011010100110100

Los dispositivos de caracter se denotan con la palabra “c”,

en /dev.

Los dispositivos de caracter se denotan con la palabra “c”,en /dev.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 25/40

 

TIPOS DE MODULOS

* Block Device: Maneja los datos en bloques de bytes.* Block Device: Maneja los datos en bloques de bytes.

KERNEL HARDWARE

010101010110110

010101010110110

010101010110110

010101010110110

010101010110110

010101010110110

Los dispositivos de bloque se denotan con la palabra “b”,

en /dev.

Los dispositivos de bloque se denotan con la palabra “b”,en /dev.

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 26/40

 

TIPOS DE MODULOS

# ls -l /dev

crw------- 1 root video 10, 175 2011-03-24 10:30agpgartcrw-rw---- 1 root audio 14, 4 2011-03-24 10:30 audio

. . . .brw-rw---- 1 root disk 8, 0 2011-03-24 06:00 sda

brw-rw---- 1 root disk 8, 1 2011-03-24 06:00 sda1

brw-rw---- 1 root disk 8, 2 2011-03-24 06:00 sda2

# ls -l /dev

crw------- 1 root video 10, 175 2011-03-24 10:30agpgartcrw-rw---- 1 root audio 14, 4 2011-03-24 10:30 audio

. . . .brw-rw---- 1 root disk 8, 0 2011-03-24 06:00 sda

brw-rw---- 1 root disk 8, 1 2011-03-24 06:00 sda1

brw-rw---- 1 root disk 8, 2 2011-03-24 06:00 sda2

Los dispositivos de caracter y bloque no son las unicas categoriasque administra el kernel. Las tarjetas de red ocupan una posicion

especial en el kernel.

Los dispositivos de caracter y bloque no son las unicas categoriasque administra el kernel. Las tarjetas de red ocupan una posicion

especial en el kernel. 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 27/40

 

IDENTIFICANDO LOS DISPOSITIVOS

MAJOR NUMBER: Se utiliza para identificar a un

dispositivoen general.

brw-rw---- 1 root disk 8, 0 2011-03-24 17:11 sdabrw-rw---- 1 root disk 8, 1 2011-03-24 17:11 sda1brw-rw---- 1 root disk 8, 2 2011-03-24 17:11 sda2

crw--w---- 1 root root 4, 0 2011-03-24 17:11 tty0crw------- 1 root root 4, 1 2011-03-24 21:41 tty1

brw-rw---- 1 root disk 8, 0 2011-03-24 17:11 sdabrw-rw---- 1 root disk 8, 1 2011-03-24 17:11 sda1brw-rw---- 1 root disk 8, 2 2011-03-24 17:11 sda2

crw--w---- 1 root root 4, 0 2011-03-24 17:11 tty0crw------- 1 root root 4, 1 2011-03-24 21:41 tty1

sda 

MajorNumber

MajorNumber

8 tty0

MajorNumber

MajorNumber

4

En Documentation/devices.txt puedes ver los nombres de los

dispositivos, sda se refiere a un dispositivo SCSI.

En Documentation/devices.txt puedes ver los nombres de losdispositivos, sda se refiere a un dispositivo SCSI.

  

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 28/40

 

IDENTIFICANDO LOS DISPOSITIVOS

MINOR NUMBER: Se utiliza para identificar los

subsistemas de un dispositivo.

brw-rw---- 1 root disk 8, 0 2011-03-24 17:11 sdabrw-rw---- 1 root disk 8, 1 2011-03-24 17:11 sda1

brw-rw---- 1 root disk 8, 2 2011-03-24 17:11 sda2crw--w---- 1 root root 4, 0 2011-03-24 17:11 tty0crw------- 1 root root 4, 1 2011-03-24 21:41 tty1

brw-rw---- 1 root disk 8, 0 2011-03-24 17:11 sdabrw-rw---- 1 root disk 8, 1 2011-03-24 17:11 sda1brw-rw---- 1 root disk 8, 2 2011-03-24 17:11 sda2crw--w---- 1 root root 4, 0 2011-03-24 17:11 tty0crw------- 1 root root 4, 1 2011-03-24 21:41 tty1

tty0

MinorNumber

MinorNumber

0

MinorNumber

MinorNumber

tty1 1

sda  0

sda1 1

sda2 2

Para obtener el Major y Minor number se utilizan las macrosMAJOR(dev_t dev) y MINOR(dev_t dev), definidas en

include/linux/kdev_t.h.

Para obtener el Major y Minor number se utilizan las macrosMAJOR(dev_t dev) y MINOR(dev_t dev), definidas en

include/linux/kdev_t.h. 

S C O O

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 29/40

 

ESTRUCTURA DE UN MODULO

#include <linux/init.h> // macros para el inicio y salida de modulos#include <linux/module.h> // necesario para modulos

MODULE_LICENSE("Dual BSD/GPL"); // tipo de licenciaMODULE_AUTHOR("z3r0d4y"); // author del moduloMODULE_DESCRIPTION("Modulo de prueba"); // descripcionMODULE_VERSION("Version 1.0"); // version del modulo

// funcion de entradaint hola_mundo() {

printk(KERN_INFO "Hola Mundo desde un Modulo Linux\n");return 0;

}// funcion de salida

void adios_mundo() {printk(KERN_INFO "Adios Mundo desde un modulo Linux\n");

}

module_init(hola_mundo); // definimos cual es la funcion de entradamodule_exit(adios_mundo); // definimos cual es la funcion de salida

#include <linux/init.h> // macros para el inicio y salida de modulos#include <linux/module.h> // necesario para modulos

MODULE_LICENSE("Dual BSD/GPL"); // tipo de licenciaMODULE_AUTHOR("z3r0d4y"); // author del moduloMODULE_DESCRIPTION("Modulo de prueba"); // descripcionMODULE_VERSION("Version 1.0"); // version del modulo

// funcion de entradaint hola_mundo() {

printk(KERN_INFO "Hola Mundo desde un Modulo Linux\n");return 0;

}// funcion de salida

void adios_mundo() {printk(KERN_INFO "Adios Mundo desde un modulo Linux\n");}

module_init(hola_mundo); // definimos cual es la funcion de entradamodule_exit(adios_mundo); // definimos cual es la funcion de salida

 

ESTRUCTURA DE UN MODULO

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 30/40

 

ESTRUCTURA DE UN MODULO

* Debido a que el kernel se ejecuta sobre si mismo debe definir sus

propias funciones:

* Debido a que el kernel se ejecuta sobre si mismo debe definir suspropias funciones:

Los loglevels del kernel estan definidos en linux/printk.h. Las

constantes de permiso de un archivo estan definidas en linux/stat.h

Los loglevels del kernel estan definidos en linux/printk.h. Lasconstantes de permiso de un archivo estan definidas en linux/stat.h

#include <linux/moduleparam.h>#include <linux/stat.h>. . .static int parametro_modulo = 1;module_param(parametro_modulo, int, S_IRUGO);. . .

printk(KERN_INFO “El valor pasado es: %d”,parametro_modulo);

# insmod mimodulo.ko parametro_modulo=20

#include <linux/moduleparam.h>#include <linux/stat.h>. . .static int parametro_modulo = 1;module_param(parametro_modulo, int, S_IRUGO);. . .printk(KERN_INFO “El valor pasado es: %d”,parametro_modulo);

# insmod mimodulo.ko parametro_modulo=20

* Para pasarle un valor a un modulo se debe definir la variablecomo static:

* Para pasarle un valor a un modulo se debe definir la variablecomo static:

printk(KERN_INFO "Hola Mundo desde un Modulo Linux\n");printk(KERN_INFO "Hola Mundo desde un Modulo Linux\n");

 

ESTRUCTURA DE UN MODULO

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 31/40

 

ESTRUCTURA DE UN MODULO

* Exportar simbolos de un modulo:* Exportar simbolos de un modulo:

#include “mimodulo.h”. . . .void Compartir(void){

printk(KERN_INFO “Esta funcion va a ser compartida con el Kernel”);}EXPORT_SYMBOL(Compartir);

#include “mimodulo.h”

. . . .void Compartir(void){

printk(KERN_INFO “Esta funcion va a ser compartida con el Kernel”);}EXPORT_SYMBOL(Compartir);

* Incluir un simbolo exportado:* Incluir un simbolo exportado:

#include “mimodulo.h”. . . .void Compartir();

#include “mimodulo.h”. . . .void Compartir();

Las funciones exportadas se pueden ver en /proc/kallsysms.Las funciones exportadas se pueden ver en /proc/kallsysms.

* Al compilar un modulo se generara un archivo llamadoModule.symvers, este archivo almacena las direcciones y ruta de lossimbolos exportados.

* Al compilar un modulo se generara un archivo llamadoModule.symvers, este archivo almacena las direcciones y ruta de lossimbolos exportados.

 

REGISTRAR Y LIBERAR UN MODULO

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 32/40

 

REGISTRAR Y LIBERAR UN MODULO

* Al registrar un modulo, se le indica al kernel que reserve elnúmero del dispositivo para poder acceder al controlador.

* Al registrar un modulo, se le indica al kernel que reserve el

número del dispositivo para poder acceder al controlador.

* Luego de reservar el numero del dispositivo, se debe eliminareste registro para que otro controlador pueda utilizarlo.

* Luego de reservar el numero del dispositivo, se debe eliminareste registro para que otro controlador pueda utilizarlo.

* El acceso a los dispositivos es a traves de archivos especiales enla carpeta /dev.

* El acceso a los dispositivos es a traves de archivos especiales enla carpeta /dev.

El comando mknod crea un fichero especial de un modulo.El comando mknod crea un fichero especial de un modulo.

 

REGISTRAR Y LIBERAR UN MODULO

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 33/40

 

REGISTRAR Y LIBERAR UN MODULO

#include <linux/init.h> // macros para el inicio y salida de modulos#include <linux/module.h> // necesario para modulos#include <linux/fs.h> // para registrar y liberar el modulo#define MAJOR_DRIVER 260 // major number libre para el modulo#define MINOR_DRIVER 0 // minor number del dispositivo

dev_t Driver; // almacena el Major y Minor number del dispositivo

// registramos el major number del modulo en /proc/devices

int iniciar_modulo() {Driver = MKDEV(MAJOR_DRIVER, MINOR_DRIVER); // Inicia dev_t

return register_chrdev_region(Driver, 1, “Mi_Driver”);}// liberamos el modulo registradovoid finalizar_modulo() {

unregister_chrdev_region(Driver, 1);}

module_init(iniciar_modulo); // funcion de entradamodule_exit(finalizar_modulo); // funcion de salida

#include <linux/init.h> // macros para el inicio y salida de modulos#include <linux/module.h> // necesario para modulos#include <linux/fs.h> // para registrar y liberar el modulo

#define MAJOR_DRIVER 260 // major number libre para el modulo#define MINOR_DRIVER 0 // minor number del dispositivo

dev_t Driver; // almacena el Major y Minor number del dispositivo

// registramos el major number del modulo en /proc/devices

int iniciar_modulo() {Driver = MKDEV(MAJOR_DRIVER, MINOR_DRIVER); // Inicia dev_t

return register_chrdev_region(Driver, 1, “Mi_Driver”);}// liberamos el modulo registradovoid finalizar_modulo() {

unregister_chrdev_region(Driver, 1);}

module_init(iniciar_modulo); // funcion de entradamodule_exit(finalizar_modulo); // funcion de salida

 

OPERACIONES DE UN MODULO DE

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 34/40

 

OPERACIONES DE UN MODULO DECARACTER

* Se debe indicar al kernel las operaciones que puede realizar

el modulo a traves de la estructura file_operations definida enlinux/fs.h.

* Se debe indicar al kernel las operaciones que puede realizarel modulo a traves de la estructura file_operations definida enlinux/fs.h.

ssize_t MiDriver_read(struct file *fOps, char __user *buff, size_t count, loff_t *pOff){// Realizar Operaciones de lectura 

return 0;}struct file_operations OperacionesDriver = {

.owner = THIS_MODULE, // Puntero hacia la estructura del modulo

.read = MiDriver_read, // Lee datos del dispositivo

.write = MiDriver_write, // Escribe datos al dispositivo

. . ..open = NULL, // Primera operacion del dispositivo

.release = NULL, // Libera al dispositivo

  . . .};

ssize_t MiDriver_read(struct file *fOps, char __user *buff, size_t count, loff_t *pOff){// Realizar Operaciones de lectura return 0;

}struct file_operations OperacionesDriver = {

.owner = THIS_MODULE, // Puntero hacia la estructura del modulo

.read = MiDriver_read, // Lee datos del dispositivo

.write = MiDriver_write, // Escribe datos al dispositivo

. . .

.open = NULL, // Primera operacion del dispositivo

.release = NULL, // Libera al dispositivo

  . . .};

 

OPERACIONES DE UN MODULO DE

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 35/40

 

OPERACIONES DE UN MODULO DECARACTER

// registramos el major number del modulo en /proc/devicesint iniciar_modulo() {

return register_chrdev(MIDRIVER_MAJOR, DriverName, &OperacionesDriver);}

// liberamos el modulo registradovoid finalizar_modulo() {

unregister_chrdev(MIDRIVER_MAJOR, DriverName);}

module_init(iniciar_modulo); // funcion de entradamodule_exit(finalizar_modulo); // funcion de salida

// registramos el major number del modulo en /proc/devicesint iniciar_modulo() {

return register_chrdev(MIDRIVER_MAJOR, DriverName, &OperacionesDriver);}

// liberamos el modulo registradovoid finalizar_modulo() {

unregister_chrdev(MIDRIVER_MAJOR, DriverName);}

module_init(iniciar_modulo); // funcion de entrada

module_exit(finalizar_modulo); // funcion de salida

* Luego de crear las operaciones del modulo se debe registrar el

dispositivo.

* Luego de crear las operaciones del modulo se debe registrar eldispositivo.

Existen diferentes formas de registrar un modulo y depende del

tipo de modulo a crear.

Existen diferentes formas de registrar un modulo y depende deltipo de modulo a crear.

 

COMPILACION DE UN MODULO

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 36/40

 

COMPILACION DE UN MODULO

obj +:= modulo1.o, modulo2.o // aqui podemos agregar los archivos obj necesarios

all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

obj +:= modulo1.o, modulo2.o // aqui podemos agregar los archivos obj necesarios

all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

* Un modulo se puede compilar con el siguiente Makefile generico:* Un modulo se puede compilar con el siguiente Makefile generico:

# make

* Cargamos el modulo:

# insmod mimodulo.ko

* Descargamos el modulo:

# rmmod mimodulo.ko

# make

* Cargamos el modulo:

# insmod mimodulo.ko

* Descargamos el modulo:

# rmmod mimodulo.ko

Se puede ver los mensajes de la funcion printk, utilizando el

comando dmesg o en la ruta /var/log/syslog

Se puede ver los mensajes de la funcion printk, utilizando elcomando dmesg o en la ruta /var/log/syslog

 

ESTRUCTURA DEL KERNEL

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 37/40

 

ESTRUCTURA DEL KERNEL

SOURCE

ARCH

DRIVERS

FS

INCLUDE

(CODIGO DEPENDIENTE DE LA ARQUITECTURA)(CODIGO DEPENDIENTE DE LA ARQUITECTURA)

(CONTROLADORES DE DISPOSITIVOS)(CONTROLADORES DE DISPOSITIVOS)

(SISTEMA DE ARCHIVOS)(SISTEMA DE ARCHIVOS)

(ARCHIVOS DE DEFINICION *.H)(ARCHIVOS DE DEFINICION *.H)

INIT MAIN.C(ARCHIVO PRINCIPAL DEL KERNEL)

(ARCHIVO PRINCIPAL DEL KERNEL)

KERNEL(CODIGO DEL KERNEL, SCHEDULER, CPU, ETC)

(CODIGO DEL KERNEL, SCHEDULER, CPU, ETC)

MM (ADMINISTRACION DE LA MEMORIA)(ADMINISTRACION DE LA MEMORIA)

NET(PROTOCOLOS DE RED, BLUETOOTH, ETC)

(PROTOCOLOS DE RED, BLUETOOTH, ETC)

 

CONCLUSIONES

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 38/40

 

CONCLUSIONES

* Entender el funcionamiento interno del kernel no es una tareafacil ya que se requiere de un cierto conocimiento de sistemas

operativos y de la comunicacion de este con el hardware.

* Puedes empezar entendiendo y desarrollando modulos o realizarpequeñas modificaciones al kernel. Por ejemplo: definir una nuevasyscall, modificar el banner del kernel, etc.

* Si quieres ser un desarrollador del kernel linux o quierescolaborar debes comenzar tu lectura en Documentation/HOWTO.

* El kernel linux es portable vamos a mantenerlo asi. Utiliza lostipos de datos definidos por el kernel.

* Entender el funcionamiento interno del kernel no es una tareafacil ya que se requiere de un cierto conocimiento de sistemas

operativos y de la comunicacion de este con el hardware.

* Puedes empezar entendiendo y desarrollando modulos o realizarpequeñas modificaciones al kernel. Por ejemplo: definir una nuevasyscall, modificar el banner del kernel, etc.

* Si quieres ser un desarrollador del kernel linux o quierescolaborar debes comenzar tu lectura en Documentation/HOWTO.

* El kernel linux es portable vamos a mantenerlo asi. Utiliza lostipos de datos definidos por el kernel.

Linus Tolvards: "La mejor forma de aprender el nucleo es leer tumismo el codigo fuente."

Linus Tolvards: "La mejor forma de aprender el nucleo es leer tumismo el codigo fuente."

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 39/40

 

REFERENCIAS

* Linux Device Driver Third Edition.

* http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/es/

* http://es.tldp.org

* http://www.kernel-labs.org

* http://kernelnewbies.org

* http://www.kernel.org

* http://www.linuxquestions.org

* Linux Device Driver Third Edition.* http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/es/

* http://es.tldp.org

* http://www.kernel-labs.org

* http://kernelnewbies.org

* http://www.kernel.org

* http://www.linuxquestions.org

Contacto: [email protected]: [email protected]

 

5/8/2018 Kernel_Hacking - Conociendo Al Kernel Linux - slidepdf.com

http://slidepdf.com/reader/full/kernelhacking-conociendo-al-kernel-linux 40/40

 

HAPPY HACKING!!HAPPY HACKING!!HAPPY HACKING!!HAPPY HACKING!!