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

Jan-Benedict Glaw jbglaw at lug-owl.de
Do Jul 31 12:56:00 CEST 2003


On Thu, 2003-07-31 08:55:41 +0200, Steffen Dettmer <steffen at dett.de>
wrote in message <20030731085541.F2642 at dx.net.de>:
> * 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.

Es gibt zwei Funktionen, um Funktion(spointer) an die libc zu übergeben,
die der Reihe nach aufgerufen werden sollen, wenn das Programm exit()
aufruft oder via return xx; auf main() herausspringt. Das habe ich als
Beispiel gegeben, weil ich's gerade fertig vor mir hatte.

> > 
> > ----------- new-at_on_exit.c -----------------
>  [...] 
> 
> Ist die Funktion, die bei Programmende gerufen wird, korrekt?

ACK

> > 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.

Genau. ...und zwar die Adresse der atexit()-Funktion der libc. Wir haben
ja ebenfalls so eine Funktion...

> >         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?

Genau. ...um herauszufinden, was einige komische Programme (TM) gerne
machen wollen, wenn sie sich beenden.

> >         if(orig_atexit)
> >                 return (*orig_atexit)(function);
> >         else
> >                 return -1;
> > }
> 
> Orginalen at_exit aufrufen.

So.

> 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)?

Genau.

Im Endeffekt brauchst Du nicht viel mehr, als die Funktionsnamen
auszutauschen, um time() und gettimeofday() auf diesem Wege abzufangen.

> > #define INTERCEPT_TARGET RTLD_NEXT
> 
> Kennt meine Man-Page nicht.

Tiefes libc-Wissen:)

> 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

Nicht mehr. In 2.6.x ist sys_call_table nicht mehr EXPORT_SYMBOL()ed
sodaß Du darauf (zumindest aus einem Modul heraus) keinen (einfachen)
Zugriff bekommst.

> 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?

In 2.4.x klappt das noch. Aber sowas ist einfacher, im Userspace zu
machen. S.o.

MfG, JBG

-- 
   Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
      ret = do_actions((curr | FREE_SPEECH) & ~(IRAQ_WAR_2 | DRM | TCPA));
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20030731/2a9b3e40/attachment.sig>


Mehr Informationen über die Mailingliste linux-l