Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: Karcrack en 21 Enero 2013, 02:59 AM

Título: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 02:59 AM
Me he visto en la necesidad de diseñar una rutina strlen() lo más pequeña posible... He acabado con esto...
15bytes:
Código (asm) [Seleccionar]
strlen:
    pop  edx
    pop  edi
    push -1
    pop  ecx
    xor  eax, eax
    repne scasb
    not  ecx
    mov  eax, ecx
    jmp  edx

(No cumple el Intel ABI, pero puedo asumir que EDI se modifique y así me ahorro 2bytes)

¿Alguien ve la forma de recortarlo más?
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: cpu2 en 21 Enero 2013, 18:43 PM
Hola

Código (asm) [Seleccionar]
push -1   
pop  ecx


El push son dos bytes, pop uno, si el valor de ecx fuera cero podrías hacer un not y serian dos bytes.

¿Puedes hacer eso?

Un saludo.
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 21 Enero 2013, 19:19 PM
Código (asm) [Seleccionar]
include 'win32ax.inc'

.data
     Cadena     db 'mDrinky',0
     longitud   dd ?
.code
start:
    push Cadena
    call StrLen

    mov [longitud],eax
    invoke GlobalAlloc,GPTR,1024
    push eax
    invoke wsprintfA,eax,"%d",[longitud]
    pop eax
    invoke MessageBox,0,eax,0,MB_OK

    ret


    StrLen:  ; 14 bytes
        pop edx
        pop ecx
        push -1
        pop eax
        bucle:
        inc eax
        cmp byte[ecx+eax],0
        jne bucle
        jmp edx

.end start
               


14 Bytes
;D
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: mr.blood en 21 Enero 2013, 19:44 PM
No se si ya se puede acortar mas... yo creo que no.

13 bytes 14 bytes

Código (asm) [Seleccionar]
include 'C:\FASM\include\win32ax.inc'
.data
Mensaje db "mrblood",0
.code
start:
push Mensaje
call strlen
ret
strlen:
pop ebx
pop edi
mov eax,edi
buc:
inc eax
cmp byte [eax],0
jne buc
sub eax,edi
jmp ebx

.end start


EDITO:

Olvidadlo, no retorna correctamente. Lo mas corto son 14 bytes hasta el momento.

P.D.: Drinky, quiero ese beso xD

Sa1uDoS
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 20:09 PM
Ninguna de vuestras aproximaciones parece funcionar con una cadena nula ;) >:D

Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Eternal Idol en 21 Enero 2013, 20:59 PM
Cita de: Karcrack en 21 Enero 2013, 20:09 PMAdemás la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.

No, una cadena vacia tiene un tamaño de 0 caracteres.
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 21 Enero 2013, 21:04 PM
La mia si funciona con una cadena nula  :rolleyes:
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 23:56 PM
Cita de: Eternal Idol 7D en 21 Enero 2013, 20:59 PM
No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero :laugh:


Cita de: mDrinky en 21 Enero 2013, 21:04 PM
La mia si funciona con una cadena nula  :rolleyes:
Devuelve 0 y quiero que sea 1 :-\ Fuera de esa necesidad tu código haría mejor el clone de strlen() y cumple el intel ABI :)
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Eternal Idol en 22 Enero 2013, 00:04 AM
Cita de: Karcrack en 21 Enero 2013, 23:56 PM
No la función que yo quiero :laugh:

Entonces no es strlen()  :silbar:
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: MCKSys Argentina en 22 Enero 2013, 02:22 AM
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), queda de 13 bytes:

Código (asm) [Seleccionar]

strlena:
    pop edx
    pop ecx
    xor eax, eax
bucle:
    inc eax
    cmp byte ptr [ecx+eax],0
    jne bucle
    jmp edx
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 22 Enero 2013, 08:56 AM
Cita de: MCKSys Argentina en 22 Enero 2013, 02:22 AM
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), queda de 13 bytes:

Código (asm) [Seleccionar]

strlena:
    pop edx
    pop ecx
    xor eax, eax
bucle:
    inc eax
    cmp byte ptr [ecx+eax],0
    jne bucle
    jmp edx


si  :) lo unico que si es una cadena no le suma ese byte nulo.
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 22 Enero 2013, 12:15 PM
El asunto es que estoy parcheando un PE que tiene una función con este comportamiento (Cadena NULA = 1, etc...) Quería inyectar un poco de código sin necesidad de redireccionarme a/crear codecaves. Substituyendo la función por una de 20bytes tenía más que suficiente para lo que quería inyectar :)

Me encantan este tipo de threads :rolleyes: ;-)
A ver si acabo una función RC4 y vemos cuanto la podemos recortar >:D
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: cpu2 en 5 Marzo 2013, 20:31 PM
La mia devuelve 1 si la cadena es núla, el código esta escrito en unix-like.

Código (asm) [Seleccionar]
.section .data

cadena:
.ascii ""

.section .text
.globl _start

_start:

pushq $cadena
popq %rbx

C.0:
incb %bl
incb %dl
cmpb %al, (%rbx)
jne C.0
movl %edx, %edi
movb $0x1, %al

syscall


14 bytes C.0.

Kdump:
CALL  exit(0x1)

Un saludo.
Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: mr.blood en 4 Abril 2013, 02:14 AM
Hoy viendo esta (http://www.rinconsolidario.org/eps/asm8086/CAP6.html) pagina recorde este tema e hice una funcion de 10 bytes.

Código (asm) [Seleccionar]
include 'C:\FASM\include\win32ax.inc'

.code
start:
push ebp
mov ebp, esp

push mensaje
call strlen

leave
ret

strlen:
pop edx
pop edi
xor ecx, ecx
bucle:
inc ecx
SCASB
jnz bucle
jmp edx
.end start
.data
mensaje db "Mr.BlooD",0


Sa1uDoS