LES API WINDOWS

By Falcon

E-Mail : falcon16@caramail.com

 

Généralité. 2

Que sont les API ?. 2

Applications : 3

Les bibliothèques d'API les plus courantes. 3

Les différentes API et leur fonction. 4

A/ Lecture – écriture de fichier : 4

ReadFile. 4

WriteFile. 4

_lread. 4

_lwrite. 5

B/ Plus orienté sur la localisation de fichier : 5

SetFilePointer 5

GetSystemDirectory(A) 5

GetPrivateProfileString(A) 6

GetPrivateProfileInt(A) 6

WritePrivateProfileString (A) 6

WritePrivateProfileInt(A) 7

C/ Base de registres Windows : 7

RegCreateKey(A) 7

RegDeleteKey(A) 8

RegQueryValueExA.. 8

RegCloseKey(A) 9

RegOpenKey(A) 9

D/ Boîte de dialogue : 9

GetWindowText(A) 9

GetDlgItemText(A) 9

GetDlgItemInt 10

Hmemcpy. 10

MessageBox(A) 11

MessageBoxExA.. 12

MessageBeep. 12

ShowWindow.. 13

SendMessage. 13

WSPRINTF. 13

E/ Date et heure : 14

GetSystemTime. 14

GetLocalTime. 14

SystemTimeToFileTime. 14

SetTimer 14

F/ Génération d’une fenêtre : 15

CreateWindow.. 15

CreateWindowExA.. 15

Bitblt (similaire à hmemcpy) 15

G/ Appel au CD-ROM... 16

GetDriveType(A) 16

GetLogicalDrives(A) 16

GetLogicalDriveStrings(A) 16

GetWindowWord. 17

GetWindowLong. 17

H/ Messages : 17

BMSG xxxx WM_GETTEXT. 17

BMSG xxxx WM_COMMAND.. 18

 

 

Généralité

 

Que sont les API ?

API est l'abréviation de "Application Programming Interface" soit en français "Interfaces de Programmation d'applications". En fait ce sont des procédures stockées dans des bibliothèque (DLL : "Dynamic-Link Library" = en français "Bibliothèques de liaisons dynamiques" : librairie contenant des procédures appelable depuis plusieurs programmes) et que l'ont peut appeler depuis plusieurs programmes.

L'interface de programmation Win32 (Win32 API) est commune aux systèmes d'exploitation Windows 95 et Windows NT. Les API Windows offrent aux programmeurs la possibilité d'interagir avec le système d'exploitation. Elles offrent des possibilités presque infinies, et dépassent de très loin les possibilités apportées par les environnement de développement (Visual Basic, Windev, ...). Par exemple, elles vous permettront de contrôler une application, d'accéder à la base de registres, de jouer des sons, etc ...

Les API ne sont en fait que des fonctions semblables à celle que vous pouvez créer dans votre environnement de développement : en règle générale, on leur fournit un certain nombre de paramètres, et elles renvoient quelque chose, ou réalisent une action précise. Ces fonctions sont contenues dans des fichiers dll, tels "user32.dll", "kernel32.dll", ou bien d'autres encore. Les fonctions les plus couramment utilisées sont celles qui constituent Microsoft Windows lui-même. Ces procédures sont toutefois écrites en langage C, et doivent donc être déclarées avant de pouvoir les utilisées avec d'autres langages.

Les API Windows sont plutôt faciles à utiliser, une fois que l'on connaît leur déclaration et leurs paramêtres. Leurs difficultés sont autres : les problèmes se posent généralement lorsqu'on cherche l'API qui nous rendrait service, puisqu'on se trouve alors confronté à des milliers de fonctions aux noms pas toujours très explicites. Lorsque enfin on a trouvé celle qui convient, on découvre qu'on est incapable de l'utiliser, car on ne connaît ni sa déclaration, ni ses paramètres, ni son utilisation ! Pour résoudre ce problème, il n'y a pas cinquante solutions : la première est de chercher des exemples utilisant cette API, la deuxième est d'acquérir un livre spécialisé sur les API (il n'en existe que quelques uns en français) ; leur prix avoisine généralement les 400 F (le livre de Richard Simon et al. de chez S&SM Ressources D'EXPERTS : Programmation des API WIN32, est très bien). Cela dit, elle peut souvent se montrer utile, ne serait-ce que pour savoir quelle API peut nous servir.
Enfin, dernières ressources possibles, très intéressantes, mais malheureusement en C++ : la documentation de Visual C++, qui propose une liste de toutes les API, ou, si vous n'avez pas Visual C++, le MSDN Online sur le site de Microsoft (qui contient entre autres cette documentation), ou encore le fichier d'aide win32.hlp (Win32 programmer’s Reference), diponible en téléchargement gratuitement (attention, le zip avoisinne les 6-7 Mo ...). Ce fichier d'aide contient une description très complète des APIs de Widows, des structures à utiliser, etc, mais là encore, en C++...
 


Applications :

 

Les bibliothèques d'API les plus courantes

Fichier

Description

Advapi32.dll

Bibliothèque de services API avancés gérant de nombreuses API, y compris de nombreux appels de sécurité et de registre

Comdlg32.dll

Bibliothèque d'API de boîte de dialogue commune

Gdi32.dll

