Zeitauskunft (war: Re: [linux-l] Dateien mit '/' im Dateinamen)
Jan-Benedict Glaw
jbglaw at lug-owl.de
Mi Jul 30 12:52:59 CEST 2003
On Wed, 2003-07-30 11:52:30 +0200, Stefan Bund <sbund at artec-berlin.com>
wrote in message <87oezccpep.fsf at bruni.artec-berlin.com>:
> "Baerwaldt, Ralf" <Ralf.Baerwaldt at Dresdner-Bank.com> writes:
> > Kannst du mir mal den Hack zur Verfuegung stellen ?
> > So etwas moeglichst noch mit Aufrufparameter (Programm -> Zeit)
> > haette ich immer wieder mal gebraucht.
>
> Im Prinzip lie?e sich das bestimmt auch mittels LD_LIBRARY_PRELOAD
> (aka fakeroot oder checkinstall) l?sen, aber da wei? ich nicht, wie
> das geht.
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.
Für die libc-Funktionen atexit() und on_exit() sieht das z.B. so aus:
----------- new-at_on_exit.c -----------------
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
#include "interceptor.h"
/*
* $Id$
*/
/*
* $Log$
*/
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");
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);
}
if(orig_atexit)
return (*orig_atexit)(function);
else
return -1;
}
int
on_exit(void (*function)(int, void *), void *arg)
{
static int (*orig_on_exit)(void (*)(int, void *), void *) = NULL;
FILE *fp;
struct timeval tv;
if(!orig_on_exit)
orig_on_exit = (int (*)(void (*)(int, void *), void *)) dlsym(INTERCEPT_TARGET, "on_exit");
gettimeofday(&tv, NULL);
if((fp = fopen("/tmp/on_exit", "w+"))) {
fprintf(fp, "%ld.%06ld on_exit(0x%p, 0x%p) called by %p\n",
tv.tv_sec,
tv.tv_usec,
function,
arg,
__builtin_return_address(0));
fclose(fp);
}
if(orig_on_exit)
return (*orig_on_exit)(function, arg);
else
return -1;
}
------------------------------------------------------------------
------------------ interceptor.h -----------------------------
#ifndef _INTERCEPTOR_H
#define _INTERCEPTOR_H
/*
* $Id$
*/
/*
* $Log$
*/
#ifdef RTLD_NEXT
#define INTERCEPT_TARGET RTLD_NEXT
#else
#define INTERCEPT_TARGET ((void *) -1)
#endif
#endif /* _INTERCEPTOR_H */
-----------------------------------------------------------------
------------------------- Makefile -----------------------------
#!/usr/bin/make -f
CFLAGS=-Wall -Werror
CC=gcc
LIBS= new-at_on_exit.o
all: $(LIBS)
clean:
-rm -rf -- *.o
-rm -rf -- *.so
.c.o:
$(CC) $(CFLAGS) -shared -o $*.so $*.c -ldl
----------------------------------------------------------------
Aufruf ist dann einfach:
$ LD_PRELOAD=/path/to/new-at_on_exit.sh some_program
Ich hab' mittlerweile für mehrere lib-calls solche Abfang-Routinen und
es werden mehr. Vieles kann man auch mit ltrace machen, aber das gibt's
nicht für alle Architekturen...
Aber, wie gesagt, das funktioniert bei SUID-Programmen nicht...
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/20030730/1d415bfe/attachment.sig>
Mehr Informationen über die Mailingliste linux-l