Tutorial n° 1


AddWeb 3.15 (Standard Edition)

Par Freud


 

  • Date : 4 mars 2000
  • Logiciel : AddWeb 3.15
  • Distributeur : CyberSpace HQ
  • Protection : AsPack, NagScreen, Limitations
  • Outils : PESniff, ProDump, Softice ,Hiew, Wdasm
  • Pour me contacter : French_Freud@Hotmail.com

  1. Intro

    Salut à tous,

    Ne sachant que faire dans la nuit du jeudi 2 au vendredi 3 mars 2000, j'allumais mon pc histoire de trouver une occupation...qu'est ce que je pourrai bien faire...jouer ouaih voyons mon répertoire de jeux...

    Bof!! pas grand chose d'intéressant... tiens qu'est ce que j'ai foutu dans ce répertoire c:\Various Useful Programs....voyons ah oui c'est vrai des sharewares que j'ai téléchargé l'autre jour.

    Hehehe...une idée me vint tout de suite à l'esprit et si je faisais un petit crack histoire de me défouler un peu!! je venais de trouver une occupation . Au hasard, prenons AddWeb3 de CyberSpace HQ, c'est parti!!!

  2. Voyons à quoi on a affaire...

    Avant toute chose lançons ce petit proggy pour voir ce qui se passe. Bon ben ca a le mérite d'être clair, on a un beau NagScreen au lancement du programme qui nous propose soit de nous enregistrer en tapant un nom et une clé d'enregistrement, soit de poursuivre en mode non enregistre...
    De plus, le nagscreen nous indique la liste des limitations en mode non enregistre... Bien bien bien...

    Comme a l'habitude voulant en faire le moins possible, je rentre un serial bidon genre nom : Freud, serial : whocares et là je note le message ici : "Invalid Serial Number....".

    Ok, je sors de AddWeb3 et lance Wdasm32 mon désassembleur préfèré histoire de voir si je peux pas trouver des string reference du message d'erreur "Invalid Serial number..." mais la oh surprise Wdasm ne désassemble rien du tout.... tiens tiens tiens bizarre bizarre vous avez dit bizarre...

    Lançons AddWeb3 sous le Symbol Loader de Soft-Ice, softice ne break pas aie aie aie ca s'annonce mal...les caractéristiques des sections ont sûrement du être changées.

    Voyons ca avec ProDump, on clique sur PE Editor puis on choisit le soft AddWeb3.exe, puis on clique sur section, voila ce que ca donne chez moi :

    
    Name     Virt Size     Virt Offset     Raw Size     Raw Offset     Characteristics
    ------------------------------------------------------------------------------------
    
    CODE     00123000      00001000       0006CC00       00000400       C0000040
    DATA     00003000      00124000       00001400       0006D000       C0000040
    BSS      00002000      00127000       00000000       0006E400       C0000040
    .idata   00003000      00129000       00001200       0006E400       C0000040
    .tls     00001000      0012C000       00000000       0006F600       C0000040
    .rdata   00001000      0012D000       00000200       0006F600       C0000040
    .reloc   00012000      0012E000       00000000       0006F800       C0000040
    .rsrc    000A1000*     00140000       00021000*      0006F800       C0000040
    .data    00002000      001E1000       00001800       00090800       C0000040
    
    

    On remarque tout de suite que ce qui empêche le désassemblage par Wdasm32 et le break de Soft ice, c'est les caractéristiques de la section CODE qu'il faut changer en E000020 !!!

    ProDump fait ca très bien, un petit click droit sur CODE, Edit Section, et hop on change les caractéristiques de la section CODE... Maintenant SoftIce break et Wdasm32 désassemble magique non??!!!

    Un rapide coup d'oeil sur la taille des sections sur le disque (Raw Size) et la taille des sections en mémoire (Virtual Size) a de quoi en intriguer plus d'un... il y a beaucoup de différence (section .rsrc : Raw Size (voir *) =
    00021000 (hexa) ce qui donne 135168 (deci) et Virtual Size (voir * ) = 000A1000 (hexa) ce qui donne 659456 (deci)). Pourquoi le proggy réserve autant de mémoire pour si peu de données, vous avez trouve?? Ben oui le logiciel doit être compresse !!!

    Du coup on balance PESniff (soft qui reconnaît de nombreux types de compression) et la il nous confirme que AddWeb3 est compresse avec AsPack !!!! BINGO !!

  3. Supprimons maintenant le test entre le bon code et le mauvais

    Bon on a déjà pas mal de renseignements, maintenant on va passer a l'annulation du test de comparaison entre notre serial et le bon. Le problème de AsPack on verra ça en dernier.

    On va procéder comme a l'habitude. On ouvre le soft et on tombe sur ce ?##!! de NagScreen. On clique sur Enter a resgitration number. Là il nous demande notre nom et notre code, on lui entre gentiment n'importe quoi (nom : Freud, Code : 123456789 par exemple).

    CTRL-D, pour retourner dans Soft-Ice, On pose un point d'arret BPX Hmemcpy et F5 pour retourner dans AddWeb3 c'est aussi simple que ca. On clique sur Ok, et hop on revient Soft-Ice

    On a donc un premier Break Point :
    Il ne nous intéresse pas, en effet, après quelques appuie sur F12 (7 pour être précis), pour sortir de l'API Hmemcpy et quelques F8 pour exécuter des instructions RET

    on a les instructions suivantes :

    :004E6CCC E8F3D2F3FF CALL 00423FC4
    :004E6CD1 8B45E4     MOV EAX,[EBP-1C] <-- Ici Eax pointe vers Freud
    :004E6CD4 8D55E8     LEA EDX,[EBP-18]
    

    En tapant d EAX sous Soft-Ice, on note qu'il pointe vers notre nom. On s'en tape un peu de ca, on appuie sur F5 et hop de nouveau dans Soft-Ice, ici même cinéma : F12, un peu de traçage avec F8 pour exécuter des RET et de nouveau :

    :00424017 8B45FC MOV EAX,[EBP-04] <-- Ici Eax pointe vers Freud
    
    

    On presse F5, et hop de nouveau retour dans Soft-Ice mais pour des choses beaucoup plus intéressante!!!
    Comme d'hab, F12 pour sortir de Hmemcpy, et quelques F8 pour exécuter des RET, on arrive ici :

    :004E6CFE 8B45E4            MOV EAX,[EBP-1C] <-- Pointe sur "123456789" notre code
    :004E6D01 8D55E8            LEA EDX,[EBP-18]
    :004E6D04 E8FF19F2FF        CALL 00408708
    :004E6D09 8B55E8            MOV EDX,[EBP-18]
    :004E6D0C 8B45FC            MOV EAX,[EBP-04]
    :004E6D0F 8B80E4010000      MOV EAX,[EAX+000001E4]
    :004E6D15 E8DAD2F3FF        CALL 00423FF4
    :004E6D1A A128645200        MOV EAX,[00526428]
    :004E6D1F 8A00              MOV AL,[EAX]
    :004E6D21 8845F3            MOV [EBP-0D],AL
    :004E6D24 8D55E4            LEA EDX,[EBP-1C]
    :004E6D27 8B45FC            MOV EAX,[EBP-04]
    :004E6D2A 8B80Ea010000      MOV EAX,[EAX+000001E4]
    :004E6D30 E88Fd2F3FF        CALL 00423FC4
    :004E6D35 8B45E4            MOV EAX,[EBP-1C]
    :004E6D38 50                PUSH EAX
    :004E6D39 8D55E0            LEA EDX,[EBP-20] 
    :004E6D3C 8B45FC            MOV EAX,[EBP-04] 
    :004E6D3F 8B80DC010000      MOV EAX,[EAX+000001DC] 
    :004E6D45 E87AD2F3FF        CALL 00423FC4
    :004E6D4A 8B45E0            MOV EAX,[EBP-20]
    :004E6D4D                   POP EDX
    :004E6D4E E8B5EEFFFF        CALL 004E5C08 <-- Test Code valide et notre code "123456789"
    :004E6D53 A128645200        MOV EAX,[00526428]
    :004E6D58 803800            CMP BYTE PTR [EAX],00
    :004E6D5B 0F858B000000      JNZ 004E6DEC <-- Test si Code Ok on saute sinon on continue
    

    En analysant un peu cette partie de code, on s'aperçoit que la seule comparaison après que la valeur du code ait été mis en mémoire par Hmemcpy se trouve a l'adresse :004E6D5B.
    Par conséquent le CALL a l'adresse
    :004E6D4E doit effectuer le test entre la bon code et le notre. On se dit qu'avec un peu de chance en inversant le saut on passera directement en mode enregistre.

    Eh bien, bonne surprise....mais de courte durée !! Effectivement, quand on modifie le saut on arrive bien a une boite de dialogue qui indique "Thank you for registering AddWeb!". Mais car il y a un mais c'est quand on referme cette boite, on se retrouve toujours dans le NagScreen et rien a changer pour nous !!!

    En réfléchissant un peu on se dit que le CALL a l'adresse
    :004E6D4E qui compare les deux valeurs doit être exécuter d'autre fois dans le programme a d'autre endroit...c'est pour cette raison que l'enregistrement ne fonctionne pas.

    Bon ben pour vérifier cela on va poser un BPX juste a la première instruction de ce CALL, histoire de voir si on break une fois ou plusieurs fois.

    BINGO !! On passe une autre fois dans ce CALL étant donné que Soft-Ice nous rend la main 2 fois. La solution est donc de modifier quelque chose dans ce CALL et non pas de modifier le saut a l'adresse
    :004E6D5B.

    En tracant un peu dans le CALL on trouve ceci :

    :004E5CF9 8B45EC      MOV EAX,[EBP-14] <-- Eax pointe sur le bon code (Notez le :))
    :004E5CFC 8B55E8      MOV EDX,[EBP-18] <-- Edx pointe sur notre code
    :004E5CFF E87CE2F1FF  CALL 00403F80    <-- Contrôle des deux codes
    :004E5D04 7526        JNZ 004E5D2C     <-- Si code ok, on saute pas sinon on saute
    

    Vous me voyez venir....eh ouaih modifier le saut a l'adresse :004E5D04 et comme on dit par chez nous "That will do the trick !!!".

    Entre parenthèses, on a eu un peu de chance que ca marche aussi "facilement" car dans le CALL a l'adresse
    :004E5CFF le proggy aurait très bien pu mettre une valeur en mémoire a 0 ou 1 pour dire si le code etait bon ou pas. Cette valeur aurait pu être teste ailleurs dans le prog. Enfin ca n'aurait pas ete dur de la trouver de toute façon...

    Voila, le programme accepte dorénavant n'importe quel code et nom :) et s'enregistre correctement. A noter que ce crack est pour enregistrer la version Standard Edition. Pour enregistrer AddWeb sous d'autre version (Gold, Enterprise), il y a d'autres manips a effectuer mais cela ne nous concerne pas ici !!

  4. Maintenant qu'on a l'endroit a modifier, Comment patcher le programme compressé ?

    On se rappelle que le programme est compresse avec AsPack on ne va donc pas pouvoir patcher directement sur le fichier comme tout autre crack...
    Peu importe ca va nous compliquer un peu la tâche mais c'est pas grave les personnes qui ne savent pas comment cracker un programme compresse pourront y trouver des infos intéressantes (du moins je l'espère).

    Pour commencer, on peut se demander comment fonctionne un proggy compresse.
    Quand on lance le soft, voila en gros se qui se passe :

    1. En tout premier, le décompresseur ou loader (qui n'est pas compressé lui!! et heureusement) va décompressé le prog en mémoire.
    2. Le loader redonne la main au programme décompressé dans sa totalité.

    Notre but a nous est de patcher le programme décompressé en mémoire. L'unique facon pour nous d'agir se situe lorsque tout le programme a été décompressé c'est a dire lorsque le loader va rendre la main au programme décompressé.

    Il faut donc trouver cette endroit mais ne vous inquiétez pas ce n'est pas très sorcier!! Une fois cette endroit trouve, on "jump" vers notre modification dans notre cas ce sera un truc du style MOV BYTE PTR[004E5D04],00000074 (004E5D04 étant l'adresse de notre saut). puis une fois les modifs terminées on saute vers le début du programme décompressé et hop c'est gagne!! BINGO.

    C'est partie :

    1. Trouver le moment ou le loader passe la main au programme décompressé.
    En général, les sauts vers le programme décompresse sont relativement bizarre!!! Du genre : JMP EAX ou CALL EAX,etc...

    Chargeons donc le Symbol Loader de Soft-Ice, si vous avez fait les modifs des caractéristiques de la section CODE comme je l'ai expliqué au début de ce tut Soft-Ice doit breaké à l'entry point du programme c'est a dire a la première instruction exécutée (ce sont les instructions du loader AsPack en l'occurrence).

    Ici l'entry point est a l'adresse :0006DAC4 (ProDump nous le dit quand on fait un PE Editor sur AddWeb3.exe) Appuyer donc 3 fois sur F8 histoires de passer 3 instructions et on tombe là-dessus :

    :005E1000 60             PUSHAD <-- Signe du loader
    :005E1001 E800000000     CALL 005E1006
    :005E1006 5D             POP EBP
    :005E1007 81ED3ED94300   SUB EBP,0043D93E
    :005E100D B838D94300     MOV EAX,0043D938
    :005E1012 03C5           ADD EAX,EBP
    :005E1014 2B850BDE4300   SUB EAX,[EBP+0043DE0B]
    :005E101A 898517DE4300   MOV [EBP+0043De17],EAX
    :005E1020 80BD01DE430000 CMP BYTE PTR [EBP+0043DE01],00
    :005E1027 7515           JNZ 005E103E
    :005E1029 FE8501DE4300   INC BYTE PTR [EBP+0043DE01]
    :005E102F E81D000000     CALL 005E1051
    :005E1034 E879020000     CALL 005E12B2
    :005E1039 E812030000     CALL 005E1350
    :005E103E 88503DE4300    MOV EAX,[EBP+0043DE03]
    :005E1044 038517DE4300   ADD EAX,[EBP+0043DE17]
    :005E104A 8944241C       MOV [ESP+1C],EAX
    :005E104E 61             POPAD <-- Signe qui ne trompe pas
    :005E104F FFE0           JMP EAX <-- Saut vers notre programme décompressé
    
    noter l'adresse  contenu dans EAX (correspond a l'entry point du programme 
    décompressé)
    

    Un signe caractéristique du loader (en tout cas pour AsPack) c'est qu'il commence pas sauvegarder les registres (PUSHAD). En traçant un peu on trouvera sans peine le POPAD (la c'est vraiment simple, il est vraiment tout près) qui signifie que le loader a fini son boulot. D'ailleurs on trouve un JMP EAX qui confirme notre supposition. On en profite pour noter l'adresse contenu dans EAX (Ici : 0523110). Donc, il faudra remplacer les instructions de la fin du loader par un jump vers notre routine de modification en faisant bien attention de reecrire les instructions que l'on a efface pour faire notre saut dans notre routine afin qu'elle soit exécutée!!

    ca donne a peu près ca :
    ------------------------

    JMP Notre_Routine --> fin du loader

    ...

    Instructions efface du loader --> debut notre_routine
    Notre modification --> faire nos modifs
    JMP entry_point du prog decompresse (EAX=0523110) --> rend la main a addweb3

    Maintenant, il y a un truc important à trouver, c'est de la place pour écrire notre_routine. Dans l'exécutable AddWeb3.exe, seul le loader n'est pas compresse ce qui veut dire que la place qu'il prend sur le disque dur (Raw Size dans ProDump) est la même qu'il prendra en mémoire.

    De plus, comme tout programme est divise en sections, et que chaque sections possède une entrée dans le PE Header ca veut que notre loader possède une section dans le PE Header. Le plus logique est donc d'essayer de trouver un peu de place a la fin de la section consacre au loader.

    Comment trouver la section consacrée au loader? Normalement, c'est celle qui contient l'entry_point du programme (étant donne que c'est le loader qui s'exécute en premier). Si on applique cette règle a notre cas, l'adresse de l'entry_point est 0006DAC4, ce qui signifie en regardant les virtual address des sections a l'aide de ProDump (il est vraiment bien utile ce p'tit logiciel) que qui voudrait dire que le loader est contenu dans la section CODE ??!! c'est vraiment bizarre vous trouver pas???

    Heureusement SoftIce nous en dit un peu plus long, vous vous rappelez lorsque qu'on lance AddWeb3 grace au loader de SoftIce on break bien a l'entrypoint (006DAC4) mais on voit les instructions suivantes :

    :0046DAC6 7500            JNZ 0046DAC8 <-- instruction qui suit l'entry point
    :0046DAC8 E9333351700     JMP 005E1000 <-- Saut vers hehe lisez la suite
    

    Vous allez me dire et alors?? Ben ca vous rappelle rien la valeur 005E1000 du JUMP. Eh oui, c'est le début de la section .data (en effet 005E1000-Image Base (400000)=1E1000). La section consacrée au loder etait donc .data (etait ce une ruse de CyberSpace??).

    Ainsi comme on sait que la taille de cette section (.data) sur disque est de 1800 bytes (cf Raw Size dans ProDump), on additionne 1E1000+1800=1E2800 qui correspond a la fin de notre section .data!!! Y'a plus qu'a espérer qu'il y ait de la place c'est a dire des séries de 0, avant l'adresse 1E2800.

    C'est facile d'aller voir ca avec SoftIce, on lance addweb3 sous le symbol loader et une fois dans le code du loader, on tape d 5E2800...(faut pas oublier d'ajouter l'image base) eh la oh magie, ya vraiment de la place qui reste c'est donc la qu'on va installer notre routine de modification.
    Moi j'ai choisit l'adresse 5E2601. Par précaution j'ai place un BPM a cette adresse pour être sur que le soft ne l'utilise pas. Non, c'est ok.

    Bon alors normalement j'ai toutes les infos nécessaires je peux patcher addweb3.exe sans problème

    Reprenons :

    Etape 1 : JMP Notre_Routine

    
    :005E103E 88503DE4300      MOV EAX,[EBP+0043DE03]
    :005E1044 038517DE4300     ADD EAX,[EBP+0043DE17]
    005E104A 8944241C          MOV [ESP+1C],EAX
    :005E104E 61               POPAD 
    :005E104F FFE0             JMP EAX 
    

    Voila la fin du loader. L'info a coder est la suivante : JMP 05E2601 --> on jump vers notre routine de modification
    En Hexa JMP 05E2601 se code sur 5 octets.
    Voyons...oui on va l'insérer a l'adresse
    005E104A étant donne que du MOV au POPAD on a 5 octets, ainsi on a bien un équilibre du code.
    Taper donc a
    005E104A sous soft-ice : puis jmp 05E2601 et 2 fois entrée

    La fin du loader ressemble plus a ca maintenant:

    :005E103E 88503DE4300      MOV EAX,[EBP+0043DE03]
    :005E1044 038517DE4300     ADD EAX,[EBP+0043DE17]
    :005E104A E9B2150000       JMP 5E2601
    :005E104F FFE0             JMP EAX 
    

    c'est mieux, non???
    Les infos que l'on a écrase (MOV [ESP+1C],EAX et POPAD) on les retapera dans la routine de modification.

    Etape 2 : Ecrire notre routine de modification

    on tape a 05E2601 sous softice (pour assembler des instructions a l'adresse 05E2601)
    D'abord on écrit les instructions écrasées :
    MOV [ESP+1C],EAX
    POPAD
    Puis notre modification (enfin!!)
    MOV BYTE PTR [004E5D04],00000074
    Et enfin notre jump vers l'entry point du programme compresse c'est a dire : JMP 0523110
    deux fois entrée et hop c'est fini!!!!!!!
    Vous croyez!!! et non malheureusement :(
    C'etait sans compter sur ce %#??!! de AsPAck !!!

    Regarder voila notre nouveau source :

    :005E1000 60              PUSHAD <-- Signe du loader
    :005E1001 E800000000      CALL 005E1006
    :005E1006 5D              POP EBP
    :005E1007 81ED3ED94300    SUB EBP,0043D93E
    :005E100D B838D94300      MOV EAX,0043D938
    :005E1012 03C5            ADD EAX,EBP
    :005E1014 2B850BDE4300    SUB EAX,[EBP+0043DE0B]
    :005E101A 898517DE4300    MOV [EBP+0043De17],EAX
    :005E1020 80BD01DE430000  CMP BYTE PTR [EBP+0043DE01],00
    :005E1027 7515            JNZ 005E103E
    :005E1029 FE8501DE4300    INC BYTE PTR [EBP+0043DE01]
    :005E102F E81D000000      CALL 005E1051
    :005E1034 E879020000      CALL 005E12B2
    :005E1039 E812030000      CALL 005E1350           <-- Ici
    :005E103E 88503DE4300     MOV EAX,[EBP+0043DE03]
    :005E1044 038517DE4300    ADD EAX,[EBP+0043DE17]
    :005E104A 8944241C        MOV [ESP+1C],EAX
    :005E104A E9B2150000      JMP 5E2601
    :005E104F FFE0            JMP EAX 

    Effectivement, je ne sais pas trop bien pourquoi (en fait ca doit une protection de plus), quand il passe dans le CALL a l'adresse :005E1039, le JMP que l'on a rajoute a la place du MOV et du POP se modifie tout seul!!!

    Incroyable, en fait non l'explication est très simple dans le CALL, le prog copie a l'emplacement mémoire qui correspondait au POPAD la valeur hexa 61 (ce qui a pour conséquence de modifier notre JMP), et savez vous comment est code POPAD en hexa :)...bonne réponse 61!!! AsPack essai donc de "s'autoréparer" si on peut dire.

    Enfin pas pour longtemps...car on pose un BPM sur l'emplacement mémoire douteux (ie 05E104E) pour finir par noper un STOSB (se trouvant dans le CALL) qui place la valeur 61 vers la case mémoire 05E104E. Voila notre JMP n'est pas près de se modifier tout seul !!!

    Bon je vous ai pas dit a qu'elle emplacement mémoire se trouvait le STOSB mais je vous laisse chercher c'est poa dur...

    Voila on relance le tout et on a un beau prog qui s'autopatch au démarrage!!! Y'a plus qu'a faire les modifications avec Hiew !!

  5. Conclusion

    Pour conclure, je voulais simplement signaler que c'etait mon premier tutorial. Je me suis rendu compte en le tapant que faire un tutorial c'etait super long. J'en profite donc au passage pour saluer Christal (Tes tuts sont vraiment excellents, continue!!! à me (nous) montrer la voie). Je voulais aussi remercier Brénuche, président de l'IRIP, pour son super site.

    Au passage, si vous trouvez des absurdités, des erreurs dans ce tut (ce qui est loin d'être impossible) ou que vous avez une remarque a faire, n'hésitez surtout pas a prendre contact avec moi (
    French_Freud@Hotmail.com).

    Voila, je crois que j'ai tout dit, Don't give the fight


    Freud

    Le mot de la fin : "You Know what suckZZZ....When Ya spill a full beer !!!"