Bibliothèque d'API pour périphérique à interface graphique

Kernel32.dll

Support d'API de base pour les noyaux Windows 32 bits

Lz32.dll

Routines de compression 32 bits

Mpr.dll

Bibliothèque de routeurs fournisseurs multiples

Netapi32.dll

Bibliothèque d'API réseau 32 bits

Shell32.dll

Bibliothèque d'API Shell 32 bits

User32.dll

Bibliothèque pour routines d'interfaces utilisateur

Version.dll

Bibliothèque de versions

Winmm.dll

Bibliothèque multimédia Windows

Winspool.drv

Interface de spouleur d'impression contenant des appels API de spouleur d'impression

 

 


 

 

 

 

 

 

 

 

Les différentes API et leur fonction

A/ Lecture – écriture de fichier :

Appel générique sur la lecture et l’écriture d’un fichier, habituellement de nature binaire :

ReadFile

Lit les données d'un fichier.

 
 BOOL ReadFile(
      HANDLE  hFile,                                             // handle du fichier à lire
      LPVOID  lpBuffer,                   // pointeur vers le tampon chargé de récupérer les données lu dans le fichier.
      DWORD  nNumberOfBytesToRead,            // nombre d'octets à lire dans le fichier
      LPDWORD  lpNumberOfBytesRead,          // pointeur vers une variable chargée de recueillir le nombre d'octets lus.
      LPOVERLAPPED  lpOverlapped              // pointeur vers une structure OVERLAPPED. Cette structure est nécessaire si le fichier est créé avec l'attribut FILE_FLAG_OVERLAPPED.     
 );

 

Code de retour : TRUE si la fonction a été exécutée avec succès, FALSE dans le cas contraire.


 

WriteFile

Ecrit des données dans un fichier.

 
BOOL WriteFile(
      HANDLE  hFile,                                            // handle du fichier à l'intérieur duquel la fonction doit écrire.
      LPCVOID  lpBuffer,                                        // pointeur vers le tampon contenant les données à écrire.
      DWORD  nNumberOfBytesToWrite,            // nombre d'octets à écrire dans le fichier.
      LPDWORD  lpNumberOfBytesWritten,       // pointeur vers une variable chargée de recueillir le nombre d'octet effectivement écrits par la fonction.
      LPOVERLAPPED  lpOverlapped              // pointeur vers une structure OVERLAPPED. Cette structure est nécessaire si le fichier est créé avec l'attribut FILE_FLAG_OVERLAPPED.   
     );

 

Code de retour : TRUE si la fonction a été exécutée avec succès, FALSE dans le cas contraire.


 

_lread

La fonction _lread lit les données d’un fichier spécifié. Cette fonction est prévue pour les applications 16 bits.

Les applications basées sur 32 bits devront utiliser la fonction ReadFile.

 
UINT _lread(
HFILE  hFile,                          // handle du fichier à lire.
LPVOID  lpBuffer,                    // pointeur vers le tampon chargé de récupérer les données lu dans le fichier. 
UINT  uBytes                           // longueur, en octet, du buffer de données. 
);

 

Code de retour :

La valeur retournée indique le nombre d’octets actuellement lu dans le fichier. Si le nombre d’octets lu est moins important que uBytes, la fonction a atteint la fin du fichier (EOF) avant de lire le nombre d’octets spécifié. Si la fonction échoue, la valeur de retour est HFILE_ERROR.


 

_lwrite

La fonction _lwrite écrit des données dans un fichier spécifié. Elle est utilisée dans des applications 16 bits (WriteFile sera utilisée pou les appli 32 bits)

 
UINT _lwrite(
HFILE  hFile,                          // handle du fichier à écrire.
LPCSTR  lpBuffer,                   // pointeur vers le tampon contenant les données à écrire.
UINT  uBytes                           // nombre d’octets à écrire. 
);      
 
Code de retour : En cas de succès, la valeur retournée indiquera le nombre d’octets actuellement écrit dans le fichier.

Si la fonction échoue, la valeur de retour est HFILE_ERROR.
 

B/ Plus orienté sur la localisation de fichier :

SetFilePointer

Déplace le pointeur d'un fichier ouvert.

DWORD SetFilePointer (

HANDLE hFile,                                     // handle du fichier dont le pointeur doit être modifié

LONG lDistanceToMove,                     // distance sur laquelle le pointeur doit être modifié

PLONG lpDistanceToMoveHigh,       // pointeur vers les 32 bits de poids fort représentant la distance sur laquelle le pointeur doit être déplacé. lpDistanceToMoveHigh est également chargé de récupérer la nouvelle valeur du mot de poids fort de la position du pointeur.

 DWORD dwMoveMethod                   // Position de départ du pointeur

) ;

 

FILE_BEGIN = 0

La position de départ correspond au début du fichier.

FILE_CURRENT = 1

La position actuelle du curseur représente le point de départ.

FILE_END = 2

La position de départ est égale à la fin du fichier.

 

Code de retour : Si la fonction a été exécutée avec succès, elle retourne les 32 bits de poids faible représenatnt la nouvelle position du curseur. Si la fonction échoue, le code de retour est 0xFFFFFFFF.


GetSystemDirectory(A)

Permet de connaître le nom du répertoire Windows\System (pour la première fonction) et le nom du répertoire Windows pour la seconde.

 

