capita che nelle source delle hacks ci siano istruzioni come:
C++ Programming
*(int*)dwPlayerPtr+OFS_uno=valore;
e magari poco dopo
C++ Programming
*(float*)dwPlayerPtr+OFS_due=valore.decimali;
e qualcuno si chiede, ma perchè a volte int, a volte float (e a volte anche DWORD oppure long)?
non si può usare sempre int? sempre float? etc?
la risposta è :
int, long, DWORD sono (abbastanza) intercambiabili, nel senso che in C++ vengono sempre rappresentati con 4 bytes e il risultato sarà sempre lo stesso
per il float il discorso è COMPLETAMENTE DIVERSO
il float nonostante sia sempre 4 bytes viene rappresentato in memoria in modo completamente diverso quindi se mettiamo un valore intero in una memoria float facciamo casino, se mettiamo un valore float in una memoria che si aspetta un int facciamo casino!
il float viene utilizzato quando c'è bisogno di maggior precisione, facciamo qualche esempio
INT
1
2
3
4
etc
FLOAT
2.3654
10.43
0.003
quindi useremo int per numeri interi e float per numeri con decimali per una maggior precisione.
Se il programma è il nostro è facile scegliere il tipo giusto da usare.
Nel caso delle hacks è piu difficile, perchè il source non è il nostro e nemmeno ce l'abbiamo a disposizione.
Per sapere se dobbiamo mettere int (e gli altri) oppure float l'unico modo è vedere il codice asm del gioco da hackerare, mi spiace non conosco nessun altro modo
nel senso che a seconda di come l'address viene usato capiremo se usare un intero oppure un float
oppure se non siamo capaci, ci fidiamo di come fanno gli altri nelle loro source, se funzionano, vuol dire che hanno usato il tipo giust
p.s. prima che qualcuno me lo faccia notare, in un source si può anche mettere un float in un int o un int in una variabile float ma quello che succederà è che avverrà un casting di tipo e quindi è tutto lecito, nel senso che il compilatore (oppure runtime a seconda della situazione) si occuperà di fare la cosa giusta.
Quello a cui mi riferisco io è che di solito nella hack stiamo lavorando con dei puntatori, quindi se diciamo che quello è un puntatore ad un float (mentre dovrebbe essere un puntatore a int) non avverrà nessun casting! noi infileremo un valore float in una memoria che verrà letta come int e quindi il valore sarà sbagliato!
quando avrò tempo scriverò qualche pezzo di codice e qualche screenshot per far meglio capire il concetto, mi rendo conto che cosi non si capisce un gran che, ma fidatevi