[pso] Tema 1 Linux - Prototip functie interceptie si vectorul de sistem calls interceptate

Andrei Popa ca at i-neo.ro
Fri Mar 16 01:45:14 EET 2007


On Fri, 2007-03-16 at 00:21 +0200, Alexandru Tudose wrote:
> Nu am reusit sa ma lamuresc dupa ce am consultat mai multe resurse in
> legatura cu urmatoarele:
> 
> 1. Cine este efectiv responsabil de transferul parametrilor din
> registri (alti decat eax) catre system call? Procedura de entry stie
> sa "vada" de cati parametri are nevoie un system call, si ii
> furnizeaza exact cati are nevoie citindu-i din registri? 
> 
> Intreb asta pentru ca nu am vazut nicaieri (unistd.h sau entry.S)
> specificata informatie legata de prototipul system call-urilor. Doar
> numele lor si numarul lor. Cum stie cine trebuie sa stie cati
> parametri are sau nu un syscall? 

linux-ul nu face nici o verificare a numarului de parametrii la
syscall-uri, functia care implementeaza syscall-ul apelat citeste doar
cati parametrii are nevoie.

> 
> 2. Am vazut in unele locuri system calls definite cu un singur
> parametru, struct pt_regs* regs. Care este diferenta intre a defini un
> system call asa si a-l defini la modul my_syscall( int a, char* b, int
> c )?

la syscall-uri de obicei este "asmlinkage syscall_qwe(struct pt_regs
regs)" si asta inseamna ca functia isi va lua argumentele de pe stiva si
nu din registrii, deci va umple valorile din acea structura cu ce este
pe stack.


daca ai avea my_syscall(int a, char *b, int c) in loc de
my_syscall(struct pt_regs regs) , atunci "a" ar fi regs->ebx, "b" ar fi
regs->(ecx) iar "c" ar fi regs->edx
(  daca gresesc sa ma corecteze cineva :)  )
> 
> 3. Trebuie sa suprascriem system call-ul 0, dar acesta are prototipul
> restart_syscall(void) pe cand functia noastra este predefinita ca
> fiind my_syscall( int, int, int ). Cum este posibil asa ceva? :-)

in tabela de syscall-uri tu ai un pointer catre functia care gestioneaza
acel syscall, nu verifica nimeni numarul de argumente.

> 
> 4. Trebuie definit un vector de pointeri la functii, unde sa salvam
> functiile interceptate pentru a fi restorate ulterior. Cum s-ar defini
> acest vector de pointeri atata timp cat mai toate functiile au numar
> si tip de parametri diferiti? 
> Initial ma gandisem la 
> 
> asmlinkage long (*original_call[ NR_syscalls ])(struct pt_regs* regs);

nu te intereseaza numarul de parametrii. trebuie sa salvezi doar
adresele functiilor.


> 
> dar asta ar merge _doar_ daca ar putea fi chemate intr-un mod
> uniform... cred ca imi scapa ceva aici :-(
> 
> 
> 
> 
> Multumesc mult pentru ajutor,
> Alexandru Tudose.
> _______________________________________________
> pso mailing list
> pso at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
-- 
Andrei Popa - 341C3



More information about the pso mailing list