UINT GetSystemDirectory(

LPTSTR  lpBuffer, // Chaîne qui recevra en retour le nom du répertoire

UINT  uSize             // Taille de la chaîne qui recoit le résultat

);

Renvoie la longueur du résultat donné si la fonction a réussi, sinon 0. Si l'erreur vient du fait que la taille de la chaîne n'est pas assez importante, le résultat retourné est la longueur à prévoir pour récupérer le résultat.


Appel à la lecture et écriture de fichier de type *.INI :

 

GetPrivateProfileString(A)

La fonction GetPrivateProfileString récupère une chaîne de caractères d’une section spécifiée dans un fichier d’initialisation. Cette fonction est prévue pour une compatibilité avec les applications 16 bits. Les applications 32 bits devront stocker leur information d’initialisation dans la base de registre.

 
DWORD GetPrivateProfileString(
LPCTSTR  lpAppName,                           // pointe vers le nom de la section. 
LPCTSTR  lpKeyName,                          // pointe vers le nom de la clé. 
LPCTSTR  lpDefault,                              // pointe vers la chaîne de caractères par défaut 
LPTSTR  lpReturnedString                    ,                    // pointe vers le buffer de destination 
DWORD  nSize,                                       // taille du buffer de destination 
LPCTSTR  lpFileName                            // pointe vers le fichier d’initialisation 
);

 

Code de retour : Si la fonction a été exécutée avec succès, la valeur de retour est le nombre de caractères copiés dans le buffer, en excluant le caractère de terminaison NULL.

Si ni lpAppName ni lpKeyName sont NULL et le buffer de destination est trop petit pour recevoir la chaîne de caracatères demandée, la chaîne est tronquée et suivie par un caractère null, et la valeur retournée est égal à nSize moins un.


Si lpAppName ou lpKeyName sont NULL et le buffer de destination est trop petit pour recevoir toutes les chaînes de caracatères, la dernière chaîne est tronquée et suivie par deux caractères null. Dans ce cas, la valeur retournée est égal à nSize moins deux.


 

GetPrivateProfileInt(A)

La fonction GetPrivateProfileInt récupère un entier associé avec une clé d’une section spécifiée d’un fichier d’initialisation donné. Cette fonction est prévue pour une compatibilité avec les applications 16 bits. Les applications 32 bits devront stocker leur information d’initialisation dans la base de registre.

 
UINT GetPrivateProfileInt(
LPCTSTR  lpAppName,                          // pointe vers le nom de la section.
LPCTSTR  lpKeyName,                          // pointe vers le nom de la clé. 
INT  nDefault,                                           // valeur de retour si la clé n’a pas été trouvée
LPCTSTR  lpFileName                           // pointe vers le fichier d’initialisation
);

 

Code de retour : Si la fonction a été exécutée avec succès, la valeur retournée est un entier équivalent à la chaîne succédant le nom de clé dans le fichier d’initialisation spécifié. Si cette clé n’est pas trouvée, la valeur retournée sera égale à la valeur spécifiée par défaut. Si la valeur de la clé est plus petite que zéro, la valeur retournée sera égale à zéro.


WritePrivateProfileString (A)

La fonction WritePrivateProfileString copie une chaîne de caractères dans une section d’un fichier d’initialisation spécifié.
 

Cette fonction est prévue pour une compatibilité avec les applications 16 bits. Les applications 32 bits devront stocker leur information d’initialisation dans la base de registre.

 
 
 
 
BOOL WritePrivateProfileString(
LPCTSTR  lpszSection,                     // pointe vers le nom de la section.
LPCTSTR  lpszKey,                           // pointe vers le nom de la clé.
LPCTSTR  lpszString,                       // pointe vers la chaîne de caractères à ajouter 
LPCTSTR  lpszFile                            // pointe vers le fichier d’initialisation
);

 

Code de retour : Si la fonction copie avec succès la chaîne de caractères vers le fichier d’initialisation, la valeur retournée est TRUE.


Si la fonction échoue,
la valeur retournée est FALSE.


WritePrivateProfileInt(A)

Au niveau des interruptions :

Bpint 21 if (ah==3d)

Bpint 2f if (ah==01)


C/ Base de registres Windows :

Création ou suppression d’une clé dans la base de registres :

 

RegCreateKey(A)

Crée ou ouvre une sous-clé de la clé spécifié.
LONG RegCreateKeyEx(

HKEY hKey,                                                                          // handle d'une clé ouverte sous laquelle il faut créer la nouvelle clé, ou

tout autre handle de clé prédéfini (cf tableau ci-dessous)

LPCTSTR lpszSubKey,                                                          // pointeur vers une chaine de caractères contenant le nom de la nouvelle sous-clé. Si la sous-clé existe déjà, elle est ouverte.

DWORD dwReserved,                                                          // définir cette valeur sur NULL.

LPTSTR lpszClass,                                                                 // pointeur vers une chaine de caractères contenant le nom de classe de la clé. Si la clé existe déjà, on ignore ce paramêtre.

DWORD dwOptions,                                                            // options de stockage spécial associées à la clé

REGSAM samDesired,                                                         // options d'accès aux clés

LPSECURITY_ATTRIBUTES lpSecurityAttributes,      // pointeur vers une structure SECURITY_ATTRIBUTES qui spécifie les attributs de sécurité par défaut.

PHKEY phkResult,                                                               // pointeur vers l'emplacement recevant l'handle de la nouvelle sous-clé.

LPDWORD lpdwDisposition                                                // pointeur vers une valeur de disposition indiquant si la sous-clé a été créée (REG_CREATED_NEW_KEY = &H1) ou si une sous-clé existante a été ouverte (REG_OPENED_EXISTING_KEY = &H2)

) ;
 

