Gå til innhold

[Løst]Lur måte å hindre åpning av save fil?


Anbefalte innlegg

Jeg lager et spill i SDL der man kan save og loade. Men vet noen om en lur måte for at folk ikke kan jukse med å endre save filen? Hvis jeg lagrer informasjonen som plain tekst kan hvem som helst bare skrive om på noen verdier for å jukse i spillet. Går det an å lagre informasjon i executable filen eller kanskje en enkel string kryptering?

Lenke til kommentar
Videoannonse
Annonse
Jeg lager et spill i SDL der man kan save og loade. Men vet noen om en lur måte for at folk ikke kan jukse med å endre save filen? Hvis jeg lagrer informasjonen som plain tekst kan hvem som helst bare skrive om på noen verdier for å jukse i spillet. Går det an å lagre informasjon i executable filen eller kanskje en enkel string kryptering?

 

Hvordan har du tenkt å støtte flere brukere på samme maskin med å lagre savefilene i den eksekverbare filen? Ikke minst, hvordan har du tenkt å skrive til en eksekverbar fil, når brukeren som utfører spillet ikke har skriverettigheter på den eksekverbare filen?

Endret av zotbar1234
Lenke til kommentar

@GeirGrusom og Data_Jepp

Okay takk, men jeg trenger litt hjelp.

Okay, er dette sånn man enkrypter en string med xor?

string str = "this is a string";
str^str.size();

 

Og hvordan dekrypter man?

 

@zotbar

Skjønte ikke mye av det du sa der...

Hva er en "eksekverbar" fil og hvorfor har jeg ikke skriverettigheter til min egen fil?

Lenke til kommentar

Jeg er ikke sikker på om operativsystemet nødvendigvis låser programfiler når de er i gang, men det er ikke anbefalt å endre på programfiler, da det er mulig at noen virusprogrammer kan reagere på en slik oppførsel.

 

En dekrypterer xor på samme måte som du krypterer den

 

(data xor nøkkel) xor nøkkel = data

 

Xor er langt ifra en sikker form for kryptering, men den vil demotivere de aller fleste forsøk.

Lenke til kommentar
@zotbar

Skjønte ikke mye av det du sa der...

Hva er en "eksekverbar" fil og hvorfor har jeg ikke skriverettigheter til min egen fil?

 

Jeg har:

 

$ find /usr/bin/ -maxdepth 1 -type f -! -uid $(id -u) | wc -l

2645

$

 

... filer under /usr/bin som ikke eies av meg (det er typisk der programmene blir plassert). Av disse har jeg skrivetilgang til eksakt:

 

$ find /usr/bin/ -maxdepth 1 -type f -perm '/o=w' -! -uid $(id -u) | wc -l

0

$

 

... ingen. Det er *veldig* uvanlig å la eksekverbare filer (veldig forenklet -- programmer som kan kjøres) være skrivbare for noen andre enn superbrukeren som installerte dem (la oss se bort fra det komplett imbesile oppsettet der folk logger seg inn som en bruker *med* superbrukerrettigheter for å gjøre noe annet enn oppgaver som krever slikt. Spilling skal ikke krever administratorrettigher for noenlunde fornuftige oppsett).

 

Men hvis vi antar at du krever skrivetilgang til den eksekverbare filen for å kunne kjøre spillet (<le dypt inne i meg>), hvordan hindrer du forskjellige brukere på samme maskin fra å overskrive hverandres lagrede spilltilstander?

 

Det aller enkleste er å gi faen i første omgang. La folk mekke på lagrede tilstander så mye de orker. Ja, det er juks. Trist. Variant nummer 2 er å ikke lagre spilltilstand i et menneskevennlig format. Dump datastrukturen rått på filen; har du en komplisert datastruktur som beskriver spilltilstanden, holder det massevis for å hindre de ikke veldig bestemte. Til sist kan du prøve en enkel kryptering, slik som f.eks. xor (med brukernavn -- hei, kjempeenkelt jo). Bruker du IOstreams og C++, kan du jo lage en stream_buffer som gjør enkel xor-kryptering i sine read()/write()-kall og gå over til xor-kryptering uten å forstyrre resten av programmet ditt.

Endret av zotbar1234
Lenke til kommentar

@GeirGrusom

Takk. :)

 

@zotbar

Oki, skjønner at jeg ikke kan skrive informasjon inn i executablen nå.

Jeg kunne ha brukt din variant nummer 1, men har alikavell lyst til å lære hvordan xor virker...

 

Kan noen lage ett eksempel der en string blir xor encyrypta?

Lenke til kommentar

For enkelhstes skyld bruker jeg en fast char*

char* msg = "Hello World!";
int len = strlen(msg);
char* crypt = (char*)malloc(len + 1);
crypt[len] = 0;
for(int i = 0; i < len; i++)
 crypt[i] = msg[i] ^ i;

 

En kan gjøre det bedre ved å kryptere 4 byte av gangen eller lignende, men for eksempelets skyld har jeg skrevet det enkelt.

Lenke til kommentar

Okay, krypteringa virker som den skal, takk.

Men prøvde meg på dekrypteringa, men fikk bare windows error. console.exe har sluttet å virke...

 

#include <iostream>

using namespace std;

int main ()
{
char* msg = "Hello World!";
int len = strlen(msg);
char* crypt = (char*)malloc(len + 1);
crypt[len] = 0;
for(int i = 0; i < len; i++)
crypt[i] = msg[i] ^ i;
cout << crypt << endl;
for(int i = 0; i < len; i++)
msg[i] = crypt[i] ^ i;
cout << msg << endl;
return 0;
}

Lenke til kommentar

Så du bruker ikke noen debugger.... det kan være lurt å bruke :)

 

Ja da har jeg fått litt mer tid til å kikke.

Koden klikker som du sier under decrypteringen og klikker når den prøver å skrive til msg... msg er en peker til en cost string så derfor går ting galt.

 

Bytt ut:

char* msg = "Hello World!";

med :

char msg[] = "Hello World!";

så funker det hos meg hvertfall

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...