Skocz do zawartości

Niezależny zegar gry


V Fighter

Rekomendowane odpowiedzi

Witam. W wielu grach typu klikacze, jest coś takiego, że kiedy na przykład nie gramy, a wejdziemy do gry po jakimś czasie, gra daje nam jakiś bonus w zależności od tego, jak długo nas nie było. Z tym, że zwykłe zapisywanie daty przy wyjściu z gry i porównywanie zapisu z aktualną przy ponownym starcie jest nienajlepszym rozwiązaniem, bo gracz może wyjść z gry i zmienić datę w systemie, a gdy wejdzie, otrzyma bonus, na który powinien czekać. Mam nadzieję, że dobrze to opisałem. I pytanie brzmi, jak mogę tego dokonać?  Jak zabezpieczyć grę przed takimi oszustwami? Gra potrzebuje swojego niezależnego od systemu zegara. Dodam tak od razu, że gra jest offline. Dziękuję za przeczytanie i czekam niecierpliwie na pomoc kogoś doświadczonego

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm. Pomysł niesamowicie prosty i całkiem dobry. Jednak to taka prowizorka trochę :/. Ale jak to robią gry tego typu. Już nieraz próbowałem to obejść na Androidzie. Wyłączałem grę, dla pewności Internet, Dane Komórkowe, Wi Fi... Zmieniałem godzinę o +1h, ale gdy odpaliłem grę, nic się w niej nie zmieniło. Nawet próbowałem z restartem telefonu, bo podejrzewałem, że gra utworzyła sobie jakiś mini serwer na telefonie, dzięki czemu serwer niezależnie liczy czas, a gra go sprawdza. Jednak taki serwer najwidoczniej jest jakoś dobrze ukryty przed zamykaniem procesów i nie mam pojęcia, bo to już kosmiczne domysły, ale musi działać nawet, jeśli telefon jest wyłączony. Wiele gier tak przetestowałem i wszystkie mają taki mechanizm, To trochę tak, jakby korzystały z wbudowanego zegara w urządzeniu. Tak samo, jak w PC na płycie głównej też jest zegar (taki mały srebrny walcowy element podobny do kondensatora prawdopodobnie), dzięki któremu jeśli mamy kompa bez neta, a go ponownie odpalimy, to godzina jest aktualizowana. Więc już nie wiem, aktualnie jestem głupi i prosiłbym, żeby mnie ktoś jakoś oświecił w tym temacie. I am Lord, masz dobry pomysł, ale to tymczasowa alternatywa dla tego, czego szukam. Na Marketplace'ie się tego nie znajdzie, na Google po angielsku się tego też nie znajdzie, nie wiem, jak oni to robią, a rozwiązanie jest pewnie banalnie proste...

Odnośnik do komentarza
Udostępnij na innych stronach

Ale jednak prosi o połączenie z netem. A jest też sporo takich gier offline. Na razie nie mogę przytoczyć przykładu, ale jak będę miał możliwość, to wrzucę tu kilka. A jak sprawa wyglądałaby, gdybym chciał pozyskać przez moją grę czas z jakiegoś serwera? Jakiegokolwiek nawet. Mógłbym zobaczyć jakiś prosty kod? Prawdę mówiąc zawsze odstraszało mnie programowanie gierek online, bo nigdy mi się to nie udawało

Odnośnik do komentarza
Udostępnij na innych stronach

Dowiedziałem się dziś, że można w jakiś sposób pobrać znacznik czasowy GPS (Android), który jest zegarem niezależnym od ustawienia zegara systemowego. No ale co z tego, jak nie wiem, jak te dane pobrać. Chyba DLLkę będzie trzeba do tego zrobić, czy coś w ten deseń. Ale to tak, jak z Księżycem. Wiem, że można na nim wylądować, ale za cholerę nie wiem, jak wystartować xd.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jeśli to gra na androida, to ja bym po prostu raz na sekundę zapisywał w pliku INI obecny czas, a potem jak odpalasz grę odczytywał ten czas, odejmował od obecnego i wykonał skrypt dodający zasoby na podstawie czasu np.:

