Cosa usi per raggruppare / crittografare i dati?


14

Sempre più giochi stanno seguendo il percorso guidato dai dati, il che significa che deve esserci un livello di sicurezza attorno alla manipolazione semplice. L'ho visto in cui i giochi raggruppano completamente le loro risorse (audio, grafica, dati) e mi chiedo come lo stiano gestendo? Esistono applicazioni / librerie che raggrupperanno e ti aiuteranno a gestire le risorse all'interno? In caso contrario, ci sono buone risorse a cui faresti riferimento per l'imballaggio / il disimballaggio / la crittografia?

Questa domanda specifica ruota attorno a C ++, ma sarei aperto a sentire come questo è gestito anche in C # / XNA.

Giusto per essere chiari: non ho intenzione di progettare una soluzione per prevenire l'hacking. A livello fondamentale stiamo tutti manipolando 0 e 1. Ma vogliamo impedire al 99% delle persone che giocano di modificare semplicemente i file XML utilizzati per costruire il mondo di gioco. Ho visto molti giochi raggruppare tutte le loro risorse insieme. Sono semplicemente curioso dei metodi che stanno usando.


Bella domanda, anche se non credo che ci sia un modo per proteggerlo al 100%, credo che ci sia un modo pulito per compattarlo e offuscarlo e vorrei saperne di più ...
Prix

Vale la pena domandarsi se le tue risorse art / audio debbano essere considerate "sensibili". Molti giochi espongono intenzionalmente le loro risorse ai giocatori, al fine di supportare una comunità mod sana, che a sua volta può aggiungere più valore al gioco (praticamente senza alcun costo per lo sviluppatore, anche).
Ian Schreiber,

Mi occupo principalmente di dati sensibili che guidano un gioco basato sui dati (file XML, ad esempio). Ho appena visto i giochi raggruppare tutto insieme in uno o due file.
David McGraw,

4
Cosa c'è che non va nei giocatori che giocano con quei dati?
jsimmons,

battere il mio tamburo .. CFL: iki.fi/sol/cfl
Jari Komppa

Risposte:


8

Una buona strategia è quella di rendere il tuo formato di archivio da zero e renderlo indicizzato con una tabella che punta a blocchi di dati invece di archiviare interi file sequenziali nel tuo archivio, quindi crittografare la tabella di indice e comprimere ogni blocco separatamente utilizzando LZMA / bzip2.

Un altro approccio consiste nell'utilizzare bit di generatori di dati procedurali qua e là (se si desidera andare così lontano, si potrebbero anche ottenere i 'parametri' per detti generatori da un server online come misura aggiuntiva), e scaricando parte del lavoro per la GPU puoi anche evitare dump della memoria completa e compensare alcune delle prestazioni perse.

Tuttavia, trovo tali tecniche per ostacolare generalmente le prestazioni e sprecare tempo di sviluppo, offrendo allo stesso tempo nulla all'utente finale, ma potenziali problemi e bug non necessari.

Tuttavia, nulla è sicuro al 100%.


+1 per questo. La compressione soddisfa sia la necessità di offuscare che migliorerà i tempi di caricamento e l'impronta dell'app. L'archiviazione / impacchettamento dei dati richiederà comunque uno strato di astrazione, quindi combinarlo con qualcosa che può caricare / decomprimere in atto non dovrebbe essere troppo ingegneristico. Se vai con la compressione, mi assicurerei di mantenere la logica di compressione / decompressione separata dalle cose di caricamento / archiviazione. In questo modo è possibile scambiare un algoritmo migliore in un secondo momento, l'infrastruttura necessaria non cambia tra gli algoritmi.
MrCranky,

@MrCranky: Se guardi come EA lo fa con il loro formato di archivio .package (DBPF) (usato nei giochi SPORE e The Sims), lo vedrai in azione. Il loro motore ha un campo in più nella tabella dell'indice per "tipo di compressione", un codice interno per quale algoritmo usare. Usano algoritmi di compressione diversi in base al tipo di blocco (ad esempio, i blocchi di testo utilizzano una compressione speciale) Il sistema di controllo delle versioni che usano consente anche l'integrazione delle mod e la compatibilità con le versioni precedenti. Maggiori informazioni sul formato DBPF qui: simswiki.info/DatabasePackedFile
voodooattack

Cose interessanti: l'ho mai fatto solo in fase di compilazione con un #define, ma il runtime apre alcune belle possibilità (come essere in grado di cambiare il tipo di compressione senza dover ricostruire tutti i file per il tuo gioco).
MrCranky,

