versione con Union->
[Per vedere i link devi REGISTRARTI.]
Ciao!
nel cercare di hackerare qualche gioco usando un debugger, ad esempio Olly può capitare di imbattersi in cose come questa:
MOV EAX,42C80000
Ma che razza di numero è quello?
Se lo convertiamo con la calcolatrice da hex a decimale otteniamo : 1120403456
Torna la domanda... ma che razza di numero è? e cosa se ne fa il gioco di un numero cosi?
La risposta è semplice, NON è un numero decimale, è un FLOAT!
Già, perchè il numero float occupa 4 bytes, quindi può essere usato tranquillamente come qualsiasi numero decimale DWORD caricandolo nei soliti registri (basta usarlo nella maniera giusta).
Ma se volessimo convertire quel numero e capire quanto vale in float?
Ci sono dei programmini che lo fanno, ma visto che siamo nel topic del C/C++ vediamo come farlo con un programmino.
Prima vediamo quello che farebbe "intuitivamente" un programmatore con poca esperienza (ci ono cascato pure io eheh )
C++ Programming
#include <windows.h>
#include <stdio.h>
int main()
{
int i= 0x42C80000;
float f = (float)i;
printf("%f",f);
system("pause");
}
Ovvero dichiariamo la variabile i come intero (decimale) e la inizializziamo a quel valore, poi gli diciamo che la vogliamo float usando un "cast" che la cambia di tipo.
Peccato che il risultato non è quello che vogliamo, infatti il risultato è questo:
1120403456.000000
Che del resto ha senso, è la stessa cosa che succede quando con la calcolatrice convertiamo quel numero da esadecimale a decimale.
Ma ora vediamo qual è il sistema giusto per vedere in float quanto vale quel numero:
C++ Programming
#include <windows.h>
#include <stdio.h>
int main()
{
int i= 0x42C80000;
float *f = (float*)&i;
printf("%f",*f);
system("pause");
}
Qui abbiamo usato i puntatori.
Dichiariamo la variabile i come integer come prima e lo inizializziamo.
Questa volta però f lo diciariamo come PUNTATORE AD UN FLOAT, e non come float.
E a cosa lo inizializziamo? Essendo un puntatore, dobbiamo dargli un indirizzo quindi usiamo la sintassi:
&i;
che vuol dire "indirizzo di i"
Però siccome i è un integer, la forma &i ci darà un puntatore ad integer, quindi anche stavolta usiamo il casting, e scriviamo (float*) che vuol dire "convertilo in puntatore a float)
Ci resta solo un ultimo accorgimento, nel stampare a video il valore.
Infatti non possiamo stampare il VALORE di f! perchè è un PUNTATORE e non un float.
Allora dobbiamo stampare IL VALORE PUNTATO DA F e per farlo si fa cosi:
printf("%f",*f);
Notate il
*f
che appunto vuol dire "il valore puntato da f"
Il risultato è questo:
100.000000
Che è esattamente quello che ci serviva,
0x42C80000 int = 100.0 float
alla prossima
ciao
Digger