Domanda

Sto giocando con un gioco per giocatore singolo nativo (non web) che sto scrivendo e mi è venuto in mente che avere un gioco giornaliero/settimanale/di tutti i tempi elenco dei punteggi online (pensa a Xbox Live Leaderboard) renderebbe il gioco molto più interessante, aggiungendo un po' di (piccola) quantità di community e competizione.Tuttavia, temo che le persone vedrebbero una funzionalità del genere come un invito all'hacking, il che scoraggerebbe i giocatori abituali a causa dei punteggi incredibilmente alti.

Ho pensato ai modi ovvi per prevenire tali tentativi (crittografia a chiave pubblica/privata, per esempio), ma ho scoperto modi ragionevolmente semplici in cui gli hacker potrebbero aggirare tutte le mie idee (estraendo la chiave pubblica dal binario e inviando così falsi codici crittografati punteggi, ad esempio).

Hai mai implementato un elenco dei punteggi più alti o una classifica online?Hai trovato un modo ragionevolmente a prova di hacker per implementarlo?Se è così, come avete fatto?Quali sono le vostre esperienze con i tentativi di hacking?

È stato utile?

Soluzione

Alla fine della giornata, fai affidamento sulla fiducia del cliente.Se il client invia replay al server, è abbastanza semplice replicare o modificare una riproduzione riuscita e inviarla al server.

La soluzione migliore è alzare il livello dell'imbroglio al di sopra di quello che un giocatore riterrebbe degno di essere superato.Per fare questo, ci sono una serie di tecniche collaudate (ma spesso non menzionate) che puoi utilizzare:

  1. Lascia gli imbroglioni della lista nera in un honeypot.Possono vedere i propri punteggi, ma nessun altro può farlo.A meno che non verifichino accedendo con un account diverso, pensano di aver violato con successo il tuo gioco.
  2. Quando qualcuno viene contrassegnato come imbroglione, rimanda che eventuali ripercussioni sull'account si manifestino fino a un determinato momento in futuro.Rendi questo punto casuale, entro uno o tre giorni.In genere, un imbroglione proverà più metodi e alla fine avrà successo.Rimandando il feedback sullo stato dell'account a una data successiva, non riescono a capire cosa li ha catturati.
  3. Cattura tutti i comandi dell'utente del gioco e inviali al server.Verificarli rispetto ad altri punteggi all'interno di un dato delta.Ad esempio, se il giocatore ha utilizzato l'azione di tiro 200 volte, ma ha ottenuto un punteggio di 200.000, ma i giocatori vicini nel gioco hanno sparato 5.000 volte per ottenere un punteggio di 210.000, potrebbe attivare una soglia che segnala alla persona ulteriori o umane azioni di tiro. indagine.
  4. Aggiungi valore e persistenza ai tuoi account utente.Se i tuoi account utente dispongono di elementi sbloccabili per il tuo gioco o se il tuo gioco richiede l'acquisto, il peso di un divieto è maggiore poiché l'utente non può riacquistare lo stato precedente dell'account semplicemente creando un nuovo account tramite un proxy basato sul web.

Altri suggerimenti

