WinImage 5.00.5000

By alien

objet : winimage version 5.00

outils : Softice
         Wdasm ( pour les références )
         calculatrice hexa
         bloc, bic, feutre,.........

Vérification avant de commencer; touches F10 et F8 en bon état ok; stock valium ok; personne dans le coin pour nous déranger ok; on peut y aller.
Dernière version sur le marché, si le soft est connu depuis longtemps je n'ai pas vu de tut sur le générateur de code et comme ici il n'est pas question de compression ou autre truc tordu ben ca serait bien pour nous débutants de faire joujou avec lui.
Commençons par le début, on rentre nom et code dans la registerbox: alien 123456
CTRL D; SI pour poser un bpx hmemcpy; F5 retour dans winimage; clic sur ok; retour sous SI; 9 fois F12 et on tombe juste après ce call esi en 0042F08F

:0042F08D FFD6                    call esi
:0042F08F BF183D4400              mov edi, 00443D18

ici eax = 5, ebx = alien

* Possible Ref to Menu: WINIMAGMENU, Item: "Create directory..."
                                  |
:0042F094 6A7F                    push 0000007F
:0042F096 57                      push edi

* Possible Reference to Dialog: REGISTER, CONTROL_ID:0817, ""
                                  |
:0042F097 6817080000              push 00000817
:0042F09C FF7508                  push [ebp+08]
:0042F09F FFD6                    call esi

de nouveau 9 fois F12 après le passage sur ce call et eax = 6, edi = 123456
c'est un début on continue a tracer en explorant tous les call que l'on rencontre et en passant sur cette ligne de code il se passe quelque chose

:004346E8 FF154C694400            Call dword ptr [0044694C]

transformation du nom entré alien devient ALIEN tiens donc voilà déjà qu'il n'est pas d'accord avec ce qu'on lui a donné ben on va faire avec, on continue a tracer ( le doigt léger sur F10 et F8 ) et je vous laisse le soin de voir ce qui se passe en cours de route pour finalement arriver sur une routine plus qu'intéressante ici :

:0043473F 8BC1                    mov eax, ecx
:00434741 6A0E                    push 0000000E
:00434743 99                      cdq
:00434744 5B                      pop ebx
:00434745 F7FB                    idiv ebx
:00434747 85D2                    test edx, edx
:00434749 7503                    jne 0043474E
:0043474B 6A27                    push 00000027
:0043474D 5F                      pop edi............................edi = 27

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00434749(C)
|
:0043474E 0FB6540E03              movzx edx, byte ptr [esi+ecx+03]....edx = 41
:00434753 8D4103                  lea eax, dword ptr [ecx+03]
:00434756 0FAFD7                  imul edx, edi
:00434759 0155FC                  add dword ptr [ebp-04], edx
:0043475C 6A0E                    push 0000000E
:0043475E 99                      cdq
:0043475F 5B                      pop ebx
:00434760 F7FB                    idiv ebx
:00434762 85D2                    test edx, edx
:00434764 7405                    je 0043476B
:00434766 8D3C7F                  lea edi, dword ptr [edi+2*edi]
:00434769 EB03                    jmp 0043476E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00434764(C)
|
:0043476B 6BFF07                   imul edi, 00000007

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00434769(U)
|
:0043476E 41                       inc ecx......................au départ ecx = 0
:0043476F 3B4D08                   cmp ecx, dword ptr [ebp+08].........ebp+08 = 5
:00434772 7CCB                     jl 0043473F

