IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[MASM32] Comment utiliser md5()


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut [MASM32] Comment utiliser md5()
    Sur windows XP, intel avec MASM32
    J'ai récupéré la dll sur le site de WiteG:
    http://www.witeg.cad.pl/crypto/md.zip
    J'ai ecrit ce programme que j'arrive a compiler
    mais en débuggant il semble qu'il y ait une erreur juste au moment du call lpMD
    Merci pour toute correction/info

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    ;===========================
    ;MD5
    ;Test vector:
    ;"abc" 900150983cd24fb0d6963f7d28e17f72 
    ;===========================
     
     
    .386
    .model flat, stdcall
    option casemap:none
     
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
     
    .data
    StringToHash db "abc",0
    DLLname db "md.dll",0
    FuncName db "MD5",0
    lpMD dd 0
    BUF_1 db 100 dup (0)
     
    .data?
    hDLL dd ?
     
    .code
    start:
    invoke LoadLibrary,offset DLLname
    mov hDLL,eax
    invoke GetProcAddress, hDLL, offset FuncName
    mov lpMD,eax
     
    push offset StringToHash
    call lstrlen
     
    push offset StringToHash
    push eax
    push offset BUF_1
    call lpMD
     
    push 0
    push offset StringToHash
    push offset BUF_1
    push 0
    call MessageBox
     
    invoke FreeLibrary,hDLL
     
    push 0
    call ExitProcess
     
    end start
    Balises code ajoutées par Alcatîz.
    Merci d'y penser à l'avenir !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Salut,

    Pour moi ça marche au poil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    invoke GetProcAddress, hDLL, offset FuncName 
    mov lpMD,eax
    quand tu debug, vérifie quand même que eax != 0

    Essaye aussi avec un link implicite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    .386 
    .model flat, stdcall 
    option casemap:none 
     
    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\user32.inc 
    include .\md.inc
     
    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\user32.lib 
    includelib .\md.lib
     
    .data 
    StringToHash db "abc",0 
    DLLname db "md.dll",0 
    BUF_1 db 100 dup (0) 
     
    .code 
    start: 
     
    push offset StringToHash 
    call lstrlen 
     
    invoke MD5, offset BUF_1, eax, offset StringToHash
     
    push 0 
    push offset StringToHash 
    push offset BUF_1 
    push 0 
    call MessageBox 
     
    push 0 
    call ExitProcess 
     
    end start
    Euh , je crois bien que c'est à toi maintenant

    A+

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut autre question
    En effet ça marche... J'avais dû faire une fausse manoeuvre...

    Maintenant j'aimerai savoir comment afficher la valeur hexadécimale de EAX?
    Est-ce que je dois créer une routine de conversion char/hexa?
    Ou alors simplement déclarer une variable locale?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    MaFonction PROC
    LOCAL TempVar db "",0
     
    invoke MD5, offset BUF_1, eax, offset StringToHash
     
    mov eax,offset BUF_1
    mov TempVar, eax
     
    push 0 
    push offset StringToHash 
    push offset TempVar
    push 0 
    call MessageBox
    MaFonction ENDP
    Merci pour toute information.

  4. #4
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Tu dois convertir la valeur. Dans les languages de haut niveau le compilateur ajoute une routine pour toi mais en asm tu dois tout faire par toi-meme. Mais rassure toi la routine est tres simple à implémenter.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut pour ne pas reinventer la roue
    Ou est-ce que je peux trouver cette routine de conversion?

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 967
    Points : 59 729
    Points
    59 729
    Billets dans le blog
    2
    Par défaut
    Tu peux faire ça très simplement en déclarant une chaîne '0123456789ABCDEF' et en extrayant chaque groupe de 4 bits qui compose eax. Le nombre obtenu est l'indice du digit hexadécimal correspondant dans la chaîne.
    Mais il y a d'autres méthodes...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut ok
    Ok, merci. J'ai découvert XLAT en faisant quelques recherches.
    Ce qui me donne comme code: (valeur a convertir:6CE45)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    .data
    result   db 100 dup (0)
    HexTbl db "0123456789ABCDEF",0
     
    .code
    start:
     
    mov ecx,6CE45h
     
    ; conversion ASCII et affichage
    lea ebx,HexTbl
    mov al,6h
    xlat HexTbl
    mov [result+0],al
    mov al,0Ch
    xlat HexTbl
    mov [result+1],al
    mov al,0Eh
    xlat HexTbl
    mov [result+2],al
    mov al,4h
    xlat HexTbl
    mov [result+3],al
    mov al,5h
    xlat HexTbl
    mov [result+4],al
     
    push 0
    push offset result
    push offset result
    push 0
    call MessageBox
     
    push 0
    call ExitProcess
     
    end start
    Bon, il reste à ajouter une boucle, mais ce n'est pas un problème.
    Par contre ici je n'utilise pas ECX, je passe directement les valeurs à al...

    Qu'est-ce que je pourrais faire pour mettre dans al automatiquement un byte de ECX?

    mov al,byte ptr[ecx+x] ne marche pas

    Merci encore pour toute aide

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Salut,

    C'est pas trop difficile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       ...
       mov al, cl
       ...
       shr ecx, 8
       ...
    Simple, non ?

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut hum??
    Hmm? Tu pourrais etre plus precis?

    disons que ECX contient 6C45B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lea ebx,HexTbl 
    mov al,cl       ; met 5B
    xlat HexTbl    ; correspond a rien
    mov [result+0],al
    shr ecx,8 
    mov al,cl       ; met C4
    xlat HexTbl    ; correspond a rien
    mov [result+1],al

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Ouais, un truc dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
       .data
       ...
       hex db "0123456789ABCDEF"
     
       .code
       ...
       mov ecx, 06C45Bh
       lea edi, BUF_1+8
       mov byte ptr [edi], 0 ; null terminating string
       .repeat
          dec edi
          mov eax, ecx
          and eax, 0fh
          mov al, hex[eax]
          mov [edi], al 
          shr ecx, 4
       .until edi==offset BUF_1
     
       push 0 
       push offset StringToHash 
       push offset BUF_1 
       push 0 
       call MessageBox
    a+

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut zdfrvounaf
    Aah bon ca marche... Mais en fait je me suis trompé et ce n'est pas ce que je cherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MaFonction PROC uses esi Str:DWORD,dLen:DWORD
    mov esi,eax
    mov eax,Str
    push eax
    push esi
    push offset BUF_1
    call lpMD
    mov eax,BUF_1
    ret
    MaFonction ENDP
    A la fin de cette fonction, EAX contient l'ADDRESS de la chaine cryptée et non pas la chaine cryptée...
    Ce qui change tout...

    Alors ma question:
    J'ai une valeur Hexa en memoire (adresse stockée dans eax),
    comment s'y prendre pour la faire apparaitre dans une message box?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par sefo
    A la fin de cette fonction, EAX contient l'ADDRESS de la chaine cryptée et non pas la chaine cryptée...
    Ce qui change tout...
    alors là tu m'épates

    il y a deux points à éclaircir:
    1. a moins d'un miracle, tu ne pourra pas mettre toute ta chaîne dans eax (16 bytes dans le cas d'un hash MD5)
    2. si tu posséde une adresse valide, tu peux toujours placer dans un registre la valeur à cette adresse.

    Résultat: ça change rien du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    .data
    hash   dd 4 dup(0)
    buffer db 32 dup(0), 0
    ...
    .code
    ...
    invoke MaFonction, .... ; eax = offset hash
    mov edx, [eax]           ;  place les 4 premier bytes dans edx
    invoke d2str, edx, offset buffer  ; numeric to hex digits string. résultat dans buffer
    mov edx, [eax+4]       ; les 4 bytes suivant
    invoke d2str, edx, offset buffer+8
    mov edx, [eax+8]
    invoke d2str, edx, offset buffer+16
    mov edx, [eax+12]
    invoke d2str, edx, offset buffer+24
    C'est juste un exemple.
    a+

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut aeths
    Oui, c'est bien ce que je dis...
    J'ai l'offset du hash dans eax et pas le hash lui-meme...

    Bon, tu me sors une nouvelle fonction (d2str) juste au moment ou je trouve une autre fonction (dwtoa)... Donc je ne sais plus quoi utiliser...

    Je dois inclure les librairies masm32.inc/.lib pour utiliser dwtoa (que je n'arrive pas a faire marcher...)

    Et pour d2str, je le trouve ou :

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Pas de panique

    Voilà d2str

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    ...
    d2str	PROTO d:DWORD, bufferaddr:DWORD
    ...
     
    .code
     
    d2str	PROC USES edi edx, d:DWORD, bufferaddr:DWORD
    		mov edi, bufferaddr
    		mov edx, 4    ; register length 4 bytes
    		.repeat
    			dec edx
    			mov eax, d
    			and eax, 0fh
    			mov al, hex[eax]
    			mov [edi+1], al 
    			shr d, 4
    			mov eax, d
    			and eax, 0fh
    			mov al, hex[eax]
    			mov [edi], al 
    			shr d, 4		
    			add edi, 2
    		.until edx==0
    		mov byte ptr [edi], 0 ; null terminating string
    		ret
    d2str	ENDP
     
    start: 
     
    push offset StringToHash 
    call lstrlen 
     
    invoke MD5, offset hash, eax, offset StringToHash
     
    invoke d2str, hash,		offset BUF_1
    invoke d2str, hash+4,	offset BUF_1+8
    invoke d2str, hash+8,	offset BUF_1+16
    invoke d2str, hash+12,	offset BUF_1+24
     
    push 0 
    push offset StringToHash 
    push offset BUF_1 
    push 0 
    call MessageBox 
    ...
    Voilà, ça c'est du self-made.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 1
    Points
    1
    Par défaut xfgnxfgn
    eh ben la je n'ai plus rien a dire
    Merci pour ton aide harlequin et pour ta resistence face a mes questions

Discussions similaires

  1. Comment utiliser MASM32 ?
    Par Ehjoe dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 27/11/2010, 20h46
  2. [MASM32] Comment utiliser la fonction printf
    Par _Michel dans le forum x86 32-bits / 64-bits
    Réponses: 26
    Dernier message: 08/11/2007, 11h09
  3. Comment utiliser le cryptage MD5 (Dimka Maslov) ?
    Par bds2006 dans le forum Delphi
    Réponses: 3
    Dernier message: 08/06/2006, 17h24
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo