Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] WriteMEM e templates nelle hacks
(Questo messaggio è stato modificato l'ultima volta il: 28/09/2012, 21:57 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
 
Avevo risposto sta cosa in un thread, ma poi ho scritto cosi tanto che mi sono detto "perchè non farne una guida" e cosi ecco che riposto qui quello che ho scritto...

Il tutto nasce da sto codice postato:
    C++ Programming
  1. Da haste Speed
  2.  
  3. DWORD ADR_OFFSET_PLAYERSPEED = 0x896338; //UD 26.09
  4.  
  5. switch(cPlayer.CH_PlayerSpeed)
  6. {
  7. case 0: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96);break;
  8. case 1: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*2);break;
  9. case 2: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*3);break;
  10. case 3: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*4);break;
  11. case 4: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*5);break;
  12. case 5: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*6);break;
  13. case 6: WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96*7);break;
  14. }
  15.  
  16. Ihr macht das soo unnötig kompliziert, das lässt sich in einer einzigen Zeile schreiben:
  17.  
  18. *reinterpret_cast<double *>(ADR_OFFSET_PLAYERSPEED) = (96.0 * (cPlayer.CH_PlayerSpeed - 1));



Per non farci distrarre dal numero di righe vediamone una sola, la prima, le altre fanno la stessa cosa:

    C++ Programming
  1. WriteMEM<double>((void*)ADR_OFFSET_PLAYERSPEED,96);



e per semplificarti la vita vediamola cosi:
    C++ Programming
  1. WriteMEM((double*)ADR_OFFSET_PLAYERSPEED,96);



questa altro non è che questa:

    C++ Programming
  1. (double*)ADR_OFFSET_PLAYERSPEED=96;



E quindi mi direte, ma WriteMEM cosa fa?
semplice, può succedere che alcune aree di memoria di warrock vengano "protette" settandole in lettura, che succede, che se qualcuno (tu) tenti di scriverci sopra, o non funziona o addirittura crasha il gioco per via dell'eccezione che viene generata.
Allora fai una funzione come WriteMEM che fa una cosa del tipo:

    C++ Programming
  1. void WriteMem(void *addy, const int value)
  2. {
  3. DWORD dwback;
  4. VirtualProtect(addy, 4, PAGE_READWRITE, &dwback); // setta la memoria in lettura/scrittura
  5. *(reinterpret_cast<type *const>(addy)) = value; // sovrascrive la memoria
  6. VirtualProtect(addy, 4, dwback, &dwback); // risetta la memoria cosi com'era prima
  7. }



che fa? semplice, leggete i commenti, prima cambia lo stato della memoria che ci interssa in Lettura/scrittura, a questo punto possiamo cambiare il valore della memoria (es lo speed), quindi rimettiamo il settaggio cosi com'era prima (ad es. in sola lettura)

Perchè lo rimettiamo com'era? perchè può essere che warrock o hs controlli che la memoria sia rimasta protetta cosi come se l'aspetta altrimenti può sospettare la presenza di una hack

Detto questo sorge un problema, notiamo sta riga:

    C++ Programming
  1. void WriteMem(void *addy, const int value)



notate che c'è scritto int value
ovvero la funzione si aspetta un int... ma se vogliamo passargli un float? o un double? o un byte?
allora qui vengono in aiuto i templates del C++ che ci permettono di scrivere una funzione GENERICA che può accettare piu di un tipo di parametro di passaggio e comportarsi di conseguenza,
la nostra funzione potrebbe diventare:

    C++ Programming
  1. template <typename type>
  2. void WriteProtectedMem(void *addy, const type value)
  3. {
  4. DWORD dwback;
  5. VirtualProtect(addy, 4, PAGE_READWRITE, &dwback);
  6. *(reinterpret_cast<type *const>(addy)) = value;
  7. VirtualProtect(addy, 4, dwback, &dwback);
  8. }



che è successo? vediamo la riga di prima come è diventata:
    C++ Programming
  1. void WriteProtectedMem(void *addy, const type value)



ora c'è quel type value
e sotto nel codice abbiamo questo:

    C++ Programming
  1. *(reinterpret_cast<type *const>(addy)) = value;



che vuol dire tutto cio? semplice, vuol dire che la nostra funzione ora si arrangia da sola, se gli passiamo un valore byte la riga è come se diventasse cosi:

    C++ Programming
  1. *(reinterpret_cast<BYTE *const>(addy)) = value;



se gli passiamo un float cosi:
    C++ Programming
  1. *(reinterpret_cast<float *const>(addy)) = value;




ovvero dove c'era scritto "type" dobbiamo immaginare di metterci il tipo che passiamo al momento in cui andiamo a chiamare la funzione (in realtà in compilazione, ma sono dettagli Tounge )

Ovvero riassumendo, invece di fare tante funzioni quanti sono i tipi che ci interessano, ad esempio:

WriteMEM_byte(void *addy,const byte value)
...

WriteMEM_int(void *addy,const int value)
...

WriteMEM_float(void *addy,const float value)
...

ne abbiamo una sola che fa tutto Happywide

