 |
Photo de mwâ nue :o
 |
|
 |
 |
|
 |
|

|
CALLBACK |
|
               |
|
Group: Administrateu(r|se) |
|
Posts: 684 |
|
Member No.: 4 |
|
Joined: 21-June 04 |
|
|
|  |
|
|
Héhéh en fait c'est mon premier tutorial sur l'asm WIN32 Pas déçu ? Si ? Bon restez merde vous apprendrez quelques chose de super util ....  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à ( surtout msn vu que personne m'parle )
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 
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 
II. Le code
WinMain proto :dword,:dword,:dword,:dword ; Comme en C on déclare la fonction avant 
.data lpClassName byte "MyAppInASM" ,0 lpWndName byte "A Application in ASM32 ",0 lpBnClass byte "button" ,0 lpBnCaption byte "Clique là " ,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 
.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 
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 
.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 
.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 ? 
.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 
.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  .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 
Voila j'espère que je vous avais appris quelques choses, et que vous voudrez vous y mettre Si tel est le cas je suis pratiquement tout le temps dispo où vous savez  Si vous avez une remarque globale poster là ici par exemple qui font les headers & libs inscrites au dessus Voila j'ai tout dit je compte mettre des couleurs au code pour que ça soit plus lisible sur ce... Bonne journée
____________________
| |
|
|
 |
|
 |
 |
|
 |
|

|
HANDLE |
|
             |
|
Group: ~ Tribu ~ |
|
Posts: 300 |
|
Member No.: 16 |
|
Joined: 15-July 04 |
|
|
|  |
|
|
Chui pas venue ici pour te matter nu hein (a)  Nan mais en fait, ce matin j'ai pas le temps de lire tout ça alors m'en veut pas 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  N'empêche que je suis la 1ère à te répondre
____________________
| |
|
|
 |
|
 |
 |
|
 |
|

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

|
CALLBACK |
|
               |
|
Group: Administrateu(r|se) |
|
Posts: 683 |
|
Member No.: 3 |
|
Joined: 28-December 03 |
|
|
|  |
|
|
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 ?
| |
|
|
|
 |
|

|
VOID |
|
            |
|
Group: ~ Tribu ~ |
|
Posts: 212 |
|
Member No.: 6 |
|
Joined: 13-July 04 |
|
|
|  |
|
|
tro crevé pour lire dsl lol en plus g dormi 4h cette nuit chui HS x_X
____________________
| |
|
|
|
 |
|

|
CALLBACK |
|
               |
|
Group: Administrateu(r|se) |
|
Posts: 683 |
|
Member No.: 3 |
|
Joined: 28-December 03 |
|
|
|  |
|
|
J'suis sûr qu'ils croient que c'est pour afficher une photo de toi à poil mdr :D
| |
|
|
| |