|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de ultralingua 4.4.8 fr
Windasm 8.9 Pour désassembler le progamme (transformation en langage d'assemblage) et pour trouver les string data references nécessaires pour élaborer le crack. WinHex 10.2
Offset Déplacement depuis le début de la zone de code d'un programme. EB 90
Détail des modifications ultralingua.exe
Ultralingua.exe
Avant propos Onva s'attaquer aujourd'hui au dictionnaire français anglais de lasociété ultralingua. Avant de commencer je voudrais faire un petitrappel sur le désassemblage de ultralingua par windasm. Lorsque l'on désassemble le programme et qu'on regarde les string data reference on voit qu'une chaine "registered" est présente. Le programme peut donc être passéde la version "non enregistrée" à la version "enregistrée". On s'en saurait douté car il y a possibilité de saisir une clef d'enregistrement. Mais il faut savoir que dans certains programmes cette chaîne existe sans possibilité de saisir une clef comme winzip 8.1 (fr) ou winrar 3.40 (fr) et donc que le programme peut être enregistré même s'il n'en a pas l'air.Dans mon cours surle craquage de Ultralingua 4.4.8 onva s'appuyer sur la présence de cette chaîne "registered".
Octet1 Notre but : afficher "enregistré" dans le nag à la place du nombre de jours restants pour l'évaluation ("days remaining" en anglais).On cherche dans windasm la string data reference "registered" avec search->find text. On arrive ici (1 seule occurence :))
Explication : 00456B737548jne 00456BBD -> àcette adresse le programme saute par dessus "registered" et nous envoie en 00456BBD juste au dessus * Possible Reference to String Resource ID=12810: "<days remaining>". Solution : annuler le saut en 00456B73 en sautant parexemple à l'adresse de l'instruction suivante 00456B75 ce qui s'écrit en asm jne 00 (en hexa cela donne 75 48 remplacé par 75 00).
Octet2 Notre but : valider le cochage de l'option "Afficher cet écran au lancement" dans le nag(une fois l'octet 1 modifié).Ce cochage nous permet de fermer le nag en cochant cette case ou bien par la suitele remettre si on a envie. On regarde les string data references dans windasm. Une chaîne nommée "no reminder" est présente. C'est ce qu'on cherche. No reminder = "pas de rappel" en français. On fait avec search->find text->no reminder. On arrive ici (1 seule occurence :))
Explication : 00459F357411je 00459F48-> c'est ce saut qu'il faut annuler pour entrer dans le "noreminder". Solution : le debugger de windasm lancé sur ultralingua saute par dessus "No Reminder" et nous envoie en 00459F48. Solution annuler le saut en 00459F35 en sautant juste à l'adresse qui suit 00459F35 ce qui s'écrit en asm je 00 (en hexa cela donne 74 11 remplacé par 74 00: on remplace le byte (octet) 11par 00).
Octet3 Notre but : retirer le time-limit (version évaluable à l'infini).Si on lance le programme après 20 jours d'évaluation les dictionnaires ne sont plus actifs dans la fenêtre qui suit la fenêtre de nag. C'est la protection la plus dure à retirer. On revient sur la string data reference "registered" avec search->find text. On arrive ici (1 seule occurence :))
Explication :00456B64E8B9D9FEFFcall 00444522 -> on va decendre dans ce call qui est impliqué dans le time-limit (flèche droite dans windasm après avoir surligné cette ligne) Solution : le call en 00456B64 est intéressant car il nous enmène dans une zone de code où le programme fait appel à une API windows (enl'occurence l'API nommée ADVAPI32.dll qui se trouve dans votre répertoireC:\windows\system32). Celle-ci gère les accès et les interrogrationsau registre de windows. Dans notre cas le programme va interroger le registre pour voir si on est enregistré (auquel cas le time limit est annulé !). * Reference To: ADVAPI32.RegOpenKeyExA, Ord:0172h ->établi une connection au registre. On va regarder après ces appels pour voir où la comparaison va se faire (le programme a besoin de savoir si on est enregistré ou non). On va utiliser le debugger de windasm. Faites les opérations suivantes pour le lancer sur ultralingua (vous devez avoir ouvert ultralingua avant dans windasm) ->CTRL L Là on réfléchit. 00000014 c'est quoi ? C'est de l'héxadécimal. Mais encore ? En décimal ça vaut 20 (16x1+4). Ca ne vous rappelle rien ? Souvenez-vous la première fois que vous avez lancé ultralingua il nous mettait 20 jours pour l'évaluation. Vous avez compris ! C'est à cet endroit que le programme compare (instruction cmp) le contenu d'adresse base de pile (ebp=extra base pointer) translatée de 70 octets (ie déplacement de 70 par rapport à ebp) à 14. C'est donc à cet endroit que l'on va craquer. On continue à faire F8 (2 fois).Voicile code assembleur que vous avez dans votre fenêtre (sans les commentaires enblanc que j'ai rajoutés) :
:0044489A837D9014cmp dword ptr [ebp-70], 00000014
Le programme ne saute donc pas en004448AC et ilva doncmettre 00000000 dans le contenu de l'adresse ebp+FFFFFE68. On va empêcher ça en forçant le saut en 0044489E.En assembeur cela se traduit par jl 004448AC quiva devenirjmp 004448AC ; ouencore en hexa décimal cela donne 7C0C remplacé par EB0C. Rappel : pour toute modificationphysique de l'exécutable on utilise un éditeur hexa décimal. Moic'est winhex 10.0. On cherche l'offset obtenu dans la barre de statutde windasm (tout en bas) pour l'instruction sélectionnée et on seplace sur cet offset dans winhex (ALT G). Et ensuite on remplacepar exemple 7C par EBdans winhex.
On lance le programme et on voit que le programme est complètement craqué. :).
Le mot de la faim : on a exactement le même schéma de protection avec les mêmes adresses et les mêmes string data références pour la version francais italien, français espagnol, français anglais médical, français définitions, français allemand.En fait chez ultralingua ils ont mis le même exécutable ultralingua.exe pour tous les dictionnaires !
Voila c'est fini ! ![]()
|