Tutorial 5: Altre informazioni inerenti il Testo
From UIC
Tutorial 5: Altre informazioni inerenti il Testo
Contents |
| Infos | |
|---|---|
| Author: | Iczelion |
| Email: | Traduttore: -NeuRaL_NoiSE |
| Website: | Mirror |
| Date: | 01/01/2001 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Introduzione
Sperimenteremo di piu' con gli attributi del testo, ad esempio il tipo di font (= tipo di carattere, NdT) e il colore.
Preliminari
Il sistema dei colori di Windows si basa su valori RGB, R=red (Rosso, NdT), G=Green (Verde, NdT), B=Blue (Indovinate, NdT :). Se volete specificare un colore in Windows, dovete dichiarare il colore da voi desiderato in funzione di questi tre colori principali. Ogni valore di colore ha un raggio che va da 0 a 255 (un valore di un byte). Ad esempio, se volete un colore rosso puro, dovete usare 255,0,0. O se volete un colore bianco puro, dovete usare 255,255,255. Potete osservare dagli esempi che ottenere il colore di cui avete bisogno e' molto difficile con questo sistema, dal momento in cui dovete sapere bene come miscelare e unire i colori. Per il colore del testo e per lo sfondo, userete SetTextColor e SetBkColor, ed entrambi necessitano dell'handle di un device context e un valore RGB a 32-bits. La struttura del valore RGB a 32-bits e' definita cosi':
unused db 0
blue db ?
green db ?
red db ?
RGB_value ends
Notate che il primo byte non e' utilizzato e dovrebbe essere zero. L'ordine dei tre bytes rimanenti e' invertito, cioe' e' blue, green, red. Comunque, non useremo questa struttura poiche' e' complicata da inizializzare e da usare. Creeremo una macro, invece. La macro ricevera' i tre parametri: i valori red, green e blue. Produrra' quindi il valore RGB a 32-bits desiderato e lo conservera' in eax. La macro e' definita come segue:
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
Potete inserire questa macro nel file di include per usarla in futuro.
Potete "creare" una font chiamando CreateFont o CreateFontIndirect. La differenza tra le due e' che CreateFontIndirect riceve solo un parametro: un puntatore ad una struttura font logica, LOGFONT. CreateFontIndirect e' la piu' flessibile tra le due specialmente se i vostri programmi hanno bisogno di cambiare font frequentemente. Comunque, nel nostro esempio, "creeremo" solo una font per dimostrazione, e possiamo farlo tranquillamente con CreateFont. Dopo la chiamata a CreateFont, essa restituira' l'handle di una font che dovete selezionare nel device context. Successivamente, ogni funzione API testuale utilizzera' la font che abbiamo selezionato nell'ambito del device context.
Contenuto
Segue il nostro codice:
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
TestString db "Win32 assembly is great and easy!",0
FontName db "script",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL hfont:HFONT
mov eax,uMsg
.IF eax==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF eax==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hdc, eax
mov hfont,eax
RGB 200,200,50
invoke SetTextColor,hdc,eax
RGB 0,0,255
invoke SetBkColor,hdc,eax
invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString
invoke SelectObject,hdc, hfont
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Iniziamo la nostra analisi : )
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName
CreateFont crea una font logica che si avvicini il piu' possibile ai parametri inseriti e ai dati sulle fonts disponibili. Questa funzione ha piu' parametri di ogni altra funzione di Windows. Essa restituisce l'handle della font logica che deve essere usata con la funzione SelectObject. Esamineremo i suoi parametri in dettaglio.
int nWidth,
int nEscapement,
int nOrientation,
int nWeight,
BYTE cItalic,
BYTE cUnderline,
BYTE cStrikeOut,
BYTE cCharSet,
BYTE cOutputPrecision,
BYTE cClipPrecision,
BYTE cQuality,
BYTE cPitchAndFamily,
LPSTR lpFacename);
nHeight L'altezza dei caratteri desiderata. 0 significa dimensione predefinita.
nWidth La larghezza dei caratteri desiderata. Normalmente questo valore dovrebbe essere 0, che permette a Windows di far combaciare la larghezza con l'altezza. Comunque, in questo esempio, la larghezza predefinita rende i caratteri quasi illeggibili, percio' ho usato la larghezza 16.
nEscapement Specifica l'orientamento del carattere successivo relativo al precedente in decimi di grado. Normalmente, e' 0. Usate 900 per far si che i caratteri vengano scritti dal basso verso l'alto rispetto al primo, 1800 per farli scrivere da destra a sinistra, o 2700 per scrivere ciascun carattere dall'alto verso il basso.
nOrientation Specifica quanto il carattere deve essere ruotato al momento della scrittura in decimi di grado. Usate 900 per far giacere i caratteri sulla schiena, 1800 per scrittura invertita, ecc.
nWeight Regola lo spessore di ogni carattere. Windows definisce le seguenti dimensioni:
FW_THIN equ 100
FW_EXTRALIGHT equ 200
FW_ULTRALIGHT equ 200
FW_LIGHT equ 300
FW_NORMAL equ 400
FW_REGULAR equ 400
FW_MEDIUM equ 500
FW_SEMIBOLD equ 600
FW_DEMIBOLD equ 600
FW_BOLD equ 700
FW_EXTRABOLD equ 800
FW_ULTRABOLD equ 800
FW_HEAVY equ 900
FW_BLACK equ 900
cItalic 0 per normale, qualsiasi altro valore per caratteri in corsivo.
cUnderline 0 per normale, qualsiasi altro valore per caratteri sottolineati.
cStrikeOut 0 per normale, qualsiasi altro valore per caratteri attraversati da una linea nel centro.
cCharSet Il set di caratteri per la font. Normalmente dovrebbe essere OEM_CHARSET che permette a Windows di selezionare la font che sta funzionando in dipendenza del sistema.
cOutputPrecision Specifica con quale precisione la font selezionata deve essere vicina alle caratteristiche che noi vogliamo. Normalmente dovrebbe essere OUT_DEFAULT_PRECIS che definisce il comportamento di font mapping predefinito.
cClipPrecision Specifica la clipping precision (precisione di taglio, NdT). La precisione di taglio definisce come tagliare i caratteri che stanno parzialmente al di fuori della clipping region. Non dovreste avere problemi usando CLIP_DEFAULT_PRECIS che definisce il comportamento di clipping predefinito.
cQuality Specifica la qualita' dell'output. La qualita' dell'output definisce il grado di precisione con cui GDI deve cercare di far combaciare gli attributi della font logica con quelli di una reale font fisica. Ci sono tre scelte: DEFAULT_QUALITY, PROOF_QUALITY e DRAFT_QUALITY.
cPitchAndFamily Specifica il pitch (tono, NdT) e la famiglia della font. Dovete combinare i valori pitch e family con l'operatore "or".
lpFacename Un puntatore ad una stringa null-terminated che specifica il nome attribuito alla font.
La descrizione precedente non e' assolutamente completa di tutti i dettagli. Dovreste fare riferimento alla vostra Win32 API reference per maggiori dettagli.
mov hfont,eax
Dopo aver ottenuto l'handle della font logica, dobbiamo usarlo per selezionare la font all'interno del device context chiamando SelectObject. SelectObject inserisce i nuovi oggetti GDI come pens (penne, NdT), brushs (spazzole, NdT) e fonts nel device context che deve essere usato dalle funzioni GDI. Essa restituisce l'handle dell'oggetto rimpiazzato che dovremmo conservare per future chiamate a SelectObject. Dopo la chiamata a SelectObject, qualsiasi output testuale usera' la font che abbiamo appena selezionato nel device context.
invoke SetTextColor,hdc,eax
RGB 0,0,255
invoke SetBkColor,hdc,eax
Usate la macro RGB per creare un valore RGB a 32-bits da essere usato con SetColorText e SetBkColor.
Chiamate la funzione TextOut per disegnare il testo nella client area. Il testo avra' la font e il colore che abbiamo specificato in precedenza. La sinstassi di TextOut e' questa:
HDC hdc, // handle del device context
int nXStart, // coordinata x della posizione di partenza
int nYStart, // coordinata y della posizione di partenza
LPCTSTR lpString, // indirizzo della stringa
int cbString // numero di caratteri nella stringa
);
invoke SelectObject,hdc, hfont
Quando abbiamo finito con la font, dovremmo ripristinare la vecchia font nel device context. Dovreste sempre ripristinare l'oggetto che avete rimpiazzato nel device context.
Note finali
Questi tutorials erano presenti nel sito di RingZero. Li rimettiamo a disposizione a chiunque voglia poter leggerli 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.
Categories: Assembly | Iczelion | 2001