HKEY_CLASSES_ROOT

&H80000000

HKEY_CURRENT_USER

&H80000001

HKEY_LOCAL_MACHINE

&H80000002

HKEY_USERS

&H80000003

 

Code de retour : ERROR_SUCCESS est retourné en cas de succès ; dans le cas contraire, la fonction transmet un code d'erreur.

 


 

RegDeleteKey(A)

Supprime une sous-clé d'une clé donnée.

LONG RegDeleteKey (

HKEY hKey,                           // handle d'une clé ouverte ou tout autre handle de clé prédéfini

LPCTSTR lpszSubKey          // pointeur vers une chaine de caractères contenant le nom de la sous-clé à supprimer. La clé spécifiée ne doit pas posséder de sous-clé

) ;

 

Code de retour : ERROR_SUCCESS est retourné en cas de succès ; dans le cas contraire, la fonction transmet un code d'erreur.



 

Lecture d’une valeur d’une clé dans la base de registres :

RegQueryValueExA

Cette fonction est à utiliser pour récuperer la valeur d'une clé que l'on aura ouvert ou crée au préalable.
hKey est le handle retourné par la fonction d'ouverture ou de création. lpValueName est le nom de la valeur que l'on veut récuperer. Pour les valeurs "(Défaut)" il faut donner une chaîne vide en paramêtre. lpReserved, réservé, à mettre à 0. lpType stocke le type de donnée qui sera récupéré. Les valeurs possibles sont données dans le tableau ci-dessous. lpData est la variable dans laquelle sera retournée la valeur lue. lpcbData est la longueur du buffer lpData. Après execution de la fonction elle retourne la longueur réelle de la variable lpData.

Constante

Définition

Const REG_NONE = 0

Non défini.

Const REG_SZ = 1

Chaîne terminé par un caractère nul.

Const REG_BINARY = 3

Valeur binaire.

Const REG_DWORD = 4

Mot sur 4 octets.

Const REG_DWORD_BIG_ENDIAN = 5

Mot sur 4 octets dont le poids fort est à l'adresse inférieure.

Const REG_LINK = 6

Définition d'un lien.

Const REG_MULTI_SZ = 7

Ensemble de chaînes terminées par un caractère nul. La fin est signalée par deux caractères nul.

 

Communique une valeur nommée de sous-clé.

LONG RegQueryValueEx (

HKEY hKey,                           // handle de la sous-clé à consulter ou tout autre handle de clé prédéfini

LPCTSTR lpszSubKey,         // pointeur vers une chaine de caractères contenant le nom de la clé dont la valeur est demandée

LPTSTR lpszValueName,     // pointeur vers une chaine de caractère contenant le nom de la valeur à lire

LPDWORD lpdwReserved, // réservé. Défini sur NULL

LPDWORD lpdwType,          // type de données stockées dans la valeur

LPBYTE lpData,                    // pointeur vers le tampon recevant les données stockées dans la valeur

LPDWORD lpdwcData         // pointeur vers un DWORD contenant le nombre d'octets disponibles dans le tempon lpData. Après l'appel, le système définit le contenu sur le nombre d'octets véritablement copiés

) ;

 

Code de retour : ERROR_SUCCESS est retourné en cas de succès ; dans le cas contraire, la fonction transmet un code d'erreur.
 



Ouverture ou fermeture d’une clé :

RegCloseKey(A)

Ferme l'handle d'une clé ouverte.

LONG RegCloseKey (

HKEY hKey             // handle de la clé à fermer

) ;

Code de retour : ERROR_SUCCESS est retourné en cas de succès ; dans le cas contraire, la fonction transmet un code d'erreur.
 


RegOpenKey(A)

Ouvre une sous-clé de registre.

LONG RegOpenKeyEx (

HKEY hKey,                           // handle de la clé qui est la touche parent de la sous-clé à ouvrir

LPCTSTR lpszSubKey,         // pointeur vers une chaine de caractères contenant le nom de la sous-clé à ouvrir

DWORD dwReserved;           // réservé. Défini sur zéro

REGSAM samDesired,          // masque de sécurité

PHKEY phkResult                  // pointeur d'un emplacement où l'handle de la clé est stocké

) ;

 

Code de retour : ERROR_SUCCESS est retourné en cas de succès ; dans le cas contraire, la fonction transmet un code d'erreur.

 


D/ Boîte de dialogue :

Saisie de données alphanumériques depuis une boîte de dialogue

 

GetWindowText(A)

Récupère le titre d'une fenêtre, d'un contrôle ou d'une zone de saisie.

INT GetWindowText (

HWND hwnd,          // handle de la fenêtre ou du contrôle contenant le texte

LPTSTR lpsz,          // pointeur vers un tampon qui recevra le texte

int nChars          // nombre maximum de caractères à copier dans le tampon. Les caractères dépassant la limite seront tronqués

) ;

 

