Изменение функции времени в C - PullRequest
0 голосов
/ 20 февраля 2019

Для задания компьютерной безопасности мне нужно изменить функцию времени, чтобы вернуть определенную дату.Мне нужна функция времени, чтобы вернуть дату между 1 января 2016 года и 15 июня 2018 года. Затем я использую эти команды для перегрузки и подключения к функции времени:

gcc -Wall -fPIC -shared -o newtime.so newtime.c -ldl
export LD_PRELOAD=$PWD/newtime.so

Вот моя измененная версияфункция времени:

#define _GNU_SOURCE

#include <dlfcn.h>
#include <time.h>

time_t time (time_t *t)
{
    long int seconds = 1485907200;
    time_t modifiedTime = (time_t) seconds;
    return modifiedTime;
}

Всякий раз, когда я запускаю эту реализацию, она говорит, что возвращаемая дата - 31 декабря 1969 года, 19:00:00.Я неправильно форматирую время со времен Linux Epoch или совершаю более серьезную ошибку?Я попытался использовать обычный int вместо длинного int, и все еще испытываю те же проблемы.Некоторое понимание моей ошибки было бы очень полезно.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

На самом деле, нет проблем в коде, который вы представили.Я протестировал его с помощью следующей базовой программы:

#include <stdio.h>
#include <time.h>

int main(void)
{
    printf("%ld\n", (long) time(NULL));
}

Поэтому я просто запускаю LD_PRELOAD=./newtime.so ./test и получаю ожидаемый результат.

Однако команда date не выполняет вызовк функции time.Вместо этого он вызывает int clock_gettime(clockid_t clk_id, struct timespec *tp).Так что вам лучше повторно реализовать их оба, если вы хотите охватить этот случай.

Может быть простая реализация, подобная следующей (она прекрасно работает с date):

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

Если вы получаете дату, отличную от ожидаемой, она может быть связана с вашим часовым поясом.

0 голосов
/ 20 февраля 2019

Вы не реализуете всю функциональность time().Код, который вы вставляете, может использовать функции, которые вы не реализовали.

В соответствии со стандартом C :

7.27.2.4 Функция времени (обратите внимание на жирную часть):

Конспект

     #include <time.h>
     time_t time(time_t *timer);

Описание

Функция времени определяет текущийкалендарное времяКодировка значения не указана.

Возвращает

Функция времени возвращает наилучшее приближение реализации к текущему календарному времени.Значение (time_t) (- 1) возвращается, если календарное время недоступно. Если таймер не является нулевым указателем, возвращаемое значение также присваивается объекту, на который он указывает.

Полная реализация, основанная на вашем коде:

time_t time (time_t *t)
{
    long int seconds = 1485907200;
    time_t modifiedTime = (time_t) seconds;

    if ( t )
    {
        *t = modifiedTime;
    }

    return modifiedTime;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...