Ho programmato un gioco Android con Unity Engine. Come sai in Unity, gli script sono stati compilati in un unico file chiamato "Assembly-CSharp.dll". Ho scritto i miei script in C #.
Dopo aver compilato l'intero gioco in .apk, l'ho rinominato in .zip e ho trascinato Assembly-CSharp.dll in strumenti come ILSpy, mentre l'intero programma è stato completamente decompilato con tutti i dettagli come la mia chiave pubblica RSA o AES password, IV, sale ...
La logica della mia app è client (Android) e server (Java).
Quando il giocatore ha completato un livello, con questo URL: link , gli diamo un punteggio. I parametri reali sono username, score, timestamp. Il nostro algoritmo di crittografia è RSA 1024 bit.
Quando cheater / attacker fiuta il traffico HTTP per usare l'attacco di replay, controlliamo l'hash decrittografato con RSA e con il parametro timestamp lo eliminiamo.
Ma quando ha decompilato il codice magnificamente con gli strumenti (ILSpy) ha semplicemente trovato la mia chiave pubblica e ho scoperto che crittografo il punteggio utente e il timestamp con quella chiave pubblica. Quindi, scriverà un programma Unity o C # per crittografare semplicemente il suo messaggio manipolato con un nuovo timestamp e verrà considerato attendibile nella mia app lato server perché tutto è vero.
Aumenterà il suo punteggio inviando richieste HTTP al server senza giocare. Può semplicemente imbrogliare.
Che cosa posso fare?
- Non posso usare SSL.
- Con l'offuscamento, aumenterà il tempo di crack.
- Con la chiave pubblica in runtime dal server al client, i controllori della memoria o gli sniffer del traffico possono semplicemente visualizzare la chiave pubblica.