Ciao a tutti,
oggi rispondendo ad un post di Pocciox ho avuto l'occasione di dire la mia teoria sul modo migliore di studiare l'asm.
Attenzione, non parlo dell'asm che serve per scrivere un intero programma o complicate routine, io intendo quel poco asm che serve ad esempio per taroccare un gioco con Cheat Engine, oppure quel poco asm che serve per scrivere un detour o un codecave etc.
Per queste cose non credo occorra studiare sui libri l'argomento.
Premesso che studiare l'asm sui libri e in guide varie (vi consiglio i tutorials di iczelion (
[Per vedere i link devi REGISTRARTI.]
) farà sicuramente bene e in alcuni casi sarà l'unico modo di studialo,
la mia idea è che per molte cose il modo migliore di capirci qualcosa sarà questo:
1. scrivere semplici programmi in C contenenti gli unici aspetti che si vogliono studiare
2. aprire l'eseguibile (.exe) con OllyDbg
3. capire la logica con cui il C è diventato ASM
Siccome il C è abbastanza semplice da scrivere (al contrario dell'ASM) non si avranno problemi alla stesura del programma, e a quel punto capire in Olly cosa fa l'ASM non sarà cosi difficile visto che il programma l'abbiamo scritto noi
Inoltre il vantaggio di questo approccio è che essendo Olly un debugger, non solo vedremo l'asm ma potremo anche interagire, cambiando valori, codice etc e capire cosa succede di conseguenza, secondo me utilissimo per imparare.
Vediamo ora come partire con questa cosa, poi in futuro magari se interessa l'argomeno arricchiremo con nuovi contenuti
Descrivo quello che poi potrete vedere nel video sottostante:
1. scarichiamo OllyDbg se non lo abbiamo già
2. Scriviamo il primo semplice programma in C e settiamo "release", "multibyte" al posto di unicode e quindi togliamo le ottimizzazioni per semplificarci poi l'analisi in olly
3. buildiamo, ovvero creiamo l'eseguibile
4. lo apriamo con OllyDbg, ci troveremo nell'entry point dell'eseguibile che però non corrisponde al main del C allora ci spostiamo alla prima riga in alto che guarda caso è il main
5. analizziamo le poche righe di codice alla ricerca di quello che abbiamo messo nel sorgente C
6. commentiamo le righe usando il punto e virgole, questo perchè in un codice cosi semplice poteva non servire ma è meglio prendere l'abitudine, in codici piu complicati e lunghi senza commenti ci si perde
7. se ora vogliamo analizzarne il funzionamento possiamo piazzare un breakpoint (F2) su una riga e runnare (F9) il programma
8. l'esecuzione si ferma sul nostro breakpoint ora possiamo andare avanti una riga per volta con lo step (F
9. vedremo che la nostra variabile var1 è allocata sullo stack perchè main è una funzione e var1 è una variabile locale
10. vedremo che righe come int var1=0; e var1=2; fanno si che il valore sullo stack della var1 cambierà da un valore iniziale strano (sporcizia precedente) a 0 e poi a 2
11. vedremo che il famoso return 4 viene implementato settando EAX a 4 e poi facendo un RETN
Da notare che questo modo di tornare un valore dalle funzioni è quello standard, usato sempre quindi.
Ovvero il valore di ritorno di una funzione è sempre il valore contenuto in EAX
12. continuando l'esecuzione ci troveremo a codice che AVEVA CHIAMATO il nostro main, infatti possiamo vedere la call al main
e se guardiamo il valore del registro EAX vediamo che è 4.
Infatti a questo punto se volessivo fare qualcosa in base al valore di ritorno della funzione main dovremmo proprio guardare EAX
Con questo per oggi è tutto, buono studio
RICORDATE DI AUMENTARE AL MASSIMO LA QUALITà DEL VIDEO PER VEDERLO AL MEGLIO!