PDA

Visualizza la versione completa : vorrei un aiuto sull' orologio...


elio1992
20-12-2011, 16:50
{linux mint}
ho trovato questa discussione che tratta di un argomento di cui ho bisogno. Il problema è che non riesco a tradurre in pratica quello che viene suggerito, potreste aiutarmi?

http://superuser.com/questions/226033/how-to-freeze-the-clock-for-a-specific-task

MItaly
20-12-2011, 18:41
Cosa hai bisogno di fare esattamente?

elio1992
20-12-2011, 19:16
fare in modo che un programma quando "chiede" l' ora al pc la risposta di questo sia sempre la stessa

MItaly
20-12-2011, 19:28
Allora devi fare come spiegato... devi realizzare una libreria dinamica che esporti le funzioni time(), gettimeofday() e clock_gettime(), fargli restituire il valore che vuoi e usare la variabile d'ambiente LD_PRELOAD per dire al loader dinamico di caricarla per prima e di usare quindi le sue funzioni al posto di quelle "vere" fornite dal sistema.

elio1992
20-12-2011, 21:23
Grazie mille
Un' esperto quanto impiegherebbe a farlo? Così da sapere la mole di lavoro che andrei a chiedere all' eventuale...
Cmq se qualcuno vuole darmi alcuni suggerimenti e/o aiuti sarei felicissimo, prevedo nottate di studio per arrivare a concludere qualcosa :dhò:

MItaly
20-12-2011, 22:23
20 minuti? :spy:

MItaly
20-12-2011, 22:49
#include <sys/types.h>
#include <stddef.h>

/* Ora a cui congelare il tempo (in notazione UNIX epoch) */
const time_t fixedTime=652789800;

struct timezone
{
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};

time_t time(time_t * t)
{
if(t!=NULL)
*t=fixedTime;
return fixedTime;
}

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
if(tv!=NULL)
{
tv->tv_sec=fixedTime;
tv->tv_usec=0;
}
if(tz!=NULL)
{
/* Mi invento un GMT+1 */
tz->tz_minuteswest=60;
tz->tz_dsttime=0;
}
return 0;
}

int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
(void)clk_id;
if(tp!=NULL)
{
tp->tv_sec=fixedTime;
tp->tv_nsec=0;
}
return 0;
}


matteo@teoxubuntu:~/cpp/detourtest$ gcc -O3 -Wall -Wextra -shared timedetour.c -o libtimedetour.so
matteo@teoxubuntu:~/cpp/detourtest$ LD_PRELOAD=/home/matteo/cpp/detourtest/libtimedetour.so date
sab 8 set 1990, 12.30.00, CEST

MItaly
21-12-2011, 01:10
Un pelo migliorato (gestisce correttamente tz in gettimeofday forwardandolo alla funzione originale):

#define _GNU_SOURCE
#include <sys/types.h>
#include <dlfcn.h>
#include <stddef.h>

// Ora a cui congelare il tempo (in notazione UNIX epoch)
const time_t fixedTime=652789800;

struct timezone
{
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};

// Typedef per il puntatore a funzione per gettimeofday originale
typedef int (*gettimeofday_t)(struct timeval *tv, struct timezone *tz);

// gettimeofday originale
gettimeofday_t gettimeofday_orig = NULL;

time_t time(time_t * t)
{
if(t!=NULL)
*t=fixedTime;
return fixedTime;
}

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
if(tz!=NULL)
{
if(gettimeofday_orig==NULL)
{
gettimeofday_orig=(gettimeofday_t) dlsym(RTLD_NEXT, "gettimeofday");
if(gettimeofday_orig==NULL)
return -1;
}
int ret=gettimeofday_orig(NULL, tz);
if(!ret)
return ret;
}
if(tv!=NULL)
{
tv->tv_sec=fixedTime;
tv->tv_usec=0;
}
return 0;
}

int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
(void)clk_id;
if(tp!=NULL)
{
tp->tv_sec=fixedTime;
tp->tv_nsec=0;
}
return 0;
}


matteo@teoxubuntu:~/cpp/detourtest$ gcc -O3 -fPIC -Wall -Wextra -shared timedetour.c -o libtimedetour.so
matteo@teoxubuntu:~/cpp/detourtest$ LD_PRELOAD=/home/matteo/cpp/detourtest/libtimedetour.so date
sab 8 set 1990, 12.30.00, CEST

elio1992
22-12-2011, 19:53
Grazie mille sei stato gentilissimo.
Ma questi codici dove devo inserirli? come? scusa per le continue domande, non ho alcuna esperienza

MItaly
22-12-2011, 21:39
Il primo è il sorgente di una libreria dinamica in C; incollalo in un editor di testo e salvalo con estensione .c; eventualmente modifica il valore di fixedTime all'inizio (per impostare la data che verrà fornita sempre al programma da ingannare; è un normale timestamp UNIX, ci sono una miriade di siti che ti consentono di generarlo).
A questo punto compila il file da un terminale:


gcc -O3 -fPIC -Wall -Wextra -shared nomefile.c -o nomefile.so

e otterrai così la libreria dinamica (nomefile.so) che dirotta le chiamate a time, gettimeofday e clock_gettime.
Quindi, per ingannare il programma, lancialo da console assegnando però prima il percorso della libreria che hai generato alla variabile ambiente LD_PRELOAD:


LD_PRELOAD=/percorso/della/libreria/nomefile.so nomeprogramma

Loading