Code de retour : Si la fonction est exécutée avec succès, la valeur retournée est le nombre de caractères copiés dans le tampon

 


GetDlgItemText(A)

La fonction GetDlgItemText récupère le titre ou le texte associé avec une boîte de dialogue.

 
UINT GetDlgItemText(
HWND  hDlg,                          // handle de la boîte de dialogue
int  nIDDlgItem,                         // identifiant de la boîte de dialogue
LPTSTR  lpString,                    // pointe vers le buffer pour le texte
int  nMaxCount                          // taille maximum de la chaîne
);

 

Code de retour : Si la fonction est exécutée avec succès, la valaur de retour spécifie le nombre de caractères copiés dans le buffer, en excluant le caractère de terminaison null.

 

Si la fonction échoue, la valeur retournée est zéro.

 


GetDlgItemInt

La fonction GetDlgItemInt convertie le texte d’une boîte de dialogue spécifiée en une valeur entière.

The GetDlgItemInt function translates the text of a specified control in a dialog box into an integer value.

 
UINT GetDlgItemInt(
HWND  hDlg,                         // handle de la boîte de dialogue
int  nIDDlgItem,                     // identifiant de la boîte de dialogue
BOOL*  lpTranslated,          // pointe vers une variable pour recevoir l’indicateur de réception (succès/echec)
BOOL  bSigned                    // spécifie si la valeur est signée ou non
);

 

Code de retour : Si la fonction est exécutée avec succès, la variable pointée par lpTranslated est mise à TRUE, et la valeur retournée est la valeur convertie du texte.


Si la fonction échoue, la variable pointée par lpTranslated est mise à FALSE, et la valeur retournée est zéro.


Si lpTranslated est NULL, la fonction retournera aucune information sur son succès ou son échec.


Si le paramêtre bSigned est TRUE, spécifiant que la valeur à extraire est un nombre entier signer, la valeur retournée sera alors de type INT.


Hmemcpy

Hmemcpy est utilisée pour la saisie des chaînes de caractères au clavier (comme le nom et le numéro de série) afin de permettre leur manipulation, leur comparaison...
Vous pouvez posez un point d'arrêt qui se déclenchera dès son l'utilisation: bpx hmemcpy, et partir ensuite à la pêche du bon sérial.
Pour cela, commencez par renseigner les champs de la boîte d'enregistrement, puis faites CTRL-D pour pouvoir entrer le breakpoint sur la ligne de commande de SoftIce, puis quittez le débuggueur (F5), et validez vos entrées en cliquant sur le bouton [OK], (ou Register...).
Si cette fonction est sollicitée (ce qui est majoritairement le cas), SoftIce apparaîtra immédiatement.
Vous serez dans des routines du genre USER (0A) qui ne vous apporteront rien. Pour en sortir vous devrez tapez sur [F12] (Return After Call) pour revenir au listing de votre programme / cible, dont vous verrez le nom apparaître sur la ligne qui sépare la fenêtre des codes de celle des commande de SoftIce.
Bien souvent, l'application qui vous intéresse sera trouvée après un KERNEL32!_FREQASM, et dans certains cas c'est un call GetDlgItemtextA, ou un call GetWindowTextA qui l'aura appelé.
Pour chacun des champs qu'aura pu contenir la boite de dialogue que vous aurez remplie, vous aurez un break sur Hmemcpy. Suivant les cas, la sortie des kernels se fera soit sur le même call d'appel (dans l'application), soit à des calls differents:

Call Nom
Call Company
Call Serial

C'est principalement le call lié à la saisie de votre numéro de série qui présentera de l'intérêt, et c'est à partir de ce dernier qu'il va falloir être vigilant, et partir à la recherche de tests, de comparaisons, ou de branchements (JNE, JNZ, JE, JZ...).

 

CALL               0041EF84

MOV                EAX,[EBP-14]              < votre sérial stocké dans EAX

MOV                EDX,[004738D4]           < le bon sérial stocké dans EDX

CALL               00403D8C                    < call de la routine de comparaison des 2 sérials

JNZ                 00466E39                                 < jump à registered si OK (not zéro)

MOV                EAX,00466F34             -----------.

CALL               0043C650                                 |

JMP                00466EA2                                |-- si pas OK, met à zéro,

MOV                EAX,004738D4                         |   et va en unregistered.

MOV                EDX,00466F7C                        |

CALL               00403A54                                 -----------'

 

Pour connaître le contenu des registres, dans SoftIce, entrez "d edx" (sans les guillemets), et vous verrez le contenu de ce registre (forme ASCII) s'afficher dans la fenêtre des Datas (WD nb de lignes -> WD 8). Si vous tapez "? edx", vous obtiendrez la valeur hexadécimale de EDX (parfois utile quand le sérial n'est pas géré au format ASCII).

Vous n'aurez pas toujours la chance de trouver le bon sérial poussé dans un registre, mais vous pourrez peut être en trouver l'écho en utilisant l'ascenseur de la fenêtre de Datas pour regarder plus ou moins 80 lignes au dessus et en dessous de l'adresse où se sera affiché le numéro de série que vous avez entré.

