Customisation de votre Keygen

Nouveaux Concepts:

Ajout d'une ressource bitmap en tant que fond de la boîte de dialogue
Modification de la réponse aux tests de clic de souris
Utilisation des effets de transparence de Win2k/XP
Utilisation de l'extracteur de table de Thigo
Ajout d'un module étendu (xm) de chiptune
Écriture de fonctions plus sophistiquées - utilisation de prototypes, arguments et invoke

Nouvelles fonctions d'API:

SetWindowPos
GetWindowLong
SetWindowLong
SetLayeredWindowAttributes
ShowWindow
Sleep
wsprintf
lstrcat
RtlZeroMemory

 

Dans ce tutoriel, nous allons personnaliser notre keygen en ajoutant un arrière-plan bitmap et en modifiant les styles de fenêtre de notre boîte de dialogue et de ses contrôles pour se débarrasser de la bordure et de la légende médiocres et utiliser des boutons transparents. Nous allons également modifier légèrement la conception et échanger le bouton "Generate" par un bouton "About". Le numéro de série sera généré automatiquement et mis à jour à chaque fois que l'utilisateur saisit du texte.

Nous utiliserons comme exemple réel SuperCleaner 2.9 disponible ici : http://www.southbaypc.com/download/CleanSetup.exe

C'est pratique car la routine de génération du Serial est extraite de la cible presque directement, sans apporter de modifications, il est donc facile de voir comment elle est convertie pour notre keygen ici. Il existe des tutoriels disponibles sur le site ARTeam pour cracker les anciennes versions de cette cible et la routine de génération du Serial n'a pas changé depuis.

