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