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