-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Mahlzeit, also, ich habe folgendes Problem, das gelöst werden will: Hier läuft grade der Umstieg von Win-Clients auf Linux. Bisher läuft auch alles ganz Prima. Nun haben wir eine Anwendung die nicht auf Linux portiert werden kann und unter wine läuft. Funktioniert auch soweit, bis auf eins: Die Client-Anwendung kommt nicht mit der Systemzeit klar. Das sieht dann so aus, dass im Wareneingang am Win-Client die Sendung im Eingang gescannt wird und 15 Min. später am Linux-Client im Warenausgang, der Server jedoch dann in seinen Logs stehen hat, dass die Ware 45 Min. bevor sie im Eingang war schon im Ausgang gescannt wurde... Ähh, Ihr könnt mir folgen...? Frage: Besteht vielleicht die Möglichkeit, einem Programm (in dem Fall wine) durch ein Script eine andere Systemzeit vorzusetzen, sprich eine entsprechende Anfrage von wine abzufangen und durch ein Script zu beantworten...? Gruss Mario - -- Echte Freunde kann man nicht kaufen. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD8DBQE/rStOJLVeVMKCIQMRArOVAKDOSFakotbyOcQMu+xsp3evPg8HMACg1VMT iu7pCuRJ6SqdAuknOUNbxc8= =F98v -----END PGP SIGNATURE-----
Hallo, On Sat, 08 Nov 2003 at 18:43 (+0100), Mario van der Linde wrote:
Frage: Besteht vielleicht die Möglichkeit, einem Programm (in dem Fall wine) durch ein Script eine andere Systemzeit vorzusetzen, sprich eine entsprechende Anfrage von wine abzufangen und durch ein Script zu beantworten...?
Durch ein Skript bestimmt nicht. Um sowas zu machen muss man schon etwas
tiefer ins System gehen.
Dazu muss man wissen dass man unter Linux im Fall von Non-Root praktisch
jede Funktion der libc überschreiben kann. Die libc ist die C-Biblio-
thek. Hört sich als was unwichtiges für C-Programmierer an, ist in der
Tat aber die Mittelschicht zwischen Kernel und Anwendungsprogramm und
damit der wichtigste Systembestandteil eines unixoiden Betriebssystemes.
Während man den Kernel mal einfach so austauschen kann ohne dass das
große Probleme mit sich brächte muss man zum Austauschen der C-Biblio-
thek eine große Portion Mut und auch Wissen über das System mit sich
bringen. (Ich hab's noch nicht gemacht und würd's auch nur machen wenn
ich 4 Wochen Langeweile habe.)
Soviel zur Theorie, nun zur Praxis. Um eine Funktion zu überschreiben
programmiert man einfach eine Bibliothek mit dieser Funktion und setzt
dann die Umgebungsvariable LD_PRELOAD.
In der Bibliothek will man natürlich die ursprüngliche Funktion nutzen.
Diese ermittelt man dann dynamisch mit dlsym (RTLD_NEXT, "Funktionsname");
und weist sie einem entsprechendem Funktionszeiger zu.
Ich hab mal eben eine kleine Bibliothek geschrieben die alle möglichen
und unmöglichen (ich wusste bis vor einer halben Stunde gar nicht dass
diese Funktionen überhaupt existieren; hab dann im Quellcode von "date"
nachgesehen was die so verwenden) Zeitfunktionen überschreibt. Naja,
sind bloß vier. :-)
Wie man die Bibliothek kompiliert und benutzt steht im Kommentar. Über-
schreibt bei mir hier tadellos die Ausgabe von date(). Ob das jetzt mit
Deinem wine-Programm funktioniert weiß ich nicht. Um es zum Laufen zu
bekommen müsste man sich "nur" den Quellcode von wine anschauen und da-
mit herausfinden wie die Wine-Leute die Windows-API auf Unix umsetzen.
Viel Spaß dabei. :-)
Hier also das Programm:
================================================================================
/*
* timefake.c
*
* Fälscht die Systemzeit durch Überschreiben von time().
* Die Umgebungsvariable FAKETIME_OFFSET enthält den Wert, um den verschoben
* werden soll. Existiert diese Variable nicht, passiert nichts.
*
* Kompilieren mit
* gcc -W -Wall -shared -Wl,-soname,faketime -o libfaketime.so timefake.c -ldl
*
* Konfigurieren mit
* FAKETIME_OFFSET=60 # eine Minute
* export FAKETIME_OFFSET
*
* Benutzen mit
* LD_PRELOAD=./libfaketime.so <Programm>
*
* Siehe auch: dlopen(3)
*/
/* We need this for RTLD_NEXT */
#define _GNU_SOURCE
#include
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo Bernhard, danke für die ausführliche Antwort. Hatte gehofft dass es einfacher wäre, aber so etwas schon "befürchtet"... Meine c-Kenntnisse sind eher bescheiden genau wie mein Englisch. Nun, dann werde ich mich wohl mal etwas in die libc (mit aller verfügbaren Dokumentation) stürzen müssen, um auch tatsächlich zu verstehen, was da läuft bzw. wie das ganze funktioniert. Dein Link wird mir da hoffentlich bei weiterhelfen.
müsste man sich "nur" den Quellcode von wine anschauen
*gg* ob da mein Jahresurlaub wohl für reicht...? Gruss Mario - -- Die letzten Worte des Chefs: Tolles Geschenk! - So ein Feuerzeug in Revolverform! -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD8DBQE/rUzeJLVeVMKCIQMRAm4RAJ41Un8UuKiQ5s8kzQRbd3r7G0HsXgCfXcYA eriDFi0uzrZfSnNp7fCVVVg= =1Svg -----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 n'Abend noch mal, also, der Ansatz ist vielversprechend, allerdings: [Log ] normalo@c3po:~/scripte> gcc -W -Wall -shared -wl,-soname,faketime -o libfaketime.so timefake.c -ldl 2> gcc_log gcc: unrecognized option `-wl,-soname,faketime' normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log kdecore (KAction): WARNING: KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance ) normalo@c3po:~/scripte> FAKETIME_OFFSET=3600; export FAKETIME_OFFSET normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log Xlib: connection to ":0.0" refused by server Xlib: Excessive XDM-AUTHORIZATION-1 time offset kate: cannot connect to X server :0.0 ERROR: KUniqueApplication: Registering failed! ERROR: KUniqueApplication: DCOP communication error! normalo@c3po:~/scripte> FAKETIME_OFFSET=60; export FAKETIME_OFFSET normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log kdecore (KAction): WARNING: KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance ) [/Log] Ohne Umgebungsvariable sind keine Probleme, mit OFFSET=60 auch nicht, wie erwartet ergibt ein date=Systemzeit+1Min, mit OFFSET=3600 läufts nicht... Hat das was mit der Fehlermeldung beim gcc-Lauf zu tun? Werde da wohl morgen noch "ein wenig" Zeit investieren müssen... Gruss Mario - -- Linux - The choice of the GNU generation. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD8DBQE/rVtPJLVeVMKCIQMRAv3vAKDVIfm8kicIJac1+3RAhnY6hYpIlQCbBBZM +iFKcD3B2ea3hLatojGy+D0= =YR50 -----END PGP SIGNATURE-----
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hab noch ein wenig rumprobiert, bis FAKETIME_OFFSET=1200 funktionierts, danach gehts nicht mehr. Ich habe den Verdacht, dass mit der lib gleichzeitig auch der Windowmanager ausgetrickst wird. Und der erkennt dann einen "vermeintlichen" timeout... Da beisst sich die Katze in den Schwanz... oder so ähnlich... Hmm, 1200 entspricht 20 Min. ... Wenn ich ein Script schreibe das sich selbst dreimal rekursiv mit dieser Option lädt, könnte ich ans Ende der Kette mein wine hängen... grmpf, ich hab keine Lust mehr für heute. Werd mich morgen noch mal dransetzen... Nacht Mario - -- Die letzten Worte eines Computerusers: Der Hersteller sagt, daß sich diese zwei Karten vertragen! -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD4DBQE/rV4JJLVeVMKCIQMRAgrQAJjr0RWc7xQcrez1n/EaAE6lBwigAKDPOZUd 4aCVElQsuNdGrNKs18wTaQ== =WVcL -----END PGP SIGNATURE-----
On Sat, 08 Nov 2003 at 22:08 (+0100), Mario van der Linde wrote:
also, der Ansatz ist vielversprechend, allerdings:
[Log ] normalo@c3po:~/scripte> gcc -W -Wall -shared -wl,-soname,faketime -o libfaketime.so timefake.c -ldl 2> gcc_log gcc: unrecognized option `-wl,-soname,faketime'
Dein Copy&Paste funktioniert nicht. Das W muss groß sein gcc -W -Wall -shared -Wl,-soname,faketime -o libfaketime.so timefake.c -ldl
normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log kdecore (KAction): WARNING: KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance )
normalo@c3po:~/scripte> FAKETIME_OFFSET=3600; export FAKETIME_OFFSET normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log Xlib: connection to ":0.0" refused by server Xlib: Excessive XDM-AUTHORIZATION-1 time offset kate: cannot connect to X server :0.0 ERROR: KUniqueApplication: Registering failed! ERROR: KUniqueApplication: DCOP communication error!
vorher xhost +localhost. Damit wird XDM-AUTHORIZATION-1 umgangen. Allerdings solltest Du das nur tun wenn Du nicht andere böse Benutzer auf Dinem PC hast.
normalo@c3po:~/scripte> FAKETIME_OFFSET=60; export FAKETIME_OFFSET normalo@c3po:~/scripte> LD_PRELOAD=/lib/libfaketime.so kate 2>> gcc_log kdecore (KAction): WARNING: KActionCollection::KActionCollection( QObject *parent, const char *name, KInstance *instance ) [/Log]
Ohne Umgebungsvariable sind keine Probleme, mit OFFSET=60 auch nicht, wie erwartet ergibt ein date=Systemzeit+1Min, mit OFFSET=3600 läufts nicht... Hat das was mit der Fehlermeldung beim gcc-Lauf zu tun?
Nein. Mit den genannten Mitteln läuft bei mir xclock richtig falsch. Wine lässt sich starten wenn man mit LD_PRELOAD den absoluten Pfad angibt. Allerdings liefert wine clock die richtige Zeit. Scheinbar verwendet Wine eine andere Zeitfunktion, die noch überschrieben werden muss. Das herauszufinden überlasse ich allerdings anderen. Vielleicht fallen David, Philipp & Co. noch ein paar potentielle Zeitfunktionen der libc ein, die Wine verwenden kann. Zaubern kann Wine ja auch nicht ... Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Die Praxis sollte ein Ergebnis des Nachdenkens sein, nicht umgekehrt. -- Hermann Hesse
Bernhard Walle schrieb:
[...] Mit den genannten Mitteln läuft bei mir xclock richtig falsch. Wine lässt sich starten wenn man mit LD_PRELOAD den absoluten Pfad angibt. Allerdings liefert wine clock die richtige Zeit. Scheinbar verwendet Wine eine andere Zeitfunktion, die noch überschrieben werden muss. Das herauszufinden überlasse ich allerdings anderen.
Vielleicht fallen David, Philipp & Co. noch ein paar potentielle Zeitfunktionen der libc ein, die Wine verwenden kann. Zaubern kann Wine ja auch nicht ...
Kenne mich leider nicht sonderlich gut mit Linux-Sourcen aus, wenn ich es aber richtig interpretiere, ist die zentrale Zeit-Funktion in der Wine-Implementierung der Windows-APIs NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ). Diese mach Gebrauch von gettimeofday, die wiederum linux/time.h bzw. sys/time.h deklariert ist. Eventuell muß man an der auch noch drehen. -- Gruß, Alex
Hallo Alex, On Sat, 08 Nov 2003 at 23:31 (+0100), Alexander Veit wrote:
Bernhard Walle schrieb:
[...] Mit den genannten Mitteln läuft bei mir xclock richtig falsch. Wine lässt sich starten wenn man mit LD_PRELOAD den absoluten Pfad angibt. Allerdings liefert wine clock die richtige Zeit. Scheinbar verwendet Wine eine andere Zeitfunktion, die noch überschrieben werden muss. Das herauszufinden überlasse ich allerdings anderen.
Vielleicht fallen David, Philipp & Co. noch ein paar potentielle Zeitfunktionen der libc ein, die Wine verwenden kann. Zaubern kann Wine ja auch nicht ...
Kenne mich leider nicht sonderlich gut mit Linux-Sourcen aus, wenn ich es aber richtig interpretiere, ist die zentrale Zeit-Funktion in der Wine-Implementierung der Windows-APIs
NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ).
Diese mach Gebrauch von gettimeofday, die wiederum linux/time.h bzw. sys/time.h deklariert ist. Eventuell muß man an der auch noch drehen.
genial! Hier bei mir lässt sich damit clock von wine dazu überreden, die
falsche Zeit anzuzeigen.
Hätte ich nie gefunden weil ich die Win-API überhaupt nicht kenne. Damit
sollte das Problem dann gelöst sein.
Wichtig: xhost +localhost sonst starten keine X-Applikationen mit
gefälschter Zeit.
Der komplette Quellcode nochmal:
==============================================================================
/*
* timefake.c
*
* Fälscht die Systemzeit durch Überschreiben von time().
* Die Umgebungsvariable FAKETIME_OFFSET enthält den Wert, um den verschoben
* werden soll. Existiert diese Variable nicht, passiert nichts.
*
* Kompilieren mit
* gcc -W -Wall -shared -Wl,-soname,faketime -o libfaketime.so timefake.c -ldl
*
* Konfigurieren mit
* FAKETIME_OFFSET=60 # eine Minute
* export FAKETIME_OFFSET
*
* Benutzen mit
* LD_PRELOAD=./libfaketime.so <Programm>
*
* Siehe auch: dlopen(3)
*/
/* We need this for RTLD_NEXT */
#define _GNU_SOURCE
#include
Hallo Bernhard
[...]
aber richtig interpretiere, ist die zentrale Zeit-Funktion in der Wine-Implementierung der Windows-APIs
NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ).
Diese mach Gebrauch von gettimeofday, die wiederum linux/time.h bzw. sys/time.h deklariert ist. Eventuell muß man an der auch noch drehen.
genial! Hier bei mir lässt sich damit clock von wine dazu überreden, die falsche Zeit anzuzeigen.
Hätte ich nie gefunden weil ich die Win-API überhaupt nicht kenne. Damit sollte das Problem dann gelöst sein.
Wichtig: xhost +localhost sonst starten keine X-Applikationen mit gefälschter Zeit.
Der komplette Quellcode nochmal:
[...]
Schön! Jetzt fehlt nur noch der Patch, der das FAKETIME_OFFSET-Feature in Wine implementiert. Wäre noch eleganter ;-) -- Viele Grüße, Alex
On Sun, 09 Nov 2003 at 00:10 (+0100), Alexander Veit wrote:
[...]
aber richtig interpretiere, ist die zentrale Zeit-Funktion in der Wine-Implementierung der Windows-APIs
NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ).
Diese mach Gebrauch von gettimeofday, die wiederum linux/time.h bzw. sys/time.h deklariert ist. Eventuell muß man an der auch noch drehen.
genial! Hier bei mir lässt sich damit clock von wine dazu überreden, die falsche Zeit anzuzeigen.
Hätte ich nie gefunden weil ich die Win-API überhaupt nicht kenne. Damit sollte das Problem dann gelöst sein.
Wichtig: xhost +localhost sonst starten keine X-Applikationen mit gefälschter Zeit.
Der komplette Quellcode nochmal:
[...]
Schön! Jetzt fehlt nur noch der Patch, der das FAKETIME_OFFSET-Feature in Wine implementiert. Wäre noch eleganter ;-)
das wäre umständlicher, weil man dann Wine neu kompilieren müsste, was wesentlich länger dauert als ein C-Programm mit 100 Zeilen. :-) Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Feature freeze means, that everyone has a bad feeling when he changes something, almost nothing more :)" -- Stephan Kulow
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Moin... Danke Leute, es funktioniert perfekt. Ich habe mal in die Sourcen geschaut und sehe da noch viel Lernstoff vor mir liegen (wenn man versteht warum eine Lösung funktioniert, ist das ja viel befriedigender als nur blind eine Anleitung zu befolgen), aber hauptsache es läuft. Gruss Mario - -- Die letzten Worte von Tarzan: Welcher verdammte Idiot hat die Liane geööööööölt... -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD8DBQE/rhcFJLVeVMKCIQMRApOoAKDFFDc4pkbc4tdvZXm/RbBK78RUUwCgqAPx Yju4cFOhR9JHTP4/AJvpibg= =GwoH -----END PGP SIGNATURE-----
Hallo Mario, hallo Leute, Am Samstag, 8. November 2003 18:43 schrieb Mario van der Linde:
gpgkeys: key 24B55E54C2822103 not found on keyserver
Kannst Du Deinen GPG-Schlüssel bitte mal auf einem Keyserver ablegen? Ansonsten ist die Signatur recht sinnlos, da nicht nachprüfbar. (falls Du es schon gemacht hast und nur mein Keyserver lahmt, vergiss diesen Hinweis ;-)
[...] haben eine Anwendung die nicht auf Linux portiert werden kann und unter wine läuft. Funktioniert auch soweit, bis auf eins: Die Client-Anwendung kommt nicht mit der Systemzeit klar. Das sieht dann so aus, dass im Wareneingang am Win-Client die Sendung im Eingang gescannt wird und 15 Min. später am Linux-Client im Warenausgang, der Server jedoch dann in seinen Logs stehen hat, dass die Ware 45 Min. bevor sie im Eingang war schon im Ausgang gescannt wurde... Ähh, Ihr könnt mir folgen...?
Frage: Besteht vielleicht die Möglichkeit, einem Programm (in dem Fall wine) durch ein Script eine andere Systemzeit vorzusetzen, sprich eine entsprechende Anfrage von wine abzufangen und durch ein Script zu beantworten...?
Sollte funktionieren. Als Beispiel: cb@tux:~> date Sa Nov 8 19:49:18 CET 2003 cb@tux:~> TZ=GMT date Sa Nov 8 18:49:24 GMT 2003 Jetzt musst Du Dir nur noch eine passende Zeitzone [1] suchen ;-) Gruß Christian Boltz [1] In /usr/share/zoneinfo/posix gibts genug davon ;-) -- "Ihr DNS liefert falsche IPs für unsere Domain!" "Diese Domain wird gar nicht bei uns gehostet!" "Ja eben, ihr Dödel! Nehmt die aus eurem DNS raus!" "Die kann nicht in unserem DNS sein. Wir hosten diese Domain nicht." "Ich weiss, wo deine Karre steht, Blödmann!" "Ich sehe gerade, wir haben versehentlich ihre Domain in unserem DNS..." [Ratti in linux-liste]
On Sat, 08 Nov 2003 at 20:53 (+0100), Christian Boltz wrote:
Am Samstag, 8. November 2003 18:43 schrieb Mario van der Linde:
gpgkeys: key 24B55E54C2822103 not found on keyserver
[...] haben eine Anwendung die nicht auf Linux portiert werden kann und unter wine läuft. Funktioniert auch soweit, bis auf eins: Die Client-Anwendung kommt nicht mit der Systemzeit klar. Das sieht dann so aus, dass im Wareneingang am Win-Client die Sendung im Eingang gescannt wird und 15 Min. später am Linux-Client im Warenausgang, der Server jedoch dann in seinen Logs stehen hat, dass die Ware 45 Min. bevor sie im Eingang war schon im Ausgang gescannt wurde... Ähh, Ihr könnt mir folgen...?
Frage: Besteht vielleicht die Möglichkeit, einem Programm (in dem Fall wine) durch ein Script eine andere Systemzeit vorzusetzen, sprich eine entsprechende Anfrage von wine abzufangen und durch ein Script zu beantworten...?
Sollte funktionieren. Als Beispiel:
cb@tux:~> date Sa Nov 8 19:49:18 CET 2003 cb@tux:~> TZ=GMT date Sa Nov 8 18:49:24 GMT 2003
Jetzt musst Du Dir nur noch eine passende Zeitzone [1] suchen ;-)
ist doch die gleiche Zeit nur eine andere Repräsentation. Kann mir nicht vorstellen dass das was ändert, ansonsten wäre Wine ziemlich buggy. Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ * Linux Viruscan..... Windows 95 found. Remove it? (y/n)
Hallo Bernhard, hallo Leute, Am Samstag, 8. November 2003 21:02 schrieb Bernhard Walle:
On Sat, 08 Nov 2003 at 20:53 (+0100), Christian Boltz wrote:
Am Samstag, 8. November 2003 18:43 schrieb Mario van der Linde: [...]
Frage: Besteht vielleicht die Möglichkeit, einem Programm (in dem Fall wine) durch ein Script eine andere Systemzeit vorzusetzen, sprich eine entsprechende Anfrage von wine abzufangen und durch ein Script zu beantworten...?
Sollte funktionieren. Als Beispiel:
cb@tux:~> date Sa Nov 8 19:49:18 CET 2003 cb@tux:~> TZ=GMT date Sa Nov 8 18:49:24 GMT 2003
Jetzt musst Du Dir nur noch eine passende Zeitzone [1] suchen ;-)
ist doch die gleiche Zeit nur eine andere Repräsentation. Kann mir nicht vorstellen dass das was ändert, ansonsten wäre Wine ziemlich buggy.
Nicht unbedingt ;-) Probier beispielsweise mal mit TZ=America/New_York xclock -title "NY" Ich war zwar noch nie dort, aber die Uhren gehen auf jeden Fall anders ;-) Wie wine auf $TZ reagiert, kann ich Dir allerdings nicht sagen. Gruß Christian Boltz -- [Festplatte im Wechselrahmen] Oder meinst du, da du mehrere Platten hast, die sich nicht im Gehäuse in die Quere kommen, springen keine Pinguine auf die Windowsplatte und zertrümmern die Fenster mit ih- ren Watschelbeinchen. [Thorsten von Plotho-Kettner in suse-linux]
participants (4)
-
Alexander Veit
-
Bernhard Walle
-
Christian Boltz
-
Mario van der Linde