26-02-2019, 15:00
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).
Le même crc32 mais en version x32 stack, sans buffer.
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 ;)