GOLD = floor(sekundy/120); // 1 złoto co 2 sekundy
WOOD = floor(sekundy/240); // 1 drewno co 4 sekundy

Argument, że można zhackować jest słaby, bo nawet jakbyś przes sieć przesyłał czas, to można zhackować request np. przepuszczając go przez PC który udaje router (udostępnianie internetu).

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

ja bym zapisał poza czasem, jego hash + jakaś sól :)

 

np. md5('tajne' + string(time));

 

a potem przy odczycie porównał, to dopiero dekompilacja źródła by pomogła obejść takie coś :) jak ktoś podmieni czas, to policzymy mu 0 sekund.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli pozyskanie czasu z serwera jest proste, to ja poproszę o jakiś kod, jak to pobrać. Bo z tym offline to chyba jest jakaś tajemnica ogromna, strzeżona jak granice "płaskiej Ziemi" według płaskoziemców xd. Serio, jak pobrać datę z serwera? Zawsze to komuś pomoże, kto tu zerknie. Takie alternatywne rozwiązanie problemu :).

 

gnysek, co to da? Przecież jeśli zdekodujesz zapisany czas na przykład przy ponownym odpaleniu gry, to jeśli będziesz chciał porównać czas, to tylko z systemowym. A systemowy jest modyfikowalny. Równie dobrze można ostatni czas zapisać po prostu w INI. Chyba, że nie zrozumiałem Twojej idei, bo w pracy przysypiam czytając to xd

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
14 godzin temu, Threef napisał:

Wystarczy zapytanie do serwera o czas.

Puszczasz request przez PC, ustawiasz przekierowanie domeny na 127.0.0.1 w pliku hosts, robisz skrypt php który zwraca inny czas - oszukane.

 

Tak samo jak przy zmianie zegara w telefonie.

 

A czas z serwera pobierasz tak, że robisz skrypt PHP który go zwraca - nie pamiętam czy GMS potrafi czytać czas unixowy, wtedy wystarczy "echo time();".

Odnośnik do komentarza
Udostępnij na innych stronach

5 godzin temu, gnysek napisał:

Puszczasz request przez PC, ustawiasz przekierowanie domeny na 127.0.0.1 w pliku hosts, robisz skrypt php który zwraca inny czas - oszukane.

Chyba że pobierasz więcej danych niż sam unix time, albo jeszcze szyfrujesz jakimś banalnym sposobem.

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz to zrobić na wiele sposóbów. Po swojemu to potrzebujesz server z PHP na którym wrzucisz plik czas.php a w nim to co podał gnysek. 

Później twoja gra odpytuje ten plik na twoim serwerze przy pomocy funkcji http_get().

 

Drugie rozwiązanie to odpytywanie jakiegoś publicznego API takie jak to http://api.geonames.org/timezoneJSON?formatted=true&lat=47.01&lng=10.2&username=demo&style=full

Zwraca ci ono informacje jako JSON. Możesz je odczytać przy pomocy funkcji json_encode() która zamienia te dane w ds_map który potem możesz odczytać. Wszystkie przykłady są w dokumentacji przy każdej z tych funkcji.

Odnośnik do komentarza
Udostępnij na innych stronach

json_decode() :P i opcja z tamtym API jest lepsza, poniewaz nie zamieniasz gotowej opony na drewniane kolo :D

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

ja bym zrobił tak, że w kodzie PHP dajesz:

<?php
$key = 'azs123123';
echo json_encode(array('time'=>time(), 'hash' => md5(time() . $key));

 

a po stronie GMa, jak odbierasz dane:

//result to ds_mapa już po json_decode

var time = result[? "time"];
var hash = result[? "hash"];
var key = "azs123123";
var check = md5( time + key); 

if (check == hash) {
 // czas z serwera jest niesfałszowany
}

 

Tak długo, jak ktoś nie znajdzie klucza w skompilowanej grze, tak długo system jest bezpieczny (bo hash z serwera będzie trudny do odczytania nawet z tablic tęczowych).

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...