Chrono Mock

Pytania i odpowiedzi

Krótkie odpowiedzi, razem z tymi o tym, czego to narzędzie nie zrobi.

Czy to zmienia zegar mojego komputera?

Nie i nigdy nie będzie - to jest cały sens tego narzędzia. Przesunięty czas widzi jeden proces i uruchomione przez niego procesy potomne. Logowanie do domeny, certyfikaty, Windows Update i wszystkie inne aplikacje przez cały czas widzą prawdziwą datę.

Czy potrzebuję uprawnień administratora?

Nie. Nie ma instalatora, nic nie trafia do rejestru, a całość działa z folderu, który możesz nosić na pendrive.

Czy zadziała z moją aplikacją?

Uczciwa odpowiedź brzmi: żadne narzędzie tego typu nie może tego obiecać z góry - więc zamiast obiecywać, mierzy. Każda sesja kończy się werdyktem (działa, działa częściowo, nie działa), listą kanałów czasu, które aplikacja naprawdę czytała, wraz z liczbą wywołań każdego, oraz listą kanałów, które nie zostały objęte.

Aplikacja może czytać zegar drogą, której nic nie przechwyciło - z serwera, z bazy danych, przez warstwę środowiska uruchomieniowego. Kiedy tak się dzieje, dowiadujesz się o tym, zamiast zakładać, że test przeszedł.

Czy działa z aplikacjami .NET, Javy i Pythona?

Częściowo i różnice mają znaczenie. Wszystkie trzy są oznaczone jako eksperymentalne: działają na naszych celach testowych, nie były testowane szeroko, a źródłem prawdy jest wbudowany audyt, nie ten akapit.

  • .NET - zegar ścienny i strefa sesji są objęte. Stopwatch zostaje na prawdziwym liczniku wysokiej rozdzielczości, chyba że włączysz jego skalowanie.
  • Java - zegar ścienny i czas trwania są objęte. Strefa sesji nie jest osiągana i jest to znana dziura.
  • Python - time.time i datetime są objęte. perf_counter, a od Pythona 3.13 również monotonic, siedzą na liczniku wysokiej rozdzielczości, chyba że włączysz skalowanie.

Czy działa z aplikacjami Electron i Chromium?

Tak, innym mechanizmem. Ich zegar żyje w piaskowanym rendererze, do którego wstrzyknięcie nie sięga, więc aplikacja jest uruchamiana z portem debugowania i czystym, jednorazowym profilem, a jej własne API czasu w JavaScripcie zostają przestawione na zegar sesji - również wewnątrz Web Workerów, gdzie często faktycznie mieszka odliczanie.

Jedno ograniczenie warto znać: w tym trybie sesja idzie za strefą hosta. Fałszowana jest chwila, a nie funkcje czasu lokalnego.

Jak działa tryb Chromium i Electron - co obejmuje, czego nie, i dlaczego port debugowania jest tą częścią, o której trzeba wiedzieć.

Czy mogę sprawić, żeby czas płynął szybciej?

Tak. Wybierasz całkowity mnożnik i zegar aplikacji idzie w tym tempie - x1440 zamienia dobę w minutę, więc 30-dniowa wersja próbna wygasa w jakieś pół godziny. Zegar można też zamrozić albo skakać nim w przód i w tył w trakcie sesji.

Odliczania i timery leżą na osobnej osi, a ich przyspieszanie to osobny przełącznik, bo skalowanie ich zmienia zachowanie, na którym wiele aplikacji polega.

Czy mogę zmienić samą strefę czasową, bez zmiany daty?

Tak. Sesja niesie własny stały offset, widoczny dla tego procesu, podczas gdy strefa systemu zostaje dokładnie tam, gdzie była. To jest część, którą większość narzędzi pomija, a właśnie tak odtwarza się błąd pojawiający się wyłącznie u klienta pięć stref czasowych dalej.

A co z czasem letnim?

Strefa sesji to stały offset bez czasu letniego. Sesja ustawiona na Polskę zostaje przy wybranym offsecie niezależnie od tego, czy jej zegar pokazuje marzec, czy lipiec, więc przebieg przecinający prawdziwą zmianę czasu rozjedzie się o godzinę z tym, co ta strefa naprawdę by pokazała.

Przeprowadzenie aplikacji przez zmianę czasu nie jest więc czymś, co to narzędzie na razie robi, a kalkulator dat mówi o tym wprost, zamiast zgadywać.

Dlaczego mój antywirus to zgłasza?

Bo wstrzyknięcie biblioteki do cudzego procesu to legalna, udokumentowana technika Windows, której używa również złośliwe oprogramowanie. To fałszywy alarm wywołany techniką, a nie tym, co narzędzie robi z komputerem. Wstrzykiwana biblioteka to chrono_hook.dll, zbudowana z publicznego kodu na licencji GPL-3.0 i możesz ją zbudować sam. Tryb Chromium i Electron w ogóle nie wstrzykuje.

Strona pobierania mówi, co z tym zrobić.

Czy to sposób na przedłużenie wersji próbnej albo obejście licencji?

Nie i nie jest do tego zbudowane. Chrono Mock służy do testowania oprogramowania, za które odpowiadasz - własnego wygasania licencji, własnej logiki odnowień, własnego raportu na koniec miesiąca. Żaden przykład, preset ani strona tutaj nigdy nie pokaże przedłużania cudzej wersji próbnej.

Oprogramowanie z ochroną licencji jest zresztą przypadkiem, w którym to narzędzie najpewniej polegnie: kod zabezpieczający często czyta czas drogami dobranymi tak, żeby trudno je było przechwycić, a cofnięcie zegara to warunek, pod który taki kod jest wprost pisany. Planowana jest funkcja skierowana w drugą stronę - tryb, który przepuszcza twoją własną aplikację przez serię manipulacji czasem i raportuje, które z nich twoje zabezpieczenie wychwyciło.

Czy mogę użyć tego w ciągłej integracji?

Tak. Wersja konsolowa to osobna paczka o rozmiarze około 1,6 MB, bez żadnego środowiska do instalowania. Każda komenda mówi --json i kończy się kodem wyjścia, na którym potok może się rozgałęzić, a sesja potrafi zapisać swój dowód do pliku.

Czym to się różni od RunAsDate?

RunAsDate przechwytuje pięć funkcji zegara ściennego i robi to dobrze. To narzędzie obejmuje 41 kanałów czasu, potrafi przyspieszyć zegar, daje procesowi własną strefę czasową, podąża za procesami potomnymi i mówi po fakcie, które kanały naprawdę zostały objęte. Jest też otwartoźródłowe, podczas gdy RunAsDate to zamknięty freeware.

Pełne porównanie mówi też, w czym RunAsDate jest lepszym wyborem.

Czy to libfaketime na Windows?

W zamyśle tak - ta sama idea przesuwania czasu dla jednego programu zamiast dla całej maszyny. W praktyce to inna implementacja, bo libfaketime opiera się na LD_PRELOAD, którego na Windows nie ma. Jest o tym osobna strona.

Czy jest darmowe i czy coś gdzieś wysyła?

Darmowe i otwartoźródłowe na licencji GPL-3.0. Bez konta, bez telemetrii i bez jakiegokolwiek kontaktu z siecią - całe narzędzie działa z wyciągniętym kablem.