{"id":77,"date":"2005-02-22T22:54:07","date_gmt":"2005-02-22T20:54:07","guid":{"rendered":"http:\/\/blogs.bl0rg.net\/netzstaub\/?p=77"},"modified":"2005-02-22T22:54:07","modified_gmt":"2005-02-22T20:54:07","slug":"zeit-faken-unter-unix","status":"publish","type":"post","link":"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/02\/22\/zeit-faken-unter-unix\/","title":{"rendered":"Zeit faken unter Unix"},"content":{"rendered":"<p>\nWeil jemand im IRC danach gesucht hat, hier ein kleines St&#252;ck Code um die Zeit f&#252;r ein Programm zur&#252;ckzusetzen. Ziemlich alle Unixoide Programme werden wohl den Systemcall gettimeofday benutzen, um die Uhrzeit zu bekommen. Zum Gl&#252;ck ruft man syscalls nicht von Hand auf, denn es gibt ganz viele sch&#246;ne Wrapperfunktionen in der libc. In dem Fall die gut benannte Funktion gettimeofday. Nun wird die libc meistens dynamisch verlinkt, so dass man einen weit verbreiteten Trick anwenden kann, um System Calls zu hijacken. Der dynamische Loader kann n&#228;mlich Libraries &#8220;vorschalten&#8221;. Im Klartext heisst das also: wir tun gar nicht Syscalls hijacken, sondern die Wrapperfunktionen zu diesen Syscalls. Und weil wir selber so faul sind, wollen wir aus unserer Hijackfunktion nicht noch selber den richtigen Syscall aufrufen, sondern rufen gleich die eigentlich Funktion auf. Im Code sieht das dann so aus:\n<\/p>\n<pre>\n#include &lt;stdlib.h&gt;\n#include &lt;sys\/time.h&gt;\n#include &lt;dlfcn.h&gt;\n#include &lt;assert.h&gt;\n\ntypedef int (*gettimeofday_t)(struct timeval *, struct timezone *);\n\nstatic gettimeofday_t old_gettimeofday = NULL;\n\n#ifndef RTLD_NEXT\n\/* linux... *\/\n#define RTLD_NEXT (-1l)\n#endif\n\nint gettimeofday(struct timeval *tp, struct timezone *tzp) {\n  int ret;\n\n  if (old_gettimeofday == NULL) {\n    old_gettimeofday = (gettimeofday_t)dlsym(RTLD_NEXT, \"gettimeofday\");\n    assert(old_gettimeofday != NULL);\n  }\n\n  ret = (*old_gettimeofday)(tp, tzp);\n  if (tp) {\n    tp-&gt;tv_sec -= 50000;\n  }\n\n  return ret;\n}\n\n<\/pre>\n<p>\nAls erstes checken wir ob wir schon die Adresse von der &#8220;richtigen&#8221; Funktion kennen, und wenn nicht, dann holen wir die uns mit der Funktion dlsym. An der Stelle ein kleiner &#252;bler Hack f&#252;r Linux. Da muss man irgendwie __USE_GNU definieren, damit der sich die gewollte Definition von dlsym holt, nach 2 Versuchen ging das bei mir irgendwie nicht, ich hatte nicht weiter bock, deswegen dieses #define RTLD_NEXT. Nachdem wir die alte Funktion haben, rufen wir diese auf, ziehen 5000 Sekunden von dem Ergebnis ab, et voila. Das Ganze kann mit folgendem Makefile compilen:\n<\/p>\n<pre>\nall: libfakedate.so\n\nlibfakedate.so: fakedate.c\n    $(CC) -D__USE_GNU -fPIC -shared -o $@ $\n<\/pre>\n<p>\nUnd mit folgender Zeile dann benutzen:\n<\/p>\n<pre>$ LD_PRELOAD=`pwd`\/libfakedate.so date\n<\/pre>\n<p>\nSchick! Unter OSX tut das nicht, sondern loopt, aus welchen undefinierbaren Gr&#252;nden auch immer (kein ELF, sondern Mach-O, portiertes dlcompat, ach-weiss-ich&#8230;).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Weil jemand im IRC danach gesucht hat, hier ein kleines St&#252;ck Code um die Zeit f&#252;r ein Programm zur&#252;ckzusetzen. Ziemlich alle Unixoide Programme werden wohl den Systemcall gettimeofday benutzen, um die Uhrzeit zu bekommen. Zum Gl&#252;ck ruft man syscalls nicht &hellip; <a href=\"https:\/\/blogs.bl0rg.net\/netzstaub\/2005\/02\/22\/zeit-faken-unter-unix\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-77","post","type-post","status-publish","format-standard","hentry","category-programmstaub"],"_links":{"self":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/77","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/comments?post=77"}],"version-history":[{"count":0,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/posts\/77\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/media?parent=77"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/categories?post=77"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.bl0rg.net\/netzstaub\/wp-json\/wp\/v2\/tags?post=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}