Une autre routine très commune peut être trouvée sous cette forme:

 

PUSH              EAX                             < pousse une valeur sur la pile

CALL               004067CC                    < compare cette valeur avec une autre

ADD                ESP,04      

TEST               EAX,EAX                     < test si le résultat de la comparaison est satisfaisante

JNZ                 00402B68                     < jump en registered si <> de zéro

PUSH              0040B61B                    < hmm....et c'est quoi ça?

PUSH              64

PUSH              EBX

CALL               00402133                     < affichage de l'écran Code Invalide
 

Dans cette exemple, le bon sérial est poussé sur le dessus de la pile (Push eax) pour être traité dans le call suivant. Interrogez le registre EAX (d eax) pour en connaître le contenu. A la sortie du Call, EAX a changé de valeur, et si EAX est différent de 0, vous sauterez à la routine Code valide. (Il est bon de préciser qu'il est préférable de trouver OU eax peut prendre la valeur 0 ou 1 dans le call 004067CC, plutôt que de se contenter d'inverser le branchement JNZ 00402B68).
Le Push 00402B61B, lui, va pousser sur la pile le contenu de l'adresse mémoire 0040B61B, qui aura la forme, à cet endroit, du message "Code Invalide".

 


Ouverture d’une boîte dans laquelle nous avons fréquemment le message « Invalid registration » :

MessageBox(A)

Création, affichage et toute opération sur les boîtes de bialogue. La boîte de dialogue (ou message) contient un message et un titre bien définie, ainsi que les infos sur les icônes et boutons.

 
INT MessageBox(
HWND  hWnd,                        // handle de la fenêtre du propriétaire
LPCTSTR  lpText,                    // pointe vers le texte contenu dans la boîte
LPCTSTR  lpCaption,            // pointe vers le titre de la boîte
UINT  uType                           // style de la boîte (bouton, icône, …)
);

 

Code de retour : La valeur retournée est zéro i il n’y a pas assez de mémoire pour créer la boîte de message. Si la fonction est exécuté avec succès, la valeur retournée est l’une des suivantes :


IDABORT, IDCANCEL, IDIGNORE, IDNO, IDOK, IDRETRY, IDYES

Si une boîte de message possède un bouton Cancel, la fonction retourne la valeur IDCANCEL si les boutons ESC ou CANCEL sont sélectionnés.
Si la boîte de message ne possède pas de bouton CANCEL, la touche ESC n’aura aucun effet.

 


MessageBoxExA

Création, affichage et toute opération sur les boîtes de bialogue. La boîte de dialogue (ou message) contient un message et un titre bien définie, ainsi que les infos sur les icônes et boutons. Le paramètre wLanguageId spécifie quel langage est utilisé dans la définition des boutons par exemple.

 
INT MessageBoxEx(
HWND  hWnd,                        // handle de la fenêtre du propriétaire
LPCTSTR  lpText,                    // pointe vers le texte contenu dans la boîte
LPCTSTR  lpCaption,             // pointe vers le titre de la boîte
UINT  uType,                          // style de la boîte (bouton, icône, …)
WORD  wLanguageId            // identifiant du langage utilisé (Exemple : LANG_ENGLISH, LANG_FRENCH, …)
);

 

Code de retour : Si la fonction est exécutée avec succès, la valeur retournée sera égale au choix (une valeur retournée) effectué dans la boîte de dialogue :

 

Valeur                          Signification

IDABORT                   Bouton Abort a été sélectionné.

IDCANCEL                 Bouton Cancel a été sélectionné.

IDIGNORE                  Bouton Ignore a été sélectionné.

IDNO                            Bouton No a été sélectionné.

IDOK                            Bouton OK a été sélectionné.

IDRETRY                    Bouton Retry a été sélectionné.

IDYES                          Bouton Yes a été sélectionné.


MessageBeep

Joue un evénement sonore. Cet évenement est identifié par une entrée dans la section [sounds] de la base de registre.

The waveform sound for each sound type is identified by an entry in the [sounds] section of the registry.

 
BOOL MessageBeep(
UINT  uType                           // type du son  
);

 

Code de retour : Si la fonction est exécutée avec succès, la valeur retournée est TRUE. Si la fonction échoue, la valeur retournée est FALSE.

 

 

 


ShowWindow

La fonction ShowWindow indique l’état (visuel) d’une fenêtre.

 
BOOL ShowWindow(
HWND  hwnd,                        // handle de la fenêtre
int  nCmdShow                                          // montre l’état de la fenêtre
);

 

Code de retour : Si la fenêtre était précédemment visible, le code de retour sera TRUE. Par contre si la fenêtre était cachée, le code de retour sera FALSE.

 


 

D’autres possibilités sur l’apparition de texte :

SendMessage

La fonction SendMessage envoie un message spécifié vers une ou plusieurs fenêtres.

 
LRESULT SendMessage(
HWND  hwnd,                       // handle de la fenêtre de destination
UINT  uMsg,                           // message à envoyer
WPARAM  wParam,            // paramêtre du 1er message
LPARAM  lParam                // paramêtre du 2ème message
);

 

Code de retour : La valeur retournée détermine le resultat du traitement du message et depend du message envoyé.

 


WSPRINTF

