LINUX.ORG.RU

остановите время


0

0

можно ли сделать так, что-бы для одной определенной программы (и может ее детей) время было другим чем для остальной системы? А то у меня есть демо версия одной програмульки, которая очень огорчилась фактом, что наступил 2004-й год. На столько огорчилась, что перестала работать :).
Вот мне хочется, что-бы при запуске она думала что на дворе декабрь 2003-го года.

Помогие, а?

anonymous

Ляххко. Есть такая штука, как LD_PRELOAD...

anonymous
()

хехе, проблема 2L4? :))

lg ★★
()

Есть некая известная утилита, на freshmeat'е была - принимает список программ и времен, которые им нужно возвращать. К сожалению, никаких воспоминаний об имени.

Die-Hard ★★★★★
()

Можно сделать так: посмотреть strace'ом, какой сисколл дергается, и через прелоад подменить его самописаной функцией - я так делал, работает. Если интересует, могу прислать пример - но он заточен конкретно под перехват time и возвращает некое время в районе октября 2003.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

Тороплюсь - может, в выходные, или в понедельник пошлю.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

Я возился дебагером ddt, мне не хватило месяца, что давался на 
триал-версию, и я слегка ее "продлил" - кстати, и сейчас еще работает,
хотя мы  честно купили официальную версию.

Ввиду специфич. характера проги, мне пришлось слегка извратиться: подменять
время только для дебаггера, а форкнутые им проги должны получать правильный
time()

Вот файл thetime.c:

#include <stdlib.h>
#include <sys/time.h>
#include <libgen.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

/*The name of a program binary file:*/
#define THENAME "ddt"

char buf[1024];
char nam[32];
long int time(long int *t)
{
static int counter=0;
long int result;
   if(counter==0){
      int i;
      for(i=0;i<1024; i++)buf[i]='\0';
      sprintf(nam,"/proc/%d/exe",getpid());
      if(readlink(nam,buf,1024)<0)
         return -1;
      if( strcmp(basename(buf),THENAME) == 0 )
          counter=1;
      else
          counter=-1;
   }

   if(counter>0)/*THENAME*/
      result= 1068484122;
   else{/*Child process, emulate usual time() call:*/
      struct timeval tv;
      counter=1;
      /*stolen from sources of glibc-2.2.5:*/
      if (__gettimeofday (&tv, (struct timezone *) NULL))
         result = -1;
      else
         result = tv.tv_sec;
   }
   if(t!=NULL)
        *t=result;
   return result;
}


Вот так я его компилил:
gcc -fPIC -shared -Xlinker -soname -Xlinker libtime.so.1 -o libtime.so.1.0 thetime.c

Затем файл libtime.so.1.0 клал в нужное место, ($HOME/ddt/lib/)
а в качестве стартового скрипта использовал такое:

#!/bin/sh

export DDTPATH=$HOME/ddt
export DDT=$DDTPATH/bin/ddt
export DDTCONFIG=$DDTPATH/ddt.config
export LD_LIBRARY_PATH=$DDTPATH/lib:$LD_LIBRARY_PATH
export PATH=$DDTPATH/bin:$PATH
LD_PRELOAD=$DDTPATH/lib/libtime.so.1.0
export LD_PRELOAD
$DDT "$@"

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.