Zoom Icon

Tutorial 1: Le basi

From UIC

Tutorial 1: Le Basi

Contents


Infos
Author: Iczelion
Email: Traduttore: -NeuRaL_NoiSE
Website: Mirror
Date: 01/01/2001 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Image:Flag_Italian.gif
Comments:



Le basi

Questo tutorial presuppone che il lettore sappia come usare MASM. Se non avete dimistichezza con MASM, scaricatevi win32asm.exe e studiate i documenti all'interno del package prima di procedere con questo tutorial. Bene. Ora siete pronti. Andiamo!


Preliminari

I programmi per Win32 sono eseguiti in "protected mode" che e' disponibile sin dai tempi degli 80286. Ma gli 80286 ormai sono storia. Percio' dovremo relazionarci all' 80386 e i suoi discendenti. Windows esegue ogni singolo programma Win32 in uno spazio virtuale separato e unico. Cio' significa che ogni programma Win32 avra' i suoi propri 4 GB di address space. Ogni programma e' solo nel suo address space. Cio' e' in contrasto con la situazione presente in Win16. Tutti i programmi Win16 possono *vedersi* gli uni con gli altri. Questo non accade in Win32. Tale caratteristica aiuta a ridurre la probabilita' che un programma scriva sul codice/dati di un altro. Il memory model (modello di memoria, NdT) e' parimenti drasticamente diverso dai vecchi giorni del mondo a 16-bit. In Win32, non e' piu' necessario preoccuparsi del modello di memoria o dei segmenti! C'e' solo UN modello di memoria: il Flat memory model. Non esistono piu' segmenti da 64K. La memoria e' un largo e continuo spazio di 4 GB. Questo significa anche che non bisognera' piu' giocare con i segment registers. Potrete usare qualsiasi segment register per indirizzare qualsiasi punto nello spazio di memoria. Questo e' un GRANDE aiuto ai programmatori, ed e' cio' che rende la programmazione in assembly per Win32 semplice quanto quella in C.

Contenuto

Ecco lo scheletro del programma. Se non comprendete alcune parti del codice, niente panico. Spieghero' ciascuna di esse in seguito.

.386
.MODEL Flat, STDCALL
.DATA
<I vostri dati inizializzati>
......
.DATA?
<I vostri dati NON inizializzati>
......
.CONST
<Le vostre costanti>
......
.CODE
<etichetta>:
<Il vostro codice>
.....
end <etichetta>

Ecco tutto! Analizziamo questo scheletro.

.386 Questa e' una direttiva per l'assembler, a cui diciamo di usare il set di istruzioni 80386. Potreste anche usare .486, .586 ma la scelta piu' sicura e' quella di utilizzare sempre .386 . .MODEL FLAT, STDCALL .MODEL e' una direttiva per l'assembler che specifica il modello di memoria del nostro programma. Sotto Win32, esiste un solo modello di memoria, il modello FLAT. STDCALL comunica a MASM la convenzione nel passare i parametri. Questa convenzione specifica l'ordine con cui i parametri verranno passati, da sinistra-verso-destra o da destra-verso-sinistra, oltre a chi bilanciera' lo stack frame dopo la chiamata di una call (procedura, NdT). In Win16, ci sono due tipi di convenzioni di chiamata, C e PASCAL La convenzione di chiamata C passa i parametri da destra a sinistra, cioe', il parametro all'estrema destra e' PUSHato per primo. Il caller e' responsabile del bilanciamento dello stack frame dopo la call. Ad esempio, volendo chiamare una funzione denominata foo(int primo_param, int secondo_param, int terzo_param) con la convenzione C, il codice assomiglierebbe a questo:


push [terzo_param] // ; Pusha il terzo parametro
push [secondo_param] // ; Seguito dal secondo
push [primo_param] // ; E dal primo
call foo
add sp, 12 // ; Il caller bilancia lo stack frame

La convenzione PASCAL e' l'inverso di quella per il C. Essa passa i parametri da sinistra a destra, e il callee e' responsabile per il bilanciamento della stack dopo la call. Win16 adotta la convenzione PASCAL poiche' produce codici piu' piccoli. la convenzione C e' utile quando non si conosce il numero dei parametri che verranno passati alla funzione, come nel caso di wsprintf(). Nel caso di wsprintf(), la funzione non ha modo di determinare aprioristicamente il numero di parametri che verrano pushati sulla stack, percio' non puo' bilanciare lo stack frame. STDCALL e' un ibrido tra le convenzioni C e PASCAL. Essa passa i parametri da destra a sinistra ma il callee e' responsabile per il bilanciamento della stack dopo la call. La piattaforma Win32 usa esclusivamente STDCALL. Eccetto in un caso: wsprintf(). Dovete usare la convenzione C con wsprintf().


.DATA
.DATA?
.CONST
.CODE

Tutte e quattro le direttive sono cio' che viene definito SEZIONE. Non avete segmenti in Win32, ricordate ? Ma potete dividere il vostro intero address space in sezioni logiche. L'inizio di una sezione definisce la fine della sezione precedente. Ci sono due gruppi di sezioni: dati e codice. Le sezioni dei dati sono divise in 3 categorie:

  • .DATA Questa sezione contiene i dati inizializzati del vostro programma.
  • .DATA? Questa sezione contiene i dati NON inizializzati del vostro programma. A volte capita di voler impegnare una parte di memoria (variabli, NdT) senza inizializzarla. Questa sezione serve a tale scopo.
  • .CONST Questa sezione contiene le costanti usate dal vostro programma. Le costanti in questa sezione non potranno mai essere modificate dal vostro programma. Sono semplicemente costanti.

Non e' necessario utilizzare tutte e tre le sezioni nel vostro programma. Dichiarate solo la/e sezione/i che volete usare. C'e' solo una sezione per il codice: .CODE. Qui e' dove le vostre istruzioni risiedono. <etichetta>: end <etichetta> dove <etichetta> e' una qualsiasi etichetta arbitraria usata per specificare l'estensione del vostro programma. Entrambe le etichette devono essere identiche. Tutto il vostro codice deve risiedere tra <etichetta>: e end <etichetta>


Note finali

Questi tutorials erano presenti nel sito di RingZero. Li rimettiamo a disposizione a chiunque voglia poterli leggere nella loro traduzione in italiano che fu curata da NeuralNoise.

phobos


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.