Nessuna soluzione sarà mai perfetta mentre il gioco è in esecuzione su un sistema sotto il controllo dell'utente, ma ci sono alcuni passaggi che potresti eseguire per rendere più problematico l'hacking del sistema.Alla fine, l'obiettivo può essere solo quello di rendere l'hacking del sistema più problematico di quanto valga la pena.

  • Invia alcune informazioni aggiuntive con le richieste del punteggio più alto per convalidarne una sul lato server.Se ottieni 5 punti per ogni X e il gioco contiene solo 10 X, allora hai alcuni cerchi extra da far passare all'hacker per far sì che il suo punteggio venga accettato come valido.
  • Chiedi al server di inviare una sfida casuale che deve essere soddisfatta con pochi byte del codice binario del gioco da quell'offset.Ciò significa che l'hacker deve tenere in giro una copia integra del codice binario (solo un po' più di problemi).
  • Se disponi di chiavi di licenza, richiedi punteggi elevati per includerle, in modo da poter vietare le persone sorprese ad hackerare il sistema.Ciò consente anche di tenere traccia dei tentativi non validi come definiti sopra, per vietare alle persone di testare il protocollo prima ancora di inviare un punteggio valido.

Tutto sommato, però, rendere il gioco abbastanza popolare da indurre le persone a volerlo hackerare è probabilmente una sfida molto più grande.

Onestamente non credo che sia possibile.

L'ho già fatto prima utilizzando una crittografia a chiave piuttosto semplice con un binario compresso che ha funzionato abbastanza bene per la sicurezza di cui avevo bisogno, ma onestamente penso che se qualcuno considera di hackerare la tua tabella dei punteggi migliori online, verrà fatto.

Ci sono alcune persone piuttosto tristi là fuori che sono anche piuttosto brillanti, a meno che tu non riesca a farle scopare tutte, è una causa persa.

Se il tuo gioco ha un sistema di replay integrato, puoi inviare i replay al server e fare in modo che il server calcoli il punteggio dal replay.

Questo metodo non è perfetto, puoi comunque imbrogliare rallentando il gioco (se è basato sull'azione) o scrivendo un bot.

Ho fatto alcune cose del genere con i miei giochi Flash, ed è davvero una battaglia persa.Soprattutto per ActionScript che può essere decompilato in codice abbastanza leggibile senza troppi sforzi.

Il modo in cui l'ho fatto è un approccio piuttosto convenzionale che prevede l'invio del punteggio e del nome del giocatore in testo semplice e quindi un hash dei due (opportunamente salato).Pochissime persone sono abbastanza determinate da fare lo sforzo di capirlo, e i pochi che lo sono lo farebbero comunque, annullando tutto il tempo che ci dedichi.

Per riassumere, la mia filosofia è dedicare il tempo a migliorare il gioco e rendere abbastanza difficile imbrogliare.

Una cosa che potrebbe essere piuttosto efficace è fare in modo che il gioco invii il punteggio al server più volte mentre giochi, inviando ogni volta un po' di informazioni di gioco, permettendoti di verificare se il punteggio è "realistico".Ma potrebbe essere davvero un po' esagerato.

Questa è una domanda davvero difficile.

Non ho mai implementato una cosa del genere, ma ecco una semplice approssimazione.

La tua preoccupazione principale è dovuta al fatto che gli hacker indovinano cosa sta facendo la tua applicazione e quindi inviano i propri risultati.

Beh, prima di tutto, a meno che la tua richiesta non abbia un grande successo, non mi preoccuperei.Fare una cosa del genere è estremamente difficile.

La crittografia non aiuterà a risolvere il problema.Vedete, la crittografia aiuta a proteggere i dati nel loro percorso ma non protegge nessuno dei due lati della transazione prima che i dati vengano crittografati (che è dove potrebbe risiedere la principale vulnerabilità).Quindi, se crittografi il sicuro, i dati rimarranno privati ​​ma non saranno al sicuro.

Se sei davvero preoccupato, suggerirò di offuscare il codice e progettare il sistema di punteggio in un modo che non sia del tutto ovvio cosa sta facendo.Qui possiamo prendere in prestito alcune cose da un protocollo di crittografia.Ecco un esempio:

  1. Diciamo che il punteggio è un numero m
  2. Calcola una sorta di controllo sul punteggio (ad esempio il CRC o qualsiasi altro sistema che vedi foots.In effetti, se ne inventi uno, non importa quanto sia noioso, funzionerà meglio)
  3. Ottieni la chiave privata dell'utente (D) dal tuo server remoto (ovviamente tramite una connessione sicura).Sei l'unico che conosce questa chiave.
  4. Calcola X=m^D mod n (n essendo il modulo pubblico del tuo algoritmo a chiave pubblica/privata) (ovvero, crittografalo: P)

Come vedi si tratta solo di offuscamento di altro tipo.Puoi scendere così quanto vuoi.Ad esempio puoi cercare i due numeri primi più vicini a X e usarli per crittografare il CRC e inviarlo anche al server in modo da avere il CRC e il punteggio separatamente e con schemi di crittografia diversi.

Se lo usi insieme all'offuscamento, direi che sarebbe difficile da hackerare.Tuttavia anche questo potrebbe essere decodificato, tutto dipende dall'interesse e dall'abilità dell'hacker ma...sul serio, che tipo di mostro impiega così tanti sforzi per cambiare i suoi risultati in un gioco?(A meno che non sia WoW o qualcosa del genere)

Un'ultima nota

Offuscatore per .NET

Offuscatore per Delphi/C++

Offuscatore per assemblatore (x86)

Come dice l'altra risposta, sei costretto a fidarti di un client potenzialmente dannoso e un semplice deterrente più un piccolo monitoraggio umano saranno sufficienti per un piccolo gioco.

Se vuoi essere fantasioso, devi cercare modelli di frode nei dati del punteggio, in modo simile a una società di carte di credito che esamina i dati di addebito.Maggiore è lo stato che il client comunica al tuo server, più facile sarà potenzialmente trovare un modello di comportamento corretto o errato tramite codice.Per esempio.supponiamo che il client abbia dovuto caricare un registro di controllo del punteggio basato sul tempo (che forse puoi anche utilizzare per consentire ad altri client di guardare i giochi migliori), il server può quindi convalidare se il registro del punteggio infrange una qualsiasi delle regole del gioco.

Alla fine, si tratta ancora di renderlo abbastanza costoso da scoraggiare gli imbrogli sul quadro di valutazione.Vorresti un sistema in cui puoi sempre migliorare il codice del server (più facile da aggiornare) per gestire eventuali nuovi attacchi al tuo sistema di convalida.

@Martino.

Credo che Mario Kart Wii funzioni così.Il vantaggio aggiuntivo è che puoi lasciare che tutti gli altri giocatori guardino come il detentore del punteggio più alto ha ottenuto il punteggio più alto.La cosa divertente è che se controlli il più velocemente "Vulcano brontolante" percorso temporale, vedrai che qualcuno ha trovato una scorciatoia che ti permette di saltare il 95% del percorso.Non sono sicuro che lo abbiano ancora come il tempo più veloce.

Non puoi farlo su una piattaforma client non attendibile.In pratica è possibile sconfiggere anche alcune piattaforme “affidabili”.

Esistono diversi attacchi impossibili da rilevare nel caso generale, principalmente quelli che modificano le variabili in memoria.Se non puoi fidarti delle variabili del tuo programma, non puoi ottenere molto.

Le altre tecniche descritte sopra possono aiutare, ma non risolvono il problema di base dell'esecuzione su una piattaforma non affidabile.


Per curiosità, sei sicuro che le persone proveranno a hackerare una tabella dei punteggi più alti?Sono ormai più di due anni che gioco online con una tabella dei punteggi più alta banalmente crackabe.Molte persone ci hanno giocato, ma non ho prove che qualcuno abbia provato a superare i punteggi più alti.

Di solito, il più grande difensore contro gli imbrogli e gli hacking è un community watch.Se un punteggio sembra piuttosto sospetto, un utente può segnalare il punteggio per cheat.E se un numero sufficiente di persone riporta quel punteggio, il replay può essere controllato dagli amministratori per verificarne la validità.È abbastanza facile vedere la differenza tra un bot e un giocatore reale, se c'è già un gruppo di giocatori che giocano al gioco in piena legittimità.

Gli amministratori devono supervisionare solo i punteggi che vengono messi in discussione, perché c'è una piccola possibilità che un gruppo di utenti possa salire sul carrozzone per rimuovere un punteggio perfettamente guadagnato con fatica.E gli amministratori devono visualizzare solo i pochi punteggi che vengono segnalati, quindi non è troppo del loro tempo, tanto meno per un piccolo gioco.

Anche solo sapere che se lavori duro per creare un bot, solo per essere abbattuto di nuovo dal sistema di report, è di per sé un deterrente.

Forse anche crittografare i dati di replay non farebbe male.I dati di riproduzione sono spesso piccoli e la loro crittografia non richiederebbe molto più spazio.E per contribuire a migliorarlo, il server stesso proverebbe il replay tramite il registro di controllo e si assicurerebbe che corrisponda al punteggio ottenuto.

Se c'è qualcosa che il sistema anti-cheat non riesce a trovare, gli utenti lo troveranno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top