A propos d'ACDSee... Je pense qu'on a du, grosso-modo, utiliser la même méthode, Ethan et moi... De mon précédent message, je donnais juste le principe car en effet, tester toutes les possibilités entre 1 et FFFFFFFF demande beaucoup trop de temps... C'est pour ça que j'ai fractionné la recherche en fixant deux valeurs, haute et basse. Et quand on voit la valeur retournée pour "Ethan" par le Generator de Serial, on voit que j'étais pas près de la sortir :) Pour "Anonymous", le code a été retourné rapidement (idem pour ethan avec un espace devant...). Bref voici le code rajouté : (pour la version 2.22b2, je ne sais pas ce qu'il en est pour la nouvelle version 2.23, elle accepte de toutes façons les mêmes SERIAL donc y'aura juste à modifier les offsets je penses). J'ai placé le début de code à l'endroit de l'ancien appel de verif soit en 405C6B : -- première partie : transformation code (valeur hexa) en chaine à l'aide de la fonction WSPRINTFA :00405C6B BBFFFFFFFF mov ebx, FFFFFFFF <-- valeur de départ à tester (valeur haute, on décremente) :00405C70 BFF0FFFFFF mov edi, FFFFFFF0 <-- valeur d'arrivée (valeur basse) * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00405CA2(C) | :00405C75 8D44247C lea eax, dword ptr [esp+7C]<-- on récupère l'offset de la chaine SERIAL :00405C79 53 push ebx <-- on empile ebx (donc la valeur du code à tester) * Possible StringData Ref from Data Obj ->"%u" | :00405C7A 6898F44900 push 0049F498 <-- on empile l'offset de la chaine "%u" :00405C7F 50 push eax <-- on empile l'offset du buffer de sortie * Reference To: USER32.wsprintfA, Ord:0264h | :00405C80 FF15FCFB4A00 Call dword ptr [004AFBFC]<-- appel de WSPRINTFA :00405C86 83C40C add esp, 0000000C <-- on ajuste la pile quelques commentaires : wpsrintf prend dans la forme utilisée ici trois arguments, tous passés par la pile : - le chiffre à transformer (empilé en premier, correspondant au dernier argument donc) - la chaine de "formatage" (ici "%u" signifiant que l'on formate le nombre HEXA en entier non signé) - le buffer de sortie (récupérant le nombre transformer en chaine) A noter que la fonction WSPRINTFA est déjà utilisée par le programme ACDSee, donc son utilisation en est grandement simplifiée, car elle figure dans la table des fonctions importées. On a donc juste à repérer quel CALL appel WSPRINTFA à l'aide de WDASM. (en l'occurence : Call dword ptr [004AFBFC]) Second problème, il nous faut une chaine "%u" indispensable pour WSPRINTF. On va donc utiliser la chaine indiquant "Name and Serial don't match" ou je sais plus quoi... On doit donc répérer l'offset de cette chaine (facile avec WDASM encore une fois) (soit 49F498). Et puis remplacer avec un éditeur de texte le début de "Name and Serial etc... " par "%u" sans oublier de rajouter un 00 de fin de chaine juste après. Nous allons ensuite utiliser le reste de la chaine pour y glisser un "CODE NOT FOUND" ou ce que vous voulez en frenchy (j'ai pris l'habitude de toujours faire les textes en english donc vous étonnez pas pour le CODE NOT FOUND ;)... La chaine "CODE NOT FOUND" va donc commencer en 49F49B (49F498 + 3 -> %u00). N'oubliez pas d'y rajouter un 00 à la fin aussi... Pour résumer en 49F498, on a : % u 00 C O D E N O T F O U N D 00 On continue : -- seconde partie : appel à la routine de vérif de ACDSee :00405C89 8D44247C lea eax, dword ptr [esp+7C] :00405C8D 8D4C243C lea ecx, dword ptr [esp+3C] :00405C91 50 push eax <-- on empile l'offset SERIAL :00405C92 51 push ecx <-- on empile l'offset NAME :00405C93 E828F8FFFF call 004054C0 <-- appel à la routine de VERIF de ACDSee :00405C98 83C408 add esp, 00000008 <-- réajustement de la pile :00405C9B 85C0 test eax, eax <-- on teste si la vérif est ok :00405C9D 750C jne 00405CAB <-- si oui saut :00405C9F 4B dec ebx <-- si non, on décremente ebx :00405CA0 3BFB cmp edi, ebx <-- on vérifie si on a atteint la valeur d'arrivée :00405CA2 7CD1 jl 00405C75 <-- sinon on boucle * Possible StringData Ref from Data Obj ->"No Code found" | :00405CA4 B99BF44900 mov ecx, 0049F49B <-- si on est ici, c'est que le code n'a pas été trouvé :00405CA9 EB41 jmp 00405CEC <-- donc on fixe ecx avec l'offset de "Code Not Found" <-- + saut vers l'affichage * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00405C9D(C) | :00405CAB 8D4C247C lea ecx, dword ptr [esp+7C]<-- si on est ici, c'est que le code a été trouvé, donc :00405CAF EB3B jmp 00405CEC <-- on fixe ecx avec l'offset de la chaine serial -- et on saute vers l'affichage -- portion de code non utilisé ... * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00405CA9(U), :00405CAF(U) | * Possible StringData Ref from Data Obj ->"ACDSee 32" | :00405CEC 8B1524F24900 mov edx, dword ptr [0049F224]<-- on se retrouve ici avec la routine d'affichage du :00405CF2 6A00 push 00000000 <-- MessageBox de ACDSee :00405CF4 52 push edx :00405CF5 51 push ecx <-- seul modif on met un push ecx (qui contient ce qu'on doit <-- afficher, serial ou message "Code not Found") :00405CF6 90 nop <-- et on nop les octets superflux :00405CF7 90 nop :00405CF8 90 nop :00405CF9 90 nop :00405CFA 56 push esi * Reference To: USER32.MessageBoxA, Ord:0195h | :00405CFB FF1538FA4A00 Call dword ptr [004AFA38] Voilà, j'espère que vous avez tout compris (je sais, c'est pas trop clair). Sorry pour mon code ASM non optimisé De toutes façons, mieux vaut étudier le Generator de Serial trouvé par Ed Hayes. Je rends d'ailleurs hommage à son programmeur, mon truc à côté c'est de la merde... A+ Mister X