[nasm] cryptage

Résolu
sirozz Messages postés 28 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 13 avril 2008 - 3 août 2004 à 16:46
damahom Messages postés 12 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 25 mars 2011 - 10 sept. 2008 à 06:59
Salut à tous !

J'ai fait un petit prog qui crypte (xor) un fichier passé en ligne de commande, mais j'ai fait ça avec le guide des interruptions sous les yeux et c'est de la pure bidouille. Ca marche mais c'est trop trop lent !! je crois que c'est parce que j'utilise justement trop d'appels aux interruptions. voila le source :

--------------------------------------------------------------------------

key equ 12341234h

[org 100h]

mov cl, [80h] ; recup cmdline
mov si, 82h
mov di, cmdline
rep movsb
dec di
mov [es:di], byte 0

mov ah, 3dh ; ouverture fichier
mov al, 0h
mov dx, cmdline
int 21h
mov [handle1], ax

mov ah, 3ch ; creation fichier temp
mov cx, 20h
mov dx, cmdline + 1
int 21h
mov [handle2], ax

read mov ah, 3fh ; lecture de 4 octets
mov bx, [handle1]
mov cx, 4
mov dx, dwordBuf
int 21h

cmp ax, 0
je fin

crypt mov eax, [dwordBuf]
xor eax, key
mov [dwordBuf], eax

mov ah, 40h ; ecriture dans fichier temp
mov bx, [handle2]
mov cx, 4
mov dx, dwordBuf
int 21h

jmp read

fin mov ah, 3eh ; ferme fichier source
mov bx, [handle1]
int 21h

mov ah, 3eh ; ferme fichier temp
mov bx, [handle2]
int 21h

mov ah, 41h ; supprime le source
mov dx, cmdline
int 21h

mov ah, 56h ; renomme le temp
mov dx, cmdline + 1
mov di, cmdline
int 21h

ret

[segment .bss]
cmdline resb 127
handle1 resw 1
handle2 resw 1
dwordBuf resd 1

--------------------------------------------------------------------------

Avez-vous une solution simple et plus rapide ? (je crois que les pros de l'assembleur vont pousser des hauts-cris en voyant mon code....faut bien commencer quelque part....) Merci d'avance.

6 réponses

sirozz Messages postés 28 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 13 avril 2008
3 août 2004 à 20:53
Excellent ! Merci beaucoup Patatalo ! Ca marche bien maintenant. Je pose le source :
--------------------------------------------------------

key equ 12341234h

[org 100h]

mov cl, [80h] ; recup cmdline
mov si, 81h
mov di, cmdline
rep movsb
mov [es:di], byte 0

mov ah, 3dh ; ouverture fichier
mov al, 0h
mov dx, cmdline
int 21h
mov [handle1], ax

mov ah, 3ch ; creation fichier temp
mov cx, 20h
mov dx, cmdline + 1
int 21h
mov [handle2], ax

read mov ah, 3fh ; lecture
mov bx, [handle1]
mov cx, 4096
mov dx, buffer
int 21h

mov bx, ax ; recup nb d'octets lus
cmp ax, 0
je fin

push ax ; sauve nb octets lus
crypt xor dword [buffer+bx-4], key
sub bx, 4
ja crypt

mov ah, 40h ; ecriture dans fichier temp
mov bx, [handle2]
pop cx ; recup ax = nb octets
mov dx, buffer
int 21h

jmp read

fin mov ah, 3eh ; ferme fichier source
mov bx, [handle1]
int 21h

mov ah, 3eh ; ferme fichier temp
mov bx, [handle2]
int 21h

mov ah, 41h ; supprime le fichier source
mov dx, cmdline
int 21h

mov ah, 56h ; renomme le fichier temp
mov dx, cmdline + 1
mov di, cmdline
int 21h

ret

[segment .bss]
cmdline resb 127
handle1 resw 1
handle2 resw 1
buffer resd 1024

--------------------------------------------------

par contre ya un truc étrange, NASM ne compile pas avec les bons opcodes quand j'utilise "lea dx, buffer". mais ça marche bien avec "mov dx, buffer". @+

In tartiflette we trust !
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 août 2004 à 17:57
salut,

le probleme est effectivement le nombre d'appel a l'interruption 21h ( surtout sous XP ).

commence par lire et ecrire tes fichiers par bloc et déjà ça devrait aller mieux ( mais ca oblige a avoir un algorithme un peu plus travaillé ).

@++
0
sirozz Messages postés 28 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 13 avril 2008
3 août 2004 à 18:21
ok, merci pour le conseil mais peut tu me dire (en gros) comment faire ce genre de truc (lire et écrire par bloc), il faut que je fasse le cryptage en mémoire ? ou si ya déja un message sur ce forum qui traite du sujet, peut tu me poster le lien ? merci.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
3 août 2004 à 18:47
re,

Buff resd 1024

.lp1
mov ah, 3fh ; lecture de 4 octets
mov bx, [handle1]
mov cx, 4096
lea dx, [Buff]
int 21h
;jc ??

cmp ax,0
mov bx,ax
je .end

push ax
.lp2
xor dword [Buff+bx-4],key
sub bx,4
ja .lp2 ; les derniers octets seront omis si - de 4 octets
pop cx

mov ah, 40h ; ecriture dans fichier temp
mov bx, [handle2]
lea dx, [Buff]
int 21h
jnc .lp1

.end

ca devrait etre un truc comme ça ...

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sirozz Messages postés 28 Date d'inscription mardi 27 avril 2004 Statut Membre Dernière intervention 13 avril 2008
3 août 2004 à 20:13
Ok, merci Patatalo ! je vais essayer ça.
0
damahom Messages postés 12 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 25 mars 2011
10 sept. 2008 à 06:59
Je ne suis pas un expert en ASM, mais des que l'on crypte un fichier avec XOR le mot de passe apparait en répété spécialement si il y des zéro(0) car:
Imaginons un mot de passe de 4bits(juste pour faire simple) par exemple : '1101'

essayons d'encoder un petit fichier de 16bits '1101100010110000'
faisons comme ceci        1101100010110000
et copiant le passe         1101110111011101
et faisons le XOR          0000010101101101
les dernier 4 bit sont                                 |
zéro alors le passe ce répété--------------|

Ceci est un simple exemple, imaginez un fichier plein de zero.

Pour moi la solution serai de compresser le fichier par un methode de compression des bit repete.
0
Rejoignez-nous