2011-10-21 12 views
12

Czy na komputerze z systemem Windows można sprawdzić, czy czas został zmieniony wstecz bez ciągłego monitorowania komunikatów WM_TIMECHANGE?Czy istnieje sposób na sprawdzenie, czy zegar systemowy został cofnięty w oknach?

Na przykład chciałbym, aby pierwszą rzeczą, którą moja aplikacja robi podczas uruchamiania, jest sprawdzenie, czy czas został zmieniony od czasu ostatniego uruchomienia aplikacji.

O ile widzę, jedynym sposobem na zobaczenie zmiany jest przejrzenie komunikatu WM_TIMECHANGE, ale zobaczę, że tylko wtedy, gdy moja aplikacja jest uruchomiona.

+0

możliwy duplikat [Czy istnieje zdarzenie API dla osoby zmieniającej zegar w systemie Windows?] (Http://stackoverflow.com/questions/756506/is-there-an-api-event-for-when-person- zmienia zegar na oknach) –

+1

Byłbym bardzo, bardzo zaskoczony, gdyby był sposób na zrobienie tego. Nie jest to również duplikat (pytanie wyraźnie stwierdza "bez' WM_TIMECHANGE "). – Jon

+2

Nie sądzę, że jest to duplikat, ponieważ szukam sposobu, aby wykryć zmianę po fakcie. Pozostałe pytania dotyczą wykrycia zmiany, kiedy to się stanie. –

Odpowiedz

17

Tak. Możesz przeczytać Windows Event Logs i poszukać zmian w czasie systemowym. (Zmiany czasu systemowego są jednym ze zdarzeń systemowych, które są automatycznie rejestrowane.) Na przykład, po prostu poprawiłem czas systemowy o kilka sekund, a w dzienniku zdarzeń systemowych pojawiło się następujące:

Informacje 10/21/2011 11:16:26 Kernel-General 1 Brak

Czas systemowy zmieniono na 2011 - 10 - 21T16: 16: 26.000000000Z od 2011 - 10 - 21T16: 16: 26000000000Z.

Możesz następnie zapytać o te zdarzenia, aby ustalić, czy rzeczywiście został zmieniony czas. W tym rozwiązaniu najlepsze jest to, że jest wbudowany i zawsze działa. Nie musisz monitorować zdarzeń za pomocą niestandardowej usługi itp. Po prostu zapytujesz dane systemu operacyjnego.

To nadal nie jest rozwiązanie zabezpieczone przed kulami. ponieważ osoby z prawami administratora mogą konfigurować przypadki, czyścić logi itp. Ale na pewno zainstalowałbyś dla swojej aplikacji ochronę. Dzienniki zdarzeń systemowych nie są czymś, o czym zwykli użytkownicy systemu Windows myślą.

XML dla tego konkretnego przypadku: (de-zidentyfikowany dla prywatności & bezpieczeństwa)

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
    <System> 
    <Provider Name="Microsoft-Windows-Kernel-General" 
     Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" /> 
    <EventID>1</EventID> 
    <Version>0</Version> 
    <Level>4</Level> 
    <Task>0</Task> 
    <Opcode>0</Opcode> 
    <Keywords>0x8000000000000010</Keywords> 
    <TimeCreated SystemTime="2011-10-21T16:16:26.001000000Z" /> 
    <EventRecordID>138478</EventRecordID> 
    <Correlation /> 
    <Execution ProcessID="40044" ThreadID="50016" /> 
    <Channel>System</Channel> 
    <Computer>xxxxx.xxxxxxxxx.org</Computer> 
    <Security UserID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 
    </System> 
    <EventData> 
    <Data Name="NewTime">2011-10-21T16:16:26.000000000Z</Data> 
    <Data Name="OldTime">2011-10-21T16:16:26.000000000Z</Data> 
    </EventData> 
    </Event> 
+0

Myślę, że to jest poprawna odpowiedź. Właśnie sprawdziłem swój dziennik i widzę pewne zmiany czasu. Zamierzam napisać małe narzędzie do wyszukiwania i zrzucania zmian. Dzięki za pomoc. –

+0

Ale te zdarzenia można usunąć, więc nadal nie jest wiarygodnym źródłem informacji. –

+0

Podczas gdy eleganckie rozwiązanie, Paul, nadal będę twierdził, że nie jest to źródło kanoniczne i nie należy polegać na nim. NIE MOŻNA ustalić, czy czas został zmieniony. Wspomniane wyżej zdarzenia mogą zostać usunięte, ale można je całkowicie ominąć, jeśli zmienisz czas z innego systemu operacyjnego na tym samym komputerze lub z samego BIOS-u. –

3

Nie, nie możesz. Dlatego też systemy DRM zależne od czasu są generalnie raczej bezużyteczne.

Możesz możesz spróbować rozwiązać ten problem, korzystając z usługi, a następnie musisz obejść przestoje usługi, używając innego hackowania, a także innego hackowania.

W każdym razie, jeśli to wszystko, starasz się zrobić to po prostu przechowywania gdzieś (szyfrowane, ewentualnie) wartość czasu systemowego na zamknięcie Twojego programu, a następnie upewniając się, że nie została przyjęta na starcie programu powinien być wystarczającym. Nie zatrzyma to użytkowników, którzy zasadniczo "zamrozi" czas od zamknięcia do uruchomienia, ale to wystarczy dla 9/10 osób, które próbują przedostać się na czas.

+0

+1 Dobre rozważania. –

+0

Zastanów się nad zmianami stref czasowych lub użytkownikami przekraczającymi linię daty. – peterchen

2

Można mieć swoją aplikację (gdy zdarza się być uruchomiony) okresowo porównać czas systemowy z czasem pobranego od gdzieś znajduje się zasób serwera. Jeśli nagle zauważysz, że różnica między czasem systemowym a czasem serwera wzrosła, oznacza to, że czas systemowy został cofnięty.

Oczywiście nie działałoby to na komputerze bez dostępu do Internetu.

2

Jeden pomysł na to powyżej (podczas gdy zauważam, że sprawdzenie zewnętrznego zegara jest ostateczną odpowiedzią, jeśli jest to wykonalne) - możesz także okresowo odczytać zegar systemowy i przechowywać go, być może zaszyfrowanego, w ukrytym pliku gdzieś. Za każdym razem, gdy to robisz, sprawdzasz, czy nowa wartość jest nowsza od tej w pliku. Spust do zrobienia tego może być przy każdym starcie itp.

Tak jak wszystkie metody wewnętrzne, ten jest podatny na kogoś, kto znajduje ukryty plik. Można również zgłosić problem, jeśli ukryty plik nie jest dostępny lub jego datownik nie pasuje do jego zawartości.

+0

Proszę nie podpisywać swoich postów. Nie musisz też podawać ujawnienia, chyba że Twoja odpowiedź promuje produkt, firmę lub witrynę internetową, z którą jesteś powiązany. –

Powiązane problemy