Zeitauskunft (war: Re: [linux-l] Dateien mit '/' im Dateinamen)

Steffen Dettmer steffen at dett.de
Do Jul 31 08:55:41 CEST 2003


* Jan-Benedict Glaw wrote on Wed, Jul 30, 2003 at 12:52 +0200:
> Ist vom Prinzip her ganz einfach (ich häng' mal 'was an, mit
> dem ich lib-Aufrufe abfange), funktioniert hier aber nicht, da
> LD_PRELOAD-libs nicht auf setuid-Programme (vmware ist
> sowas!!!) angewandt werden. 

Na ja, kriegt man aber systemweit hin.

> Für die libc-Funktionen atexit() und on_exit() sieht das z.B. so aus:

Versteh ich nicht.

> 
> ----------- new-at_on_exit.c -----------------
 [...] 

Ist die Funktion, die bei Programmende gerufen wird, korrekt?
> int
> atexit(void (*function)(void))
> {
>         static int      (*orig_atexit)(void (*)(void))  = NULL;
>         FILE            *fp;
>         struct timeval  tv;
> 
>         if(!orig_atexit)
>             	  orig_atexit 
>                 = (int (*)(void (*)(void)))dlsym(INTERCEPT_TARGET, "atexit");

Hier wird also die Address von "atexit" gespeichert, wenn noch
keine gespeichert ist.

>         gettimeofday(&tv, NULL);
>         
>         if((fp = fopen("/tmp/atexit", "w+"))) {
>                 fprintf(fp, "%ld.%06ld atexit(%p) called by %p\n",
>                                 tv.tv_sec,
>                                 tv.tv_usec,
>                                 function,
>                                 __builtin_return_address(0));
>                 fclose(fp);
>         }

Zeiutstempel in Datei. ist nur zu Debugzwecken?

>         if(orig_atexit)
>                 return (*orig_atexit)(function);
>         else
>                 return -1;
> }

Orginalen at_exit aufrufen.

So, was macht das nu für einen Sinn? Versteh ich überhaupt nicht.
Kannste mal bitte einen Satz Erleuchtung in mein Dunkel bringen
:) Danke! Ist das nur als Beispiel gedacht, damit man sieht, daß
wie man eine Libfunktion ersetzt (einfach eine gleichnamige mit
LD_PRELOAD bereitstellen)?

> #define INTERCEPT_TARGET RTLD_NEXT

Kennt meine Man-Page nicht.


Bei Kernelmodulen funktioniert das wohl recht einfach, einen Call
abzufangen: man schreibt einfach in "extern void *sys_call_table[];"
seinen Funktionspointer. Falls jemand interesse hat, könnte ich
mal ntp.c mailen (das macht ptrace für uid != 0 platt). So müßte
man auch gettimeofday - oder was der Kernel da anbietet -
umbiegen können, denke ich. Oder?

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.




Mehr Informationen über die Mailingliste linux-l