Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    vorrei un aiuto sull' orologio...

    {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/22603...-specific-task

  2. #2
    Cosa hai bisogno di fare esattamente?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    fare in modo che un programma quando "chiede" l' ora al pc la risposta di questo sia sempre la stessa

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    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

  6. #6
    20 minuti?
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    codice:
    #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;
    }
    codice:
    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
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Un pelo migliorato (gestisce correttamente tz in gettimeofday forwardandolo alla funzione originale):
    codice:
    #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;
    }
    codice:
    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
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Grazie mille sei stato gentilissimo.
    Ma questi codici dove devo inserirli? come? scusa per le continue domande, non ho alcuna esperienza

  10. #10
    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:
    codice:
    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:
    codice:
    LD_PRELOAD=/percorso/della/libreria/nomefile.so nomeprogramma
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.