11

Non spedire dati sensibili.

Non è possibile inviare dati crittografati in modo che solo il gioco possa accedervi. Puoi fare davvero del tuo meglio ma ti addentri rapidamente nei problemi DRM.

Se vuoi tenere le tue risorse di gioco lontano da occhi indiscreti.

  1. comprimilo
  2. xor il file
  3. cambia l'estensione in qualcosa di noioso (cioè no my_level.zip.xor, usa my_level.map).

Ciò fermerà il 95% degli utenti malevoli. L'altro 5% lo otterrà, qualunque cosa tu faccia.
Non è necessario effettivamente zip e xor. È possibile invece utilizzare lzma e utilizzare AES con una chiave nota. Il punto è non passarci molto tempo.


Questo è quello che di solito vedo in giro dalla maggior parte dei giochi ... cookie per te.
Prix

2
Probabilmente è sufficiente solo zip + rinominare.
coderanger

1
non credo, mi piace il That will stop 95% of mischeivieous users.non averlo fatto, mentre credo che ci siano ancora persone che lo capiranno, lo apprezzerei se non tutti e ciascuno è in grado di farlo. In questi giorni la maggior parte dei bambini di 10 anni sa come aprire i file nel blocco note e rinominarlo ...
Prix

1
Sai come si. Mi preoccuperò mai, no.
coderanger

zip + rename non è abbastanza. Linux usa raramente estensioni di file per determinare il tipo di file. Invece esamina i primi byte e lo utilizza per determinarne il tipo. Una zip rinominata appare ancora come zip in Linux. Windows XP non lo fa, utilizza ancora le estensioni. Non so come fa Windows7, ma mi aspetto che in futuro Windows utilizzerà una tecnica simile.
deft_code

4

Trascorrere molto tempo su questo è probabilmente sciocco. Esistono strumenti per catturare i dati di trama e modello direttamente dalla GPU e i suoni possono essere facilmente indirizzati verso un dispositivo di loopback virtuale. Tutto ciò che deve essere veramente sicuro deve vivere su un server e funzionare solo tramite challenge / response. Fare la convalida dei dati del cliente è un'altra storia, qualcosa di più simile a -verify_all di Valve. Questo è ancora difficile, dal momento che non puoi fidarti dell'eseguibile locale per imporlo (o almeno non puoi fidarti di più di quanto ti fidi del tuo sistema anti-cheat end-point, che è anche un'idea sciocca).


4

Il mio lavoro è nel software antitamper. Conosco qualcuno che è un cracker di vecchia scuola. Infrange giochi come respirare. Non puoi fermare persone come lui. Se il tuo gioco è abbastanza popolare, più versioni incrinate del tuo gioco colpiranno i siti torrent solo pochi giorni dopo il rilascio, qualunque cosa tu faccia. Il mio consiglio è di fare il minimo indispensabile per tenere alla larga il medio che pensa di voler dare una spinta a questa cosa del reverse engineering.


1
Questo è l'obiettivo. Non ho assolutamente alcun desiderio di combattere gli hacker.
David McGraw,

1

Bella domanda, ma questa è una domanda tutt'altro che facile a cui rispondere.
Dalla mia esperienza con la sicurezza dei dati devi pensare a quanto segue:

1) Cosa stai proteggendo, da chi e qual è l'impatto se questi dati non sono sicuri - la sicurezza è molto più sulla valutazione del rischio che sulle soluzioni tecniche sistematiche
2) Presumo che la tua piattaforma sia desktop (ad esempio Windows / OSX) in quel caso hai uno spazio problematico diverso dall'hardware proprietario come PS3 / Xenon che hanno i propri tentativi di sicurezza a livello di kernel (se questa è una soluzione valida è aperta al dibattito)
3) Crittografia! = sicurezza. La crittografia garantisce solo che i tuoi dati non possono essere letti , non garantisce che i tuoi dati non possano essere scritti o riprodotti / inviati in proxy.

Se i tuoi requisiti sono di rendere i tuoi dati a prova di manomissione, devi pensare di eseguire l' hashing dei tuoi dati (preferibilmente con SHA-256 o SHA-512) Per ripetere l'iterazione, pensa al motivo per cui è importante e cosa guadagni aggiungendo sicurezza al tuo sistema.
Vale anche la pena sapere che l'aggiunta della tecnologia di crittografia al tuo prodotto potrebbe avere implicazioni legali a causa delle restrizioni all'esportazione (la tecnologia di crittografia è classificata come tecnologia riservata alle armi limitate che ci crediate o no), quindi è consigliabile utilizzare librerie che hanno superato questi problemi legali.
Finalmente, mai e poi implementare la tua tecnologia di crittografia, usa algoritmi ben noti, documentati e ricercati come AES, Blowfish, RSA ecc.