La fonction Wsprintf prépare et positionne une série de caratères et valeurs dans un buffer. Tous les arguments sont convertis et copiés dans le buffer de sortie selon le format spécifié de la chaîne de caractères. La fonction ajoute le caractère de terminaison null aux caractères écrits, mais la valeur retournée n’inclus pas le caratère de terminaison null dans son comptage de caratères.

 

int wsprintf(

LPTSTR  lpOut,                      // pointe vers le buffer pour recevoir la sortie formattée 

LPCTSTR  lpFmt                   // pointe vers un caractère de terminaison null qui contient les spécifications de format de contrôle

...                                                // arguments optionnels

);             

 

 

Code de retour : Si la fonction est exécutée avec succès, le valeur retournée correspond au nombre de caractères stockés dans le buffer de sortie, sans compter le caractère de terminaison null.

Si la fonction échoue, la valeur retournée est moins grande que la longueur de la chaîne de car du faormat de contrôle.

 


 

 

 

 

E/ Date et heure :

GetSystemTime

Récupère l'heure système.

 
VOID GetSystemTime(
LPSYSTEMTIME  lpSystemTime                // pointeur vers une structure SYSTEMTIME recevant l'heure système courante
);

 

Code de retour : cette fonction ne retourne aucune valeur

 

GetLocalTime

Récupère l'heure locale.

 

VOID GetLocalTime(

LPSYSTEMTIME  lpSystemTime              // pointeur vers une structure LPSYSTEMTIME contenant la date et l'heure locale.

);

 

Code de retour : Cette fonction ne retourne aucune valeur.

 

SystemTimeToFileTime

La fonction SystemTimeToFileTime convertie une date sytème vers un fichier date.

 
BOOL SystemTimeToFileTime(
CONST SYSTEMTIME *  lpst,              // pointe vers la date système à convertir address of system time to convert 
LPFILETIME  lpft                                    // pointe vers un buffer pour le fichier date convertie 
);

 

Code de retour : Si la fonction est exécutée avec succès, la valeur retournée est TRUE. Si la fonction échoue, la valeur retournée est FALSE.

 


SetTimer

La fonction SetTimer créée un timer avec la valeur d’un temps restant à écouler.

 

UINT SetTimer(

HWND hWnd,                                        // handle de la fenêtre pour les messages timer

UINT nIDEvent,                                    // identifiant du timer

UINT uElapse,                                        // valeur du time-out en millisecondes

TIMERPROC lpTimerFunc                                 // pointe vers la procédure du timer

);

 

Si lpTimerFunc est NULL, le system poste un message WM_TIMER vers l’application en attente.

 

Code de retour : Si la fonction est exécutée avec succès, la valeur retournée est un entier assimilé au nouveau timer. Si la fonction échoue à la création d’un timer, la valeur de retour sera zéro.


 

F/ Génération d’une fenêtre :

CreateWindow

La fonction CreateWindow créée un pop-up ou un fenêtre enfant. Elle spécifie la classe, le titre, le style de la fenêtre et (optionnellement) la position initiale et la taille de la fenêtre. La fonction spécifie donc la fenêtre parent ou propriétaire, si existante, et le menu de la fenêtre.

 
HWND CreateWindow(
LPCTSTR  lpClassName,                        // pointe vers le nom de classe enregistrée
LPCTSTR  lpWindowName,                   // pointe vers le nom de la fenêtre
DWORD  dwStyle,                                    // style de fenêtre
int  x,                                                            // coordonée horizontale de la fenêtre
int  y,                                                            // coordonée verticale de la fenêtre 
int  nWidth,                                                // largeur de la fenêtre
int  nHeight,                                               // hauteur de la fenêtre
HWND  hWndParent,                              // handle de la fenêtre parent ou propiétaire
HMENU  hMenu,                                      // handle du menu ou de l’indentifiant de la fenêtre fille
HANDLE  hInstance,                               // handle de l’application instance
LPVOID  lpParam                                    // point vers les données de la fenêtre de création
);

 

Code de retour : Si la fonction réussie, la valeur retournée est l’handle de la nouvelle fenêtre.

Si la fonction échoue, la valeur retournée est NULL.
 


CreateWindowExA

Idem à CreateWindow mais avec un style étendu.

 
HWND CreateWindowEx(
DWORD  dwExStyle,                               // style de fenêtre étendue
LPCTSTR  lpClassName,                        // pointe vers le nom de classe enregistrée
LPCTSTR  lpWindowName,                   // pointe vers le nom de la fenêtre
DWORD  dwStyle,                                    // style de fenêtre
int  x,                                                            // coordonée horizontale de la fenêtre
int  y,                                                            // coordonée verticale de la fenêtre
int  nWidth,                                                // largeur de la fenêtre
int  nHeight,                                               // hauteur de la fenêtre
HWND  hWndParent,                              // handle de la fenêtre parent ou propiétaire
HMENU  hMenu,                                      // handle du menu ou de l’indentifiant de la fenêtre fille
HINSTANCE  hInstance,                        // handle de l’applicationinstance
LPVOID  lpParam                                    // point vers les données de la fenêtre de création
);

 

Code de retour : Si la fonction réussie, la valeur retournée est l’handle de la nouvelle fenêtre.

Si la fonction échoue, la valeur retournée est NULL.

 


