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