2012-01-09 4 views
0

Vous recherchez un programme écrit en assembleur qui cryptera/décryptera les fichiers. J'utilise NASM comme un compilateur. J'ai trouvé l'exemple de code, mais il renvoie des erreursassembleur XOR crypter/décrypter le fichier

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

    mov eax,lpBuffor 
    mov ecx,dwSize 
    mov edx,dwKey 

    next_byte: 

    xor byte ptr[eax+ecx-1],dl 
    dec ecx 
    jne next_byte 

    ret 

Crypter _xor endp

J'ai erreur:

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

et

encrypt_xor proc lpBuffor:dword, dwSize:dword, dwKey:dword 

analyseur d'erreur: instruction attendue et ici aussi

xor byte ptr[eax+ecx-1],dl 

coma d'erreur ou à la fin de la ligne devrait

Quel est le problème dans ce code?

+0

De quel processeur/arch ciblez-vous? Vous pouvez consulter les sources OpenSSL et/ou les instructions AES-NI (Sandybridge et supérieur) – Elalfer

+0

@Elalfer processeur x86 – quba88

+0

quba88, s'il vous plaît accepter la réponse donnée ou indiquer pourquoi il n'est pas acceptable pour vous –

Répondre

3

Le code que vous avez fourni semble plus proche de la syntaxe MASM. Une syntaxe equivilent MSNA peut être quelque chose comme ceci:

; void encrypt_xor(LPBYTE lpBuffor, DWORD dwSize, DWORD dwKey) 
encrypt_xor: 
    push ebp 
    mov  ebp,esp 

    %stacksize flat 
    %arg lpBuffor:dword, dwSize:dword, dwKey:dword 

    mov eax,[lpBuffor] 
    mov ecx,[dwSize] 
    mov edx,[dwKey] 

    next_byte: 

    xor [eax+ecx-1],dl 
    dec ecx 
    jne next_byte 

    mov esp, ebp 
    pop ebp 

    ret 

Il y a quelques petites choses à noter ici. L'utilisation de % stacksize et % arg suppose une convention d'appel cdecl (c'est-à-dire que tous les paramètres sont passés sur la pile). Dans NASM, cela nécessite l'inclusion d'une trame de pile (d'où les instructions esp et ebp). Une dernière remarque - si ce code est partagé, vous devriez penser à changer le nom. La routine ne fournit aucun type de cryptage fort et c'est une mauvaise idée d'endormir les développeurs dans un faux sentiment de sécurité.

+0

dec ecx, jne next_byte * est * une optimisation ... La boucle est plus lisible, mais plus lente sur les processeurs modernes. –

+0

@BrianKnoblauch Vraiment? J'apprécierais de voir la démonstration/démonstration de deux instructions "dec ecx, jne next_byte" être plus rapide qu'une simple instruction Loop. – adelphus

+1

@adelphus http://www.agner.org/optimize/instruction_tables.pdf – harold