Bitblt (similaire à hmemcpy)

La fonction BitBlt effectue un transfert de bits de donnée couleur correspondant à un rectangle de pixels d’un contexte source spécifié vers un contexte destination.

 
BOOL BitBlt(
HDC  hdcDest,                         // handle du contexte destination 
int  nXDest,                               // coordonnées x du coin haut gauche du rectangle de destination
int  nYDest,                               // coordonnées y du coin haut gauche du rectangle de destination
int  nWidth,                               // largeur du rectangle de destination 
int  nHeight,                             // hauteur du rectangle de destination
HDC  hdcSrc,                           // handle du contexte source
int  nXSrc,                                 // coordonnées x du coin haut gauche du rectangle source
int  nYSrc,                                 // coordonnées y du coin haut gauche du rectangle source
DWORD  dwRop                       // code d’opération de trame. 
);

 

Code de retour : Si la fonction réussie, la valeur retournée est TRUE sinon FALSE.

 


G/ Appel au CD-ROM

GetDriveType(A) 

La fonction GetDriveType détermine si un disque dur est amovible, fixe, CD-ROM, disque RAM ou lecteur réseau.

 

UINT GetDriveType(

LPCTSTR  lpRootPathName              // pointe vers le path root

);            

 

 

Code de retour : La valeur retournée spécifie le type de lecteur. Elle peut être l’une des suivantes :

 

(si eax=00000005 alors CDROM présent)

GetDriveType retourne les codes suivants :

 

Valeur                  Association

0                     Le lecteur ne peut être déterminé

1                     Le répertoire Root n’existe pas

2                     Lecteur amovible

3                     Disque dur

4                     Lecteur réseau

5                     Lecteur CD-Rom

6                     Disque Ram

 


GetLogicalDrives(A)

Retourne un bitmask représentant le lecteur disque actuellement utilisé.

 

     DWORD GetLogicalDrives(VOID);

 

Code de retour : Si la fonction réussie, la valeur retournée est un bitmask représentant le lecteur disque actuellement utilisé.

Bit position 0 est le lecteur A, bit position 1 est le lecteur B, bit position 2 est le lecteur C, et ainsi de suite. Si la fonction échoue la valeur retournée est zéro.

 


GetLogicalDriveStrings(A)

Rempli un buffer avec des chaînes qui spécifient les lecteurs valides du système.

 
DWORD GetLogicalDriveStrings(
DWORD  nBufferLength,                        // taille du buffer
LPTSTR  lpBuffer                                     // pointe vers les chaînes du buffer pour les lecteurs 
);

 

Code de retour : Si la fonction réussie, la valeur retournée est la longueur, en caractères, des chaînes copiées dans le buffer, en excluant le caractère de terminaison null.
Si le buffer n’est pas assez large, la valeur retournée est plus grande que nBufferLength. Si la fonction échoue la valeur retournée est zéro.


 

 

GetWindowWord

La fonction GetWindowWord permet de connaître des informations propres à la définition de la fenêtre

 

WORD GetWindowWord(

HWND  hWnd,        // handle de la fenêtre

int  nIndex                // offset of value to retrieve

);             

 

Code de retour : Si la fonction réussie, la valeur retournée est une valeur 16 bit demandée.

Si la fonction échoue, la valeur retournée est zéro.

 


GetWindowLong

Cette fonction permet de connaître des informations propres à la définition de la fenêtre. 
 
WORD GetWindowLong(

HWND  hWnd,        // handle de la fenêtre

int  nIndex                // offset of value to retrieve

);             

Index contient une constante au choix dans la liste ci-dessous. Elle retourne zéro en cas d'échec

Constante

Définition

Public Const GWL_WNDPROC = (-4)

Pour connaître l'adresse de la fonction WindProc de la fenêtre.

Public Const GWL_STYLE = (-16)

Renvoie le style de la fenêtre.

Public Const GWL_EXSTYLE = (-20)

Renvoie le style étendu de la fenêtre.

Public Const GWL_HWNDPARENT = (-8)

Permet de récupérer le handle de la fenêtre Parent.

Public Const GWL_HINSTANCE = (-6)

Pour récupérer le handle de l'instance possédant la fenêtre.

 

 


H/ Messages :

BMSG xxxx WM_GETTEXT

(utile pour les mots des passes)

WM_GETTEXT est utilisé pour intercepter les données saisies par l’utilisateur quand Windows les rend au programme original.

xxxx est évidemment la valeur de l’handle.

Il y a divers moyen de connaître l’handle de la fenêtre, le plus facile étant d’utliser un analyseur de fenêtres qui affiche les caractéristiques d’une fenêtre choisie (ex : win_frog, SMU Winspector, …) mais vous pouvez utiliser la méthode suivante :

Sous SoftIce, tape la commande TASK pour voir les process actifs , ensuite tu tapes HWND process_name (ou process_name est le nom du proces de ton programme) et après tu recevras une liste de tout les objets dans windows … un d’entre eux est celui qui t’intéresse …. Il n’est pas toujours simple de savoir celui qui t’intéresse et quelques tuts discutent de ce sujet. Je te conseille donc fortement d’utiliser WinSpector par exemple.

 


BMSG xxxx WM_COMMAND

(utile pour les boutons OK)