opet syscally
Divacky Roman
xdivac02 at stud.fit.vutbr.cz
Thu May 6 14:03:38 CEST 2004
On Wed, May 05, 2004 at 11:15:58PM +0200, Tomas Pluskal wrote:
>
> Mel bych opet dotaz ohledne vnitrnosti kernelu (doufam ze zase nebudu
> odsouzen ze delam cunarny :)
>
> Jedna se mi o to, ze bych chtel ve svem modulu napichnout vsechny
> syscally, abych mohl sledovat jak je procesy volaji. Nechal jsem se trochu
> inspirovat systemem CerbNG (http://cerber.sourceforge.net/)
>
> Nejdrive si ulozim vsechny stavajici handlery syscallu a nasmeruji je na
> vlastni obsluhu:
>
> -----------------------------------------------------------------------
> sy_call_t *syscall_handlers[SYS_MAXSYSCALL];
>
> for (i = 0; i < SYS_MAXSYSCALL; i++) {
> syscall_handlers[i] = sysent[i].sy_call;
> sysent[i].sy_call=&my_syscall;
> }
> -----------------------------------------------------------------------
>
>
> Obsluha vypada prozatim takhle:
>
>
> -----------------------------------------------------------------------
> int my_syscall(struct thread *thr, void *arg) {
>
> int syscall = thr->td_frame->tf_eax;
>
> if ((syscall == SYS_syscall) || (syscall == SYS___syscall)) {
> caddr_t params = (caddr_t) thr->td_frame->tf_esp + sizeof(int);
> syscall = fuword(params);
> }
>
> return (syscall_handlers[syscall])(thr, arg);
>
> }
> -----------------------------------------------------------------------
>
> Vsechno funguje krasne az do chvile, kdy se pokusim modul odstranit - pri
> tom nastavuji puvodni obsluhy:
>
> -----------------------------------------------------------------------
> for (i = 0; i < SYS_MAXSYSCALL; i++) {
> sysent[i].sy_call=syscall_handlers[i];
> }
> -----------------------------------------------------------------------
>
> a system spadne.
>
> Ve zdrojacich CerbNG jsem se na jednom miste docetl:
> /*
> * There are problems (kernel panic) when catching those syscalls:
> * select(), wait4(), mmap(), lseek(), sigsuspend()
> */
>
> a na jinem miste zase neco jineho:
>
> /*
> * There are problems with stablility when those syscalls are catched.
> */
> static u_int invalid_scalls[] = {
> SYS_exit,
> SYS_flock,
> SYS_read,
> SYS_write,
> SYS_wait4
> };
>
>
> Me dotazy jsou proto nasledujici
> - proc neni mozne nektere syscally odchytavat
odchytavat muzete vsecko...
> - proc system spadne prave pri unloadu modulu
cira spekulace - pri unloadu modulu pouzijete nejaky syscall zrovna ve
chvili kdy je prepisujete... zkuste zamknout kernel
> - jestli se da nejak zjistit ktere syscally muzu bezpecne chytat, resp.
> ktere jsou problematicke
odchytavat by melo jit vsecko ale logicky nektere syscally jsou
"drsnejsi"... ja bych to videl asi tak ze cim vic se syscall pouziva tim
veci pruser s nim muzete nadelat...
> diky predem za rady,
>
> Tomas Pluskal
> --
> FreeBSD mailing list (users-l at freebsd.cz)
> http://www.freebsd.cz/listserv/listinfo/users-l
More information about the Users-l
mailing list