myTribu::reb0rn Search Members Help Calendar
Welcome Guest .:: Log In :: Register ::. .:: Resend Validation Email  

Reply to this topicStart new topicStart Poll

> Photo de mwâ nue :o

DarkFantasy

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 684
Member No.: 4
Joined: 21-June 04

Posted: Oct 16 2004, 20:50 PM   Quote Post 

Héhéh en fait c'est mon premier tutorial sur l'asm WIN32 smile.gif Pas déçu ? Si ? Bon restez merde vous apprendrez quelques chose de super util .... Langue.gif
Afin que tout le monde ne se pend pas durant ce tutorial, je ne vais pas trop détaillé mais si vous désirez demple information MP & MSN sont là ClinDOiel.gif ( surtout msn vu que personne m'parle Langue.gif )


I. Pré-Compilation

Commençons par les directives de compilation, cette expression barbare designe simplement pour 3 lignes (Parfois plus mais ça reste singlier) :

.386
; Ici, c'est le type d'assembler, 386 est le plus courrant mais on pourrait limite au 586, ceci n'a peu d'importance sauf si vous utilisez des mnémoniques plus recentes

.model flat,stdcall
; Le flat designe le mode d'assemble, ils sont au nombres de 3( en réalité plus mais bon...) flat designe pour mode protégé, ne vous en souciez pas. stdcall c'est le type d'appelle spécifique à windows idem mettez ça et stou Langue.gif

option casemap:none
; Ici c'est pour le case sensitive, à l'origine MASM ne possède pas de case sensitive comme les autres oubliez les pour l'instant

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
; Inclus les headers, équivalent de #include

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
; Inclus les libs, équivalent de #pragma comment(lib,"XXX.lib")

Voila, vous voyez c'est pas la mort ? Bon j'reste assez vague sur les explications mais vu ce que c'est paramètres restent fixes on va pas s'embêter ClinDOiel.gif

II. Le code

WinMain proto :dword,:dword,:dword,:dword
; Comme en C on déclare la fonction avant ClinDOiel.gif

.data
lpClassName byte "MyAppInASM" ,0
lpWndName byte "A Application in ASM32 ClinDOiel.gif",0
lpBnClass byte "button" ,0
lpBnCaption byte "Clique là Langue.gif" ,0
; Données initialisés, souvent on trouve uniqment des strings (ne pas omettre le ,0)

.data?
hInstance HINSTANCE ?
szCmdLine LPSTR ?
hBn HWND ?
; Données non-initlialisés, Variables locales ClinDOiel.gif

.const
BN_SAMPLE equ WM_USER+75
; Données constantes, en général les messages pour des sortes de define

.code
; Ici qu'on trouve le code

start:
; OEP en ASM (OEP = Original Entry Point, là où débuteral'application)

invoke GetModuleHandle,0
mov hInstance,eax
; Ceci récupère le hInstance de l'application, c'est une sorte d'identificateur neccessaire à windows pour retrouver l'application

invoke GetCommandLine
mov szCmdLine,eax
; Récupère les lignes de commande associées à l'app, comme par exemple quand vous utilisez un "SendTo" ou "Envoyer Vers"

invoke WinMain,hInstance,NULL,szCmdLine,SW_SHOWDEFAULT
; OEP Windows c'est ici le coeur du programme, ça peut paraître bizarre pour les Ciens & Cppiens Langue.gif

invoke ExitProcess,eax
Quitte l'application
; -------------------------------------------------------------------

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,lpCmdLine:LPSTR,nCmdShow:dword
; Définition de la fonction, avec ses paramètres

LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
; Variables locales

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 hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset lpClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
; On remplit une structure de type fenêtre windows ( de manière très basique ) puis on "associe" un string à cette structure

invoke CreateWindowEx,NULL, \
addr lpClassName, \
addr lpWndName, \
WS_OVERLAPPEDWINDOW, \
CW_USEDEFAULT, \
CW_USEDEFAULT, \
400, \
300, \
NULL,NULL,hInst,NULL
mov hwnd,eax
Avec le string associé à la structure on crée une fenêtre cette fonction renvoie un HWND sorte d'identificateur pour fenêtre qu'on met dans une variable pour s'en reservir

invoke ShowWindow,hwnd,nCmdShow
invoke UpdateWindow,hwnd
; Affiche la fenêtre, et envoie un message type WM_PAINT pour forcé le dessin, et oui, windows dessine vos fenêtres et parfois les re-redessine smile.gif

.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.break .if(!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
; Boucle infini permettant de récupérer les messages, si GetMessage renvoie nul ( avec le message WM_QUIT) on quitte la boucle

mov eax,msg.wParam
; servira pour plus tard
ret
; Pour pas que l'app continue infiniment là où il faudrait pas

WinMain endp
; Fin de la déclaration ( } )

WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
; Fonction qui traite les messages, elle est dîte callback car elle est appellé automatiquement par l'OS (windows) et non par l'application

LOCAL hdc:HDC ; Ceci est un handle qui permet de dessiner
LOCAL ps:PAINTSTRUCT ; Obligatoire pour les dessins
LOCAL rect:RECT ; structure d'un rectangle vous verrez à quoi il sert ClinDOiel.gif

.if uMsg==WM_DESTROY
invoke PostQuitMessage,0
; Ce message intervient si on detruit la fenêtre, ici on quit donc si on clique sur la croix ça quitte c'est simple ? smile.gif

.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke GetClientRect,hWnd,addr rect
invoke TextOut,hdc,90,10,offset lpWndName,SIZEOF lpWndName-1
invoke EndPaint,hWnd,addr ps
; Message quand on doit dessiner la fenêtre (UpdateWindow, une fenêtre était par dessus celle ci, etc.. ) ça permet aussi de pouvoir dessiner des choses dedans, BeginPaint dit qu'on commence le gribouillage, celui renvoie un hdc qu'on sauve, GetClientRect ne donne la zone de dessin possible ! Où on peut dessiner et où on ne le peut. TextOut permet simplement d'écrire un texte dans la fenêtre (utilisez dans T4C cf: API Hooking), EndPaint dit qu'on arrête avec les dessins smile.gif


.elseif uMsg==WM_CREATE
invoke CreateWindowEx,NULL, \
addr lpBnClass, \
addr lpBnCaption, \
WS_CHILD or WS_VISIBLE \
or BS_DEFPUSHBUTTON, \
0,0,80,25,hWnd,BN_SAMPLE, \
hInstance,NULL
mov hBn,eax
; Ici c'est lorsqu'on crée la fenêtre, on utilise la même API pour créer une fenêtre qu'un bouton et que de n'importe qu'elle contrôle (en modeless du moins) rien de change à la première sauf le string, ici c'est BUTTON à la place du notre au dessus

.elseif uMsg==WM_COMMAND
; Intervient pour les messages "personnels"
mov eax,wParam
.if ax==BN_SAMPLE
; dans wParam les bits poids faibles designe le contrôle qui envoie ce message
shr eax,16
; alors que dans les bits faibles c'est le l'action, donc ici on a cliqué sur le bouton
.if ax==BN_CLICKED
invoke MessageBox,hWnd,offset lpWndName,offset lpClassName,MB_ICONINFORMATION
; on affiche une msgobx bêbétte Langue.gif
.endif
.endif

.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
; Ici on dit que tous les autres messages qu'on ne connait pas seront traités par windows
ret
.endif

xor eax,eax
; Combine assez connu pour remettre un reg à 0
ret

WndProc endp
; Fin de la fonction ( } )

end start
; Fin du programme ceci permet de determiner la fonction mère, vous pouvez par expl remplacer start par main ClinDOiel.gif

Voila j'espère que je vous avais appris quelques choses, et que vous voudrez vous y mettre Langue.gif Si tel est le cas je suis pratiquement tout le temps dispo où vous savez ClinDOiel.gif
Si vous avez une remarque globale poster là ici smile.gif par exemple qui font les headers & libs inscrites au dessus Langue.gif Voila j'ai tout dit je compte mettre des couleurs au code pour que ça soit plus lisible ClinDOiel.gif sur ce...
Bonne journée


____________________
user posted imageuser posted image

 PMEmail PosterUsers WebsiteMSN  Top

Mymy

HANDLE
*************
Group: ~ Tribu ~
Posts: 300
Member No.: 16
Joined: 15-July 04

  Posted: Oct 17 2004, 08:26 AM   Quote Post 

Chui pas venue ici pour te matter nu hein Langue.gif (a) RollEyes.gif
Nan mais en fait, ce matin j'ai pas le temps de lire tout ça alors m'en veut pas ClinDOiel.gif C'est pas que je me défile hein! J'le lirai c'est promis, mais un dimanche matin quand j'vais partir pour le taff c pas très pratik avec la tete dans le cul Silence.gif
N'empêche que je suis la 1ère à te répondre ClinDOiel.gif

____________________
user posted image

 PMEmail PosterMSN  Top

Deather

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 683
Member No.: 3
Joined: 28-December 03

Posted: Oct 17 2004, 08:37 AM   Quote Post 

user posted image
Stune blague ?!

 PMEmail Poster  Top

Deather

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 683
Member No.: 3
Joined: 28-December 03

Posted: Oct 17 2004, 08:38 AM   Quote Post 

Question dark,
Dans ton bouquin d'Assembleur, j'ai lu que pour initialiser un string on pouvait faire:

monstring db "Salut$"

Avec le signe $ à la fin, plutôt que le 0... ça marche aussi ça ?

 PMEmail Poster  Top

Tritri86

VOID
************
Group: ~ Tribu ~
Posts: 212
Member No.: 6
Joined: 13-July 04

Posted: Oct 17 2004, 11:04 AM   Quote Post 

tro crevé pour lire dsl lol en plus g dormi 4h cette nuit chui HS x_X

____________________
user posted image

 PMEmail PosterUsers WebsiteAOLMSN  Top

Deather

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 683
Member No.: 3
Joined: 28-December 03

Posted: Oct 17 2004, 11:25 AM   Quote Post 

J'suis sûr qu'ils croient que c'est pour afficher une photo de toi à poil mdr :D

 PMEmail Poster  Top

DarkFantasy

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 684
Member No.: 4
Joined: 21-June 04

Posted: Oct 17 2004, 11:43 AM   Quote Post 

QUOTE (Deather @ Oct 17 2004, 07:38 AM)
Question dark,
Dans ton bouquin d'Assembleur, j'ai lu que pour initialiser un string on pouvait faire:

monstring db "Salut$"

Avec le signe $ à la fin, plutôt que le 0... ça marche aussi ça ?

On t'a pas appris à ne pas faire de doublepost ? Langue.gif ²²²
Sinon pour le dollar $ c'était à l'époque des DOS que cela s'utilisait .. ( Quand j'te disais qu'il datait mon book biggrin.gif ) maintenant le $ permet de renvoyer l'offset courrante. Ses utilisations ? Par exemple dans les programmes en MFC on voit souvent un :
jmp $+5
Parcontre je ne sais pas à quoi il sert laugh.gif
Aussi, il peut servir à compter automatiquement la taille des valeurs exemple:
QUOTE
LongString byte "Ceci est une chaine très très très très longue à"
                byte "calculer, comme on est des geeks faignéants on fait"
                byte "un tour de passe-passe pour la caculer",0
StringLg = ($ - LongString)

Voila smile.gif

____________________
user posted imageuser posted image

 PMEmail PosterUsers WebsiteMSN  Top

Deather

CALLBACK
***************
Group: Administrateu(r|se)
Posts: 683
Member No.: 3
Joined: 28-December 03

Posted: Oct 17 2004, 12:02 PM   Quote Post 

oki merci ;-)

 PMEmail Poster  Top

 1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

Reply to this topicStart new topicStart Poll

 


Top