ps La chiave pubblica / privata non è adatta o pratica per crittografare grandi quantità di dati, quindi DRM / PGP ecc. utilizzano un RSA ibrido + sistema simmetrico , ovvero proteggono la chiave simmetrica con RSA, quindi eseguono la crittografia simmetrica standard usando quella chiave

È un argomento molto vasto e complesso e sicuramente non gli ho reso giustizia

Spero possa aiutare


1

Se vuoi un esempio di un formato che è stato progettato e costruito (probabilmente sovrastimato) per essere piccolo (comprimibile), ridicolmente sicuro e flessibile, dovresti guardare al formato MPQ di Blizzard.

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

Il layout generale dell'archivio è il seguente:

Archivia intestazione File Dati File Dati - File speciali Tabella hash Tabella blocchi Tabella blocchi estesa Firma digitale avanzata

Questo formato ha TUTTO. Bloccabile, bloccabile esteso, suddivisione dei dati in settori (per un facile streaming), supporto per 7 (!) Algoritmi di compressione (se si conta la compressione del suono) che possono essere combinati arbitrariamente, firma digitale debole, firma digitale forte e così via.

Se dovessi acquistare l'API da Blizzard che si occupa dell'architettura dei file, otterrai tutto ciò di cui hai bisogno e molto altro ancora.


Grazie per il link, non avrei mai pensato di approfondire i dettagli di MPQ (e in genere supponevo che non fossero disponibili)
Bill

Se è così sicuro, perché è stato progettato in modo così inverso e ha persino librerie di terze parti per interagire con esso? ;-)
coderanger,

La maggior parte degli strumenti (leggi: tutti) per interagire con i file * .mpq dipendono da Stormlib, che è scritto e gestito da un ragazzo.

Per quanto ne so, Stormlib richiede di avere il gioco originale da cui proviene l'archivio, poiché le chiavi per la decrittazione sono memorizzate nell'eseguibile. Il motivo principale per cui è così sicuro, tuttavia, non è perché è impossibile irrompere. Ma per i dati al volo inviati attraverso la rete, non è secondo a nessuno. I dati sono così fortemente crittografati che sarebbe inutile che una terza parte decifrasse al volo.

E infatti con "World of Warcraft", Blizzard ha aperto la strada alla tecnologia di streaming, permettendoti di giocare con solo un po 'del totale dei dati scaricati sul tuo hard disk. Il formato * .mpq eccelle in questo tipo di lavoro. Per non parlare del fatto che quando il programma di installazione di Starcraft 2 è stato rilasciato da Blizzard alcuni giorni prima dell'uscita ufficiale del gioco, i suoi archivi erano così fortemente crittografati che non erano aperti fino a poco dopo il rilascio del gioco. : P

0

Dato che questo è stato recentemente resuscitato, la tua domanda (e quindi tutte le risposte finora) sembra occuparsi solo del caricamento del file, che è sicuro solo come l'eseguibile che vuole caricarlo. Sul PC non c'è nulla di veramente sicuro (basta ritardare le persone), è possibile verificare le cose sui server, ma anche quel controllo può essere rimosso in modo che exe modificato possa essere eseguito indipendentemente da cosa. Le console sono ancora "piuttosto" protette, quindi nella maggior parte dei casi lì generi un hash di file importanti, quindi firmo l'hash con una chiave privata, incorporo la chiave pubblica nel codice e verifico l'hash sicuro rispetto al file.

Ho pensato di lanciare un altro attacco nella conversazione, qualcosa che mi sono imbattuto solo l'anno scorso in quanto non tendo a spedire molto sul PC. Cheat Engine è un piccolo programma molto ordinato che quasi automatizza la creazione dei tuoi hack (il che significa che chiunque può usarlo). È piuttosto avanzato in quello che può fare, molti hack / trucchi che ho visto vendere sono fatti da questo o qualcosa di molto simile a quello che ho visto (tutti quelli del mercato di massa). Con un po 'di lavoro puoi proteggere di nuovo da cose come questa, immagino che tutto dipenda da quanto è popolare il gioco e se qualcuno si preoccupa abbastanza da disturbare.

Opps, ho dimenticato di menzionare una buona lib per la crittografia (in C ++) è LibTomCrypt .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.