voilà on est dedans on va se relaxer ( c'est le moment du valium, avec un doigt de rhum ca relaxe bien ) et on va essayer de détailler ce que fait cette routine.
on commence par mettre edx à 0 via cdq

déplacement du premier caractères dans edx

imul edx,edi soit 41 * 27 edx reçoit le résultat soit 9E7

ajoute la valeur contenue dans edx a ebp-04 mais que vaut cette valeur au départ on fait d ebp-04 = 47694C valeur qui reste toujours la même quoi que l'on rentre au niveau du nom ou du code.

cdq remet edx a 0

lea edi, dword ptr [edi+2*edi] a ce stade edi = 27 donc 27 + 2 * 27 = 75

ensuite inc ecx et vérifie si il y a encore des caractères a traiter si oui on recommence l'opération et ainsi de suite jusqu'au moment ou ecx vaudra 6 soit plus de caractères a traiter

au vu de cette routine nous pouvons établir un tableau qui permet de calculer ce code sur la calculatrice et ensuite vérifier en traçant si le résultat trouvé est correct.
Le nom contient 5 caractères donc il faut calculer ces 5 valeurs.

ALIEN =
41 4C 49 45 4E

pour edi :                           pour edx :                                       
1 =                27               41*27 =     9E7

2 = 27+2*27 =      75               4C*75 =    22BC

3 = 75+2*75 =     15F               49*15F =   6417

4 = 15F+2*15F =   41D               45*41D =  11BD1 

5 = 41D+2*41D=    C57               4E*C57 =  3C282

on peut donc calculer la valeur de ebp- 04 :

47694C + 9E7 + 22BC + 6417 + 11BD1 + 3C282 =
4CD859

voila un code mais est ce le bon ? Pour savoir faut essayer, on teste et:

pourquoi? Simplement parce que ce n'est pas fini il en reste encore a découvrir donc on relance SI et on recommence à tracer pour arriver sur ce call

:00434815 E862FFFFFF              call 0043477C

que l'on va éplucher avec délicatesse

:0043477C 55                      push ebp
:0043477D 8BEC                    mov ebp, esp
:0043477F 83EC10                  sub esp, 00000010
:00434782 56                      push esi
:00434783 8B7508                  mov esi, dword ptr [ebp+08]
:00434786 FF750C                  push [ebp+0C]
:00434789 8D45F0                  lea eax, dword ptr [ebp-10]

* Possible StringData Ref from Data Obj ->"%lX"
                                  |
:0043478C 68E0274400              push 004427E0
:00434791 50                      push eax

* Reference To: USER32.wsprintfA, Ord:02ACh
                                  |
:00434792 FF15FC6A4400            Call dword ptr [00446AFC]
:00434798 8A45F0                  mov al, byte ptr [ebp-10]
:0043479B 83C40C                  add esp, 0000000C
:0043479E 84C0                    test al, al
:004347A0 741E                    je 004347C0
:004347A2 8D4DF0                  lea ecx, dword ptr [ebp-10]
:004347A5 2BCE                    sub ecx, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004347BE(C)
|
:004347A7 3C38                    cmp al, 38
:004347A9 7504                    jne 004347AF
:004347AB 040A                    add al, 0A
:004347AD EB06                    jmp 004347B5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004347A9(C)
|
:004347AF 3C42                    cmp al, 42
:004347B1 7502                    jne 004347B5
:004347B3 04F6                    add al, F6

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004347AD(U), :004347B1(C)
|
:004347B5 8806                    mov byte ptr [esi], al
:004347B7 8A443101                mov al, byte ptr [ecx+esi+01]
:004347BB 46                      inc esi
:004347BC 84C0                    test al, al
:004347BE 75E7                    jne 004347A7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004347A0(C)
|
:004347C0 802600                  and byte ptr [esi], 00
:004347C3 8B4508                  mov eax, dword ptr [ebp+08]
:004347C6 5E                      pop esi
:004347C7 C9                      leave
:004347C8 C3                      ret

tout le monde a compris je suppose, non. Bon ok j'explique :
dans cette routine il prend chaque caractère du code calculé donc 4CD859 ce qui équivaut en hexadécimal à : 34 43 44 38 35 39 et va le comparer une première fois avec 38 et une seconde fois avec 42 soit en décimal avec 8 et B si le code ne contient pas ces caractères rien ne se passe mais dans notre cas nous avons bien un 38 et la il va bouger :
add al, 0A soit add 38,0A = 42 ou B

lorsqu'il n'y a plus de caractère a comparer il va placer le résultat final ( changé ou inchangé ) dans eax ce qui nous donne un second code 4CDB59 mais est ce le bon cette fois, on va le savoir dans pas longtemps:


Voilà cette fois c'est le bon code et si on calcul un autre code SUR la calculette pour christal nous avons DB7320 donc a ce stade on a gagné :
mais dans le menu il y a encore autre chose :
sélection du mode winimage, clic sur ceci et

ce qui veut dire que nous sommes enregistré en mode standard et que l'on ne va quand même pas en rester là après le boulot que l'on vient de faire donc on va relancer la machine pour tenter de s'enregistrer en mode pro.
On recommence le tout et on trace pour voir passer différent code mais celui qui nous intéresses se trouve ici :

:00434871 E82A330000              Call 00437BA0
:00434876 59                      pop ecx
:00434877 85C0                    test eax, eax
:00434879 59                      pop ecx
:0043487A 7450                    je 004348CC
:0043487C 8D8500FFFFFF            lea eax, dword ptr [ebp+FFFFFF00]
:00434882 50                      push eax
:00434883 8D8781190510            lea eax, dword ptr [edi+10051981]
:00434889 50                      push eax
:0043488A 8D8500FEFFFF            lea eax, dword ptr [ebp+FFFFFE00]
:00434890 50                      push eax
:00434891 E8E6FEFFFF              call 0043477C

en 00434883 on trouve edi + 10051981 et edi est égal a 4CD859 donc notre code standard avant transformation; résultat de l'opération : 4CD859 + 10051981 = 1051F1DA et plus loin un call que l'on connaît "call 0043477C" la routine qui vérifie si il y a un 8 ou un B dans notre cas il n'y a rien donc pas de changement et on obtient ceci :

Par contre le code pour christal est D87320 + 10051981 =10DD8CA1 donc ca donnera 10DDBCA1
Les autres codes rencontrés en cours de route doivent correspondre a une autre extension du soft qu'il est possible de charger sur le site winimage :
WinImage Developer Edition, avec WinImage Professional et WinImage SDK

Conclusions

Si tout cela est même quand assez long a tracer et relativement brouillé la solution n'est pas compliquée en soi; patience et persévérance sont les mots clés du succès.
Heureusement le prix des claviers reste abordable car il faut changer souvent les touches F8, F10 et comme c'est est plus simple on change le clavier.
Mes remerciements à Christal qui permet à nous les débutants d'avoir une petite place sur son site ce qui nous donne la possibilité de progresser, lentement certes mais on avance quand même.

A+

Alien


Addentum by Christal

La meilleure façon de savoir si les explications d'Alien étaient complètes fut d'utiliser les informations ci dessus, et SEULEMENT celles ci, pour écrire un KeyGenerateur…

Et bien ni besoin de Wdasm ou de SoftIce !
Tout y était….

Vous trouverez ci joint
le source ASM du KeyMaker, rapidement bricolé par un savant mélange de coupés/collés, pas optimisé du tout , mais fonctionnel…
Puissent les Dieux de l'informatique bien vouloir me pardonner un jour !

Bonne journée
Christal