Salut à toi visiteur !
Inscris toi en moins de 10 secondes pour profitez pleinement du site et partager avec la communauté ! S'inscrire


Exemple de crc32 pour Linux


#1
Ce code a été créé pour Linux mais vous pouvez très facilement le recoder pour Windows.
Il s'agit d'une version asm du crc32 présenté dans la rfc gzip (1952).

Code :
format ELF64 executable 3
entry start

include 'include/linux/lin64a.inc'
interpreter '/lib64/ld-linux-x86-64.so.2'
needed 'libc.so.6'
import    printf

;-------------------------------------------------------------------------
segment readable executable
;-------------------------------------------------------------------------

start:

    mov    esi,buffer_len
    mov    edi,buffer
    call    update_crc

    mov    esi,eax
    mov    rdi,formh
    xor    eax,eax
    call    [printf]

   exit:
    xor    rdi,rdi
    mov    eax,_exit
    syscall



update_crc:
    cmp    dword [crc_table_computed],0
    jnz    @f
    mov    ebp,esi
    call    make_crc_table
    mov    ecx,ebp
     @@:
    xor    eax,eax
    not    eax
    xor    edx,edx
     @@:
    mov    dl,al
    mov    bl,byte [edi]
    xor    dl,bl
    inc    edi
    mov    ebx,dword [esi+edx*4]
    shr    eax,8
    xor    eax,ebx
    dec    ecx
    jnz    @b
    xor    eax,0xffffffff
    ret



make_crc_table:
    mov    esi,crc_table
    xor    ecx,ecx
     A1:
    mov    eax,ecx
    mov    bl,8
     A2:
    mov    dl,al
    and    dl,1
    cmp    dl,1
    jnz    @f
    mov    edx,eax
    shr    edx,1
    mov    eax,0xedb88320
    xor    eax,edx
    jmp    A3
     @@:
    shr    eax,1
     A3:
    dec    bl
    jnz    A2
    mov    dword [esi+ecx*4],eax
    inc    cl
    jnz    A1
    mov    dword [crc_table_computed],1
    ret


strlen:
    xor    ecx,ecx
    xor    al,al
     @@:
    inc    edi
    inc    ecx
    cmp    al,byte [edi]
    jnz    @b
    mov    eax,ecx
    ret

;-------------------------------------------------------------------------
segment readable writeable
;-------------------------------------------------------------------------

crc_table rd 256
crc_table_computed dd 0

buffer db 'Life, the Universe and everything'
buffer_len = $-buffer

formh db '%08x',10,0
formd db '%d',10,0
formc db '%c',10,0
forms db '%s',10,0


Le même crc32 mais en version x32 stack, sans buffer.

Code :
format ELF executable 3
entry start

include 'include/linux/lin32a.inc'
interpreter '/lib/ld-linux.so.2'
needed 'libc.so.6'

import    printf

;-------------------------------------------------------------------------
segment readable executable
;-------------------------------------------------------------------------

start:

    mov    edi,buffer
    call    strlen

    mov    esi,eax
    mov    edi,buffer
    call    update_crc

    invoke    printf,formh,eax

    xor    ebx,ebx
    mov    eax,_exit
    int    0x80



update_crc:
    cmp    dword [crc_table_computed],0
    jnz    @f
    mov    ebp,esi
    call    make_crc_table
    mov    ecx,ebp
     @@:
    sub    esp,8
    xor    eax,eax
    not    eax
    xor    edx,edx
     @@:
    mov    dl,al
    mov    bl,byte [edi]
    xor    dl,bl
    inc    edi

    neg    edx
    mov    ebx,dword [esp+edx*4]
    neg    edx

    shr    eax,8
    xor    eax,ebx

    dec    ecx
    jnz    @b

    xor    eax,0xffffffff
    add    esp,8
    ret


make_crc_table:
    xor    ecx,ecx
    sub    esp,4
     A1:
    mov    eax,ecx
    mov    bl,8
     A2:
    mov    dl,al
    and    dl,1
    cmp    dl,1
    jnz    @f

    mov    edx,eax
    shr    edx,1
    mov    eax,0xedb88320
    xor    eax,edx
    jmp    A3
     @@:
    shr    eax,1
     A3:
    dec    bl
    jnz    A2

    neg    ecx
    mov    dword [esp+ecx*4],eax
    neg    ecx

    inc    cl
    jnz    A1

    mov    dword [crc_table_computed],1
    add    esp,4
    ret


strlen:
    xor    ecx,ecx
    xor    al,al
     @@:
    inc    edi
    inc    ecx
    cmp    al,byte [edi]
    jnz    @b
    mov    eax,ecx
    ret

;-------------------------------------------------------------------------
segment readable writeable
;-------------------------------------------------------------------------

crc_table_computed dd 0

buffer db 'La petite maison dans la prairie',0

formh db '%08x',10,0
formd db '%d',10,0
formc db '%c',10,0
forms db '%s',10,0
Connexion ou Inscription pour voir ce contenu ! C'est rapide ;)


Messages dans ce sujet
Exemple de crc32 pour Linux - par xddj - 26-02-2019, 15:00

Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  Exemple de chiffrement AES xddj 1 1,720 29-03-2019, 20:42
Dernier message: xddj
  Exemple de base64 xddj 0 1,363 26-02-2019, 14:51
Dernier message: xddj
  Exemple de chiffrement-déchiffrement 128 bits xddj 0 1,297 26-02-2019, 14:38
Dernier message: xddj
  Source Charlatano pour CSGO xnooztvfr 19 10,353 03-04-2018, 10:16
Dernier message: bitri12
  Question CHERHCE BON CODDEUR POUR SITE! Head5K 8 3,694 07-09-2017, 23:43
Dernier message: Tangohan

Atteindre :