il fatto che sia scritta cosi :
WriteMEM<double>(

serve solo a specificare in modo esplicito il tipo che vogliamo usare per la chiamata, anche se in realtà potremmo tralasciarlo perchè il compilatore è cosi intelligente da capirlo da solo.
Oppure possiamo usarlo per forzare il tipo da usare, a nostro rischio e pericolo.

tutto chiaro? Happywide

un ultima cosa, se poi ci si domanda il senso di questa:
    C++ Programming
  1. *reinterpret_cast<double *>(ADR_OFFSET_PLAYERSPEED) = (96.0 * (cPlayer.CH_PlayerSpeed - 1));



ha voluto solo semplicemente (e giustamente) presentare un modo alternativo, migliore, piu pulito e "ristretto" di fare la stessa cosa in una sola riga.
Ovvero, sopra ha usato uno switch per dire che a seconda di quanto vale la variabile cPlayer.CH_PlayerSpeed (selezionabile da menu) calcola quanto deve scrivere in memoria per ottenere la velocità
Nella riga sotto alternativa, lo switch non lo usa piu e scrive in memoria semplicemente il valore calcolato al volo ottenuto moltiplicando 96 per la varibile di prima (cPlayer.CH_PlayerSpeed)

questo:

    C++ Programming
  1. *reinterpret_cast<double *>(ADR_OFFSET_PLAYERSPEED)= ...



altro non è che la versione C++ di questo che conosciamo già :

    C++ Programming
  1. *(double)(ADR_OFFSET_PLAYERSPEED)= ...



alla prossima guida Wink
digger


digger
28/09/2012, 21:48
#1
Cerca

maurow
Messaggi: 6,041
Discussioni: 2,066
Registrato: 03-2011
Reputazione:
133

Mix: 8,107
posso solo dirti

C++ Programming
*(grazie )(digger )= . :-)


La libertà non si insegna, è una scelta individuale.
28/09/2012, 22:12
#2
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 28/09/2012, 22:14 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
    C++ Programming
  1. char ringraziamenti[] = "Grazie arow!";
  2. cout << ringraziamenti << endl;



Happywide


digger
28/09/2012, 22:14
#3
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
void sono nabbo()
if digger pro ==1
pocciox nabbo = 1
else
pocciox nabbo = 0

D:

28/09/2012, 22:34
#4
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
ahah Asd


digger
28/09/2012, 22:36
#5
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
è cosi
comunque non ho capito bene cos'è templates saresti cosi gentile da spiegarmelo <3

28/09/2012, 22:42
#6
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
certo,
normalmente quando dichiari una funzione sei obbligato a specificare il tipo dei parametri che gli passi e anche il tipo che viene tornato, ad esempio
    C++ Programming
  1. int EsempioFunzione(BYTE parametro)



Vedi? stai dicendo che la funzione EsempioFunzione si aspetta che gli passi un parametro che PER FORZA dovrà essere di tipo BYTE

Ma se la stessa funzione dovesse fare la stessa cosa ma passandogli un int? e poi un float?

dovresti scrivere 3 funzioni, una che si aspetta un byte, una che si aspetta un int e una che si aspetta un float.

Con il template invece tu la funzione la scrivi (nel modo giusto) una volta sola e poi a seconda del tipo del parametro che gli passi è il compilatore a sapere cosa deve fare


digger
28/09/2012, 23:31
#7
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Ah beh niente di complicato , una delle poche volte in cui il compilatore capisce qualcosa D:

28/09/2012, 23:38
#8
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
povero compilatore, dai fa un buon lavoro invece, ho provato anche a vedere con Olly come funziona il template ed è simpatico, in pratica il compilatore crea tante funzioni quanti sono gli usi diversi che ne fai nel codice, cioè metti che scrivi una funzione generica e poi nel tuo programma la usi con byte, int e float, bene, in olly vedi 3 funzioni distinte! una per byte, una per int e una per float e nel programma lui chiama quella giusta a seconda del tipo, però nel tuo codice in C++ tu ne hai scritta una sola Happywide mi piacciono ste cose Tounge


digger
28/09/2012, 23:42
#9
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Si è molto utile Smile
C'è anche nella versione 2012??

29/09/2012, 19:23
#10
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
Certo che si


digger
29/09/2012, 19:55
#11
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Mi sa che passo al 2012 :3

04/10/2012, 10:18
#12
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
io per ora sto restando alla 2008, ci penserò a passare, forse, un giorno... mah... chi lo sa... chi può dirlo... vedremo...


digger
04/10/2012, 20:46
#13
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
e magari un giorno passerai a windows 7, e forse un giorno diventerai un ghepardo e governerai l'europa Asd

05/10/2012, 18:05
#14
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
o.o sono già passato a w7, per colpa di bf3, questo però non vuol dire che abbia cambiato idea sul confronto xp - 7 Wink

e comunque non governerò l'europa.. GOVERNERò IL MOOOONDOOOOO!!!
Asd


digger
05/10/2012, 19:49
#15
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Source funzioni Menu Hacks Luxor 14 2,865 27/03/2011, 0:48
Ultimo messaggio: digger
  Source Funzioni No Menu Hacks Luxor 7 1,246 21/03/2011, 20:47
Ultimo messaggio: ZioPaperino



Utenti che stanno guardando questa discussione: 1 Ospite(i)