Using LD_PRELOAD to make date return a specific date

Tom Evans tevans.uk at googlemail.com
Thu Apr 26 11:15:22 UTC 2007


On Tue, 2007-04-24 at 19:39 -0700, Kelly Jones wrote:
> I recently discovered LD_PRELOAD, a cool environment variable that
> lets a library "intercept" system calls. For example, setting
> LD_PRELOAD to /usr/lib/libtsocks.so lets tsocks intercept socket
> connections and redirect them to a SOCKS proxy.
> 
> My question: how can I write a library that intercepts the
> gettimeofday() system call (or time() or whatever the 'date' command
> uses) and gets 'date' to return, say, "Thu Jan 1 00:00:00 UTC 1970"?
> 
> I realize this involves a couple of steps (writing a C "library" for
> one), so any pointers are appreciated. My real intentions are more
> complex (and sinister <G>).
> 

It's quite straightforward. /bin/date actually uses localtime(), not
gettimeofday(), but the principle is the same.

> $ cat localtime_hack.c 
#include <sys/types.h>
#include <time.h>

struct tm *
localtime(const time_t *clock)
{
    static struct tm tv;
    time_t epochal = 1;
    localtime_r(&epochal, &tv);
    return &tv;
}

> $ gcc -Wall -fpic -c -o localtime_hack.o localtime_hack.c

> $ gcc -shared -Wl,-soname,localtime_hack.so.1 -o \  
     liblocaltime_hack.so.1.0 localtime_hack.o

> $ LD_PRELOAD="`pwd`/liblocaltime_hack.so.1.0" /bin/date
Thu  1 Jan 1970 01:00:01 BST


Cheers

Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: This is a digitally signed message part
Url : http://lists.freebsd.org/pipermail/freebsd-questions/attachments/20070426/08cde0db/attachment.pgp


More information about the freebsd-questions mailing list