Comme précédemment, nous commencerons par concevoir notre boîte de dialogue, puis nous écrirons du code autour des ressources. Nous commencerons par ARTeam_Logo_4.bmp et ajouterons du texte en tant que Labels pour les zones de saisie et les boutons transparents. N'importe quel éditeur de photos devrait faire l'affaire (j'ai utilisé ACDSee). La police de caractère TrueType pour les boutons ("Blade Runner Movie Font") est en accord avec le texte sur le bitmap et a été téléchargée gratuitement sur le web (pour installer de nouvelles polices, il suffit de les coller dans le répertoire C\Windows\Fonts). J'ai renommé le résultat final ARTeam_keygen2.bmp.

Extraire les bitmaps zippés dans votre dossier de projet et créer un nouveau projet exe standard dans WinAsm. Ajoutez un nouveau script de ressource et dans l'éditeur visuel, cliquez sur "Ajouter une nouvelle boîte de dialogue".

 


Modification de la boîte de dialogue

Dans la barre d'explorateur, sous l'onglet "Ressources", sélectionnez la nouvelle boîte de dialogue et modifiez le nom en IDD_KEYGEN. Double-cliquez et supprimez le champ de légende (Caption). Maintenant, double-cliquez sur Style et assurez-vous que les seules entrées suivantes sont définies sur Oui : WS_POPUP, WS_VISIBLE et DS_CENTER.

Cela permettra de se débarrasser de la bordure, de rendre la boîte de dialogue non redimensionnable et de la centrer toujours à l'écran. Maintenant, faites glisser la boîte de dialogue pour l'agrandir jusqu'à ce qu'elle remplisse environ la moitié de l'écran. Cliquez sur le bouton d'image dans la barre d'outils et à l'aide du pointeur en forme de croix, faites glisser un rectangle suffisamment grand pour contenir notre bitmap.

IDC_IMAGE1002 apparaîtra dans la barre d'explorateur de projet. Cliquez sur le bouton Ressources dans la barre d'outils, puis sur Ajouter dans la fenêtre contextuelle qui apparaît. Accédez au fichier ARTeam_keygen.bmp et ajoutez-le. Double-cliquez et modifiez le champ Nom en LOGO et le champ ID en 2002, puis cliquez sur OK. Maintenant, mettez en surbrillance IDC_IMAGE1002, cliquez sur image et dans le menu déroulant, sélectionnez LOGO. Maintenant, le bitmap apparaît sur la boîte de dialogue.

Enfin, il s'agit de redimensionner le bitmap et la boîte de dialogue afin qu'ils se chevauchent sans se superposer avant d'ajouter les contrôles. Ajoutez 2 zones de saisie (editboxes) à côté de Name: et Serial:

Pour la zone de saisie Name, changez le nom en IDC_NAME et le style de sorte que seules les entrées suivantes soient définies sur Oui : WS_CHILD, WS_VISIBLE, WS_BORDER, WS_TABSTOP, ES_AUTOHSCROLL, ES_CENTER

Pour la zone de saisie Serial, changez le nom en IDC_SERIAL, ajoutez ES_READONLY au style et modifiez le texte pour inclure "SuperCleaner 2.9 Keygen".

Enfin, ajoutez 3 boutons poussoirs pour Generate, Copy et Exit. Pour le premier, allongez-le et positionnez-le de manière à couvrir le mot Generate sur le bitmap. Ensuite, modifiez le nom en IDC_ABOUT, le texte en About et le style de sorte que les seules entrées suivantes soient définies sur Oui : WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS, WS_TABSTOP, BS_FLAT.

Enfin, faites de même pour les 2 autres boutons et vous devriez voir ceci :

1

Lorsque cette boîte de dialogue est affichée, les boutons seront invisibles, laissant apparaître le texte cool en dessous. Comparez votre script de ressources avec la copie de la section sourcecodes. Maintenant, collez la source de ce tutoriel dans le fichier asm de votre projet.

1

Comme il y a beaucoup de nouvelles informations ici, je n'analyserai pas cela ligne par ligne, mais discuterai de chaque section séparément. Tout d'abord, la procédure de boîte de dialogue :

1

Il serait pratique que notre nouveau keygen puisse rester au-dessus de toutes les autres fenêtres, donc le code pour cela est ajouté avec les autres codes d'initialisation dans la procédure de boîte de dialogue après le message WM_INITDIALOG et utilise la fonction API SetWindowPos :

invoke SetWindowPos,hWnd, HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE

Comme notre keygen n'a ni bordure ni barre de légende, nous devons pouvoir le déplacer en cliquant n'importe où dessus. Nous faisons cela en manipulant la réponse au test de clic de la souris, c'est-à-dire que nous trompons Windows en lui faisant croire que chaque fois qu'un clic de souris se produit dans la zone cliente de la boîte de dialogue, il se produit en réalité sur la barre de légende ! Le code pour cela est également ajouté dans la procédure de boîte de dialogue :

.elseif uMsg==WM_LBUTTONDOWN
invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0

Le code d'initialisation de notre boîte de dialogue contient également l'appel à la fonction de fondu d'ouverture (fade-in) et aux fonctions de lecture de musique, qui sont expliquées ci-dessous. En cliquant sur le bouton About, une boîte de message avec nos coordonnées s'affiche. La fonctionnalité de copie fonctionne comme décrit dans le dernier tutoriel, et en cliquant sur le bouton Exit, les fonctions de fondu de fermeture (fade-out) et d'arrêt de la lecture de la musique sont appelées avant de détruire la boîte de dialogue.

La nouvelle partie de cette procédure de boîte de dialogue est liée au filtrage des messages provenant de la zone de saisie (editbox), afin que chaque fois qu'un caractère est saisi, nous puissions y répondre en appelant notre procédure de génération et en mettant à jour le Serial. Lorsque le message WM_COMMAND est envoyé par un contrôle, le composant wParam est divisé en deux moitiés. Le Word de poids faible spécifie l'identifiant du contrôle et le Word de poids fort contient un code de notification.

Tout d'abord, nous examinons le mot de faible poids (dans ax) pour voir si le message provient de la zone de saisie Name (IDC_NAME), puis nous devons examiner le Word de poids fort. Étant donné qu'il n'y a aucun moyen en langage d'assemblage de ne consulter que le Word de poids fort d'un registre de 32 bits, nous devons décaler la partie de poids fort dans la partie de poids faible et la lire là-bas. SHR EAX,16 réalise cela en décalant le contenu de EAX vers la droite de 16 bits.

Maintenant, ax contient le Word de poids fort précédent. Si celui-ci est EN_CHANGE, alors la zone de saisie nous indique que le texte a été modifié, nous pouvons donc appeler notre procédure de génération. Omettre cette partie du code produit des résultats étranges avec l'appel de la génération en réponse aux clics de souris, etc.

 


Effets de fondu (Fading)

Pour obtenir l'effet de fondu d'ouverture (fade in) et de fondu de fermeture (fade out) de notre keygen lors de l'ouverture et de la fermeture, nous avons deux procédures appelées FadeIn et FadeOut. Pour cela, nous aurons besoin de deux prototypes, d'une variable DWORD non initialisée "Transparency" et des constantes suivantes que nous devons définir car elles ne sont pas déjà présentes dans le fichier windows.inc : LWA_ALPHA, LWA_COLORKEY, WS_EX_LAYERED et DELAY_VALUE.

Pour utiliser les fonctionnalités de transparence de Windows 2000 ou XP (qui ne sont pas disponibles dans les anciennes versions de Windows), nous devons utiliser une fenêtre en couches (layered window). Cela peut améliorer considérablement les performances et les effets visuels d'une fenêtre ayant une forme complexe, animant sa forme ou souhaitant utiliser des effets de mélange alpha. Le système compose et redessine automatiquement les fenêtres en couches ainsi que les fenêtres des applications sous-jacentes. En conséquence, les fenêtres en couches sont affichées en douceur, sans les scintillements typiques des régions de fenêtres complexes. De plus, les fenêtres en couches peuvent être partiellement translucides, c'est-à-dire en mode alpha-blending. Pour créer une fenêtre en couches, celle-ci doit être créée ou configurée avec le style étendu WS_EX_LAYERED.

La procédure FadeIn ressemble à ceci :

1

L'API GetWindowLong récupère des informations sur une fenêtre. Le type d'informations est spécifié par le deuxième paramètre - dans notre cas, GWL_EXSTYLE demande le style étendu de la fenêtre, qui est renvoyé dans eax. La ligne suivante ajoute la valeur représentée par WS_EX_LAYERED à eax. La troisième ligne définit cette valeur comme style étendu de la fenêtre.

L'API SetLayeredWindowAttributes définit l'opacité et la clé de couleur de transparence d'une fenêtre en couches. Dans ce cas, le dernier paramètre spécifie un réglage de transparence (mélange alpha), et le deuxième paramètre 0 spécifie une transparence complète. La ligne suivante affiche la fenêtre dans un format non activé, et la ligne suivante affecte une valeur de 75 à notre variable de transparence.

La boucle d'instructions suivante incrémente la transparence de 5 et définit la transparence de la fenêtre avec la nouvelle valeur à chaque itération jusqu'à ce que la transparence atteigne 255 (valeur maximale = opaque). Sleep laisse un petit délai entre chaque itération pour que le fondu ne se produise pas trop rapidement pour être visible. Lorsque la transparence est égale à 255, la procédure se termine.

La procédure FadeOut ressemble beaucoup à la précédente et fonctionne à l'inverse :

1

Critiques de cette procédure de fondu :

Notre fonction de fondu d'ouverture (fade-in) est appelée en réponse au message WM_INITDIALOG envoyé à la boîte de dialogue par le système d'exploitation. Le code placé ici est donc exécuté avant que la boîte de dialogue ne s'affiche à l'écran. Le résultat en est qu'une boîte de dialogue vide est fondu d'ouverture avant que l'arrière-plan de l'image bitmap et les contrôles n'apparaissent, tandis que la fonction de fondu de fermeture (fade-out) ne rencontre pas ce problème. Une autre solution (beaucoup plus simple) pourrait consister à utiliser l'API AnimateWindow pour effectuer le mélange alpha. La ligne suivante devrait suivre le message WM_INITDIALOG :

invoke AnimateWindow,hWin,1000,AW_BLEND+AW_ACTIVATE

et la ligne suivante devrait suivre le message WM_CLOSE avant d'appeler EndDialog :

invoke AnimateWindow,hWin,1000,AW_BLEND+AW_HIDE

Cependant, dans notre cas, bien que cela donne un effet de fondu d'ouverture amélioré, les boutons transparents ne sont pas gérés correctement et sont dessinés comme étant visibles au premier plan.

 


Le son

Cette partie expliquera comment ajouter un chiptune (que l'on peut télécharger gratuitement sur de nombreux sites Web) et créer du son en utilisant uFMOD. Il s'agit essentiellement d'un lecteur de modules fasttracker extrêmement simplifié, fourni sous forme de bibliothèque (uFMOD.lib) avec une API composée de seulement 4 fonctions. uFMOD importe des fonctions à partir de winmm.dll, donc la bibliothèque pour cette DLL doit être liée dans notre code source. Les instructions d'utilisation de uFMOD sont contenues dans le fichier ufmodapi.inc et deux exemples de code source sont inclus dans la distribution. uFMOD est une nette amélioration par rapport à l'ancien lecteur miniFmod.

Il existe 3 façons d'ajouter un chiptune à notre application :

1. sous forme de table de données hexadécimales, soit directement collée dans le code asm, soit dans un fichier d'inclusion (inc)
2. sous forme de données brutes du type RT_RCDATA dans la section de ressources.
3. sous forme d'un fichier .xm complet inclus dans la section de ressources.

Dans cet exemple, j'ai opté pour la première option car elle est simple et empêche le chiptune d'être extrait par des logiciels de piratage de ressources. J'ai présenté un exemple d'utilisation de données brutes RT_RCDATA dans la section de ressources dans un tutoriel ultérieur sur l'utilisation des régions (voir ici). Cette méthode pourrait facilement être utilisée ici pour stocker les données du fichier xm dans la section de ressources de notre exécutable.

Tout d'abord, nous devons convertir notre fichier xm en une table et l'enregistrer sous forme de fichier d'inclusion (.inc). Pour cela, nous utilisons l'extracteur de table de Thigo. Lancez l'outil et sélectionnez File > Load, puis parcourez DEFJAM3.XM :

1

Cela vous indique la taille du fichier, il vous suffit de la copier dans la case Taille vide et de remplir les autres cases comme suit :

1

Comme nous le voyons dans la sortie de la liste déroulante, le fichier est enregistré sous le nom result.txt. Comme les données ont été disposées sous forme d'un tableau d'octets hexadécimaux appelé "table", nous devons simplement renommer cela en chiptune.inc et c'est prêt à être utilisé.

Pour utiliser uFM OD, nous devons inclure ufmodapi.inc et deux bibliothèques ufmod.lib et winmm.lib. Ensuite, nous devons inclure nos données xm sous forme de table dans la section .data, soit directement, soit dans un fichier d'inclusion chiptune.inc, comme dans notre exemple (inclus dans la section du code source).

Notez que chiptune.inc contient simplement un énorme tableau de valeurs hexadécimales de taille d'octet appelé "table". Vous vous souviendrez que l'utilisation de l'instruction include est équivalente à taper directement le tableau dans le code. Pour la fonction PlaySong, nous devons connaître la taille des données xm, donc la ligne suivante spécifie la taille dans la variable xmSize.

$ est défini dans le guide des programmeurs MASM soit comme l'opérateur d'adresse courant, soit comme la valeur courante du compteur de position. Dans les deux cas, en soustrayant l'adresse du premier octet dans le tableau de la variable $, on obtient la taille en octets.

Enfin, nous devons ajouter des appels à la fonction PlaySong lorsque la boîte de dialogue est initialisée et détruite. Cette fonction est définie dans ufmodapi.inc comme suit :

1

Étant donné que notre fichier xm est inclus sous forme de tableau de données initialisées, il est chargé en mémoire lors de l'exécution de l'exécutable, donc le troisième paramètre est XM_MEMORY. Le deuxième paramètre est donc la taille des données en mémoire ou xmSize et le premier paramètre est un pointeur vers les données (l'adresse du premier octet de notre tableau). Pour arrêter la lecture du chiptune, il suffit d'appeler à nouveau PlaySong avec 0 paramètre.

 


La Procédure de génération

L'algorithme de génération de numéro de série (Serial) commence par récupérer le texte saisi dans la zone "Name" et le stocke dans NameBuffer. L'adresse de NameBuffer est copiée dans EDI et le nombre de caractères dans NameBuffer (et dans la zone "Name") est calculé et copié dans ESI. Le nombre de caractères est testé pour voir s'il est égal à zéro. S'il est égal à zéro, la variable SerialBuffer et la zone de saisie "Serial" sont vidées et la routine se termine. S'il y a eu une saisie, alors le calcul du Serial commence.

Il y a 4 boucles, chacune ajoutant ou multipliant notre nom par une constante différente et concaténant les résultats pour former un Serial composé de 4 sections.

N'oubliez pas à cette étape que EDI pointe vers le début de la chaîne "Name" et ESI contient le nombre de caractères, et que EAX et ECX ont été mis à zéro. La première constante (Hash1) est chargée dans EDX. Le premier octet de la chaîne "Name" est copié (MOVSX signifie "move with sign extend", c'est une opération d'extension de signe lors du déplacement (ou copie) d'une valeur d'un registre à un autre. Cela signifie que lorsqu'un octet (8 bits) est déplacé vers un registre plus large, comme un Word (16 bits) ou un Dword (32 bits), le bit de signe de l'octet d'origine est répliqué pour remplir les bits supplémentaires du registre de destination. Par exemple, si vous avez un octet dont le bit de signe est 1 (valeur négative) et que vous le déplacez vers un Word ou un Dword, les bits supplémentaires seront également remplis avec des 1 pour conserver la valeur négative. Cela garantit que la sémantique de la valeur signée est préservée lors du déplacement ou de la copie entre registres de tailles différentes.) dans EBX et la valeur de hachage est ajoutée.

1

Une fois que la dernière section du serial a été calculée, elle est ajoutée aux autres parties et le résultat du serial est affiché dans la zone "Serial". J'ai inclus le désassemblage du code cible dans Olly ci-dessous pour que vous puissiez voir à quel point il diffère peu de notre code asm ci-dessus.

1

 


Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !