Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 26 Marzo 2013, 23:09 pm



Título: Ayuda con funcion "Split"
Publicado por: Vaagish en 26 Marzo 2013, 23:09 pm
Buenas amigos del foro.. Espero que anden bien.. :)

Bueno, creo que hoy la duda esta clarisima,, preciso dividir un string con un criterio dado,, asi, tal cual lo haria vb con split.

Si a alguien se le ocurre algo, una idea por donde empezar, o mejor aun un pseudocodigo, o lo que sea jaja

Desde ya, muchas gracias! :)


Título: Re: Ayuda con funcion "Split"
Publicado por: Flamer en 27 Marzo 2013, 04:56 am
hola Vaagish los string en asm se manejan en posiciones de memoria no puedes manejarlos como el vb ejemplo:

Nota: los comandos y el code pueden estar mal llaque no estoy en la pc

si tienes la palabra "hola mundo hacking" en la posicion 00401000 y la quieres dividir seria.

Código:
.data?
parte1 db ?
parte2 db ?
parte3 db ?
.code
xor eax,eax
xor ebx,ebx
.while ebx <= 4
   mov eax, bytes ds prt[00401000+ebx]
   mov parte1,eax
   inc ebx
.endwhile
xor eax,eax
xor ebx,ebx
.while ebx <= 5
   mov eax, bytes ds prt[00401005+ebx]
   mov parte2,eax
   inc ebx
.endwhile
xor eax,eax
xor ebx,ebx
.while ebx <= 7
   mov eax, bytes ds prt[0040100C+ebx]
   mov parte3,eax
   inc ebx
.endwhile
lo que ase este code es guardar la palabra "hola" en la variable parte1 y la palabra "mundo" en parte2 y "hacking" en parte3

saludos flamer y para unir es a la biseversa


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 27 Marzo 2013, 05:21 am
Gracias Flamer por la respuesta, me es de gran ayuda para empezar, es que aun soy muy noob en esto de ASM.
El unico detalle es que mi code no tiene una cadena predefinida, y yo preciso cortar la cadena con un delimitador dado..
Seguro sabras de que hablo.. mi cadena llega algo asi, por ejemplo: "Mnsj|Ola keace", yo preciso :

Parte1 = "Mnsj"
Parte2 = "Ola keace"

A lo mejor, con darme una idea como "retocar" ese code y yo me manejo.. si no puedo preguntare otra vez jejeje

Gracias!!  

EI: juntando mensajes.

Y ya que estoy en el hilo, me tomo el atrevimiento de hacer una consulta bien, pero bien noob..
El operador xor, por lo que entiendo:

Devuelve True si                                         
a = true y b = false                                   
a = false y b = true   

Y False si:
a = true y b = true
a = false y b = false

pero.. para que sirve en este caso por ejemplo?

EDITADO: Ta, ya entendi para que sirve xor :)


Título: Re: Ayuda con funcion "Split"
Publicado por: Flamer en 27 Marzo 2013, 06:28 am
el xor por si lo entendistes mal o de otra forma te lo explico yo lo uso para dejar los registros en cero y el codigo que te puse arriba es para separar las palabras guardandolas en las variables parte1, 2, 3.

y por otro lado te deje el ejemplo para que te guies por ti mismo no puedo aserte todo el codigo y si tienes dudas aqui te dejo un link donde encontraras varios tutoriales te recomiendo el de radasm

ricardonarvaja.info/WEB/OTROS/PROGRAMACION/TEORIAS%20SOBRE%20PROGRAMACION%20EN%20ASSEMBLER/
 (http://ricardonarvaja.info/WEB/OTROS/PROGRAMACION/TEORIAS%20SOBRE%20PROGRAMACION%20EN%20ASSEMBLER/)

saludos flamer y si te atoras pregunta


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 27 Marzo 2013, 07:17 am
Excelente recopilacion de tutos! Hoy de tarde los veo con tiempo!
Si, estoy usando el RadASM,, es muy bueno.. y por ahi vi en ese enlace que me mandaste que hay unos tutos de RadASM, me viene impeca para ampliarme mas en ese IDE...
Con respecto al code creo que voy a poder adaptarlo.. ;)

Gracias sabio! Abrazo!

Y larga vida al rey ASM ! Jejeje


Título: Re: Ayuda con funcion "Split"
Publicado por: xv0 en 27 Marzo 2013, 10:52 am
Hola

Esto puede ayudarte.

Código
  1. .section .data
  2.  
  3. cadena:
  4. .ascii "dddabbb"
  5.  
  6. .section .text
  7. .globl _start
  8.  
  9. _start:
  10.  
  11. push cadena
  12.  
  13. _C.0:
  14.  
  15. incq %rsp
  16. cmpb $0x61, (%rsp)
  17. jne _C.0
  18.  
  19. incq %rsp
  20. movl (%rsp), %edi
  21. incb %al
  22. syscall

Si quieres que copie las "d", elimina el inc de la línea 19 y el mov dejalo así

Código
  1. movl -0x4(%rsp), %edi

Es un ejemplo que hice, se puede mejorar mucho más.

Un saludo.


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 27 Marzo 2013, 22:09 pm
Hola gentes!
La verdad queria hacerlo solo, pero esto me esta rompiendo la cabeza..

Tengo un problema con esta instruccion: mov eax, dword ptr [Cadena + ebx]

Veamos,, esto deberia poner la direccion de memoria de mi cadena en el registro eax, no ??

Pero si hago esto:

mov OtraVar, eax
messagebox OtraVar

Me muestra los 4 primeros caracteres de mi Cadena..
No estoy utilizando while, ni nada.. quedaria asi:

   xor eax, eax
   xor ebx, ebx
   
   mov eax, dword ptr [Cadena + ebx]
   mov Texto, eax
   invoke MessageBox, NULL, addr Texto, addr Titulo, MB_OK

Resultado "Esta" -> 4 primeros caracteres de mi Cadena

Como deberia recorrer el string caracter por caracter ? Yo me encargo del cmp, del jmp y todo lo demas :D

Graciass !! Y Gracias cpu2 tambien pero eso es fasm, no? apenas puedo con masm aun jejeje


Título: Re: Ayuda con funcion "Split"
Publicado por: MCKSys Argentina en 27 Marzo 2013, 23:12 pm
Si tienes un buffer (Cadena), puedes usar la palabra offset para hacer referencia a la posicion donde esta.

Código:
mov eax, offset Cadena

Hace que eax apunte al primer byte de la cadena.

Ahora

Código:
mov eax, dword ptr [Cadena]

Hace que eax contenga "el dword que esta apuntado por" Cadena, osea los 4 primeros bytes de la misma.

Para recorrer el stringz char x char hay muchos metodos. Lo que hice YO al principio, fue hacer un programa que usaba las macros de masm (fijate el folder doc de la instalacion de masm), use StrCopy (no recuerdo bien cual fue con certeza), compile y miré el asm con Olly.


Título: Re: Ayuda con funcion "Split"
Publicado por: Flamer en 28 Marzo 2013, 00:09 am
hola aqui un codigo aver si te funciona ya que no estoy en la pc pero llegando a casa si esta mal lo soluciono.
El codigo debe de imprimir un msgbox en pantalla de cada letra dime si te funciona
Código:
.data
Titulo db "Mensage hola",0
Cadena db "hola mundo hacking",0
.code
   xor eax, eax
   xor ebx, ebx
   .while ebx <= 18
   mov eax, bytes ds ptr [Cadena + ebx]
   invoke MessageBox, NULL, addr eax,
addr Titulo, MB_OK
   inc ebx
   .endwhile

saludos flamer y cualquier duda pregunta


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 28 Marzo 2013, 00:30 am
Gracias por las respuestas a todos!!

No me funco eso Flamer, me dice un error que ya me habia salido, en tantas pruebas que he echo.. me dice:

missing operator in expression -> mov eax, byte ds ptr [Cadena + ebx]

miren como va la cosa, asi me pueden decir si voy bien :)

.code

Inicio:

   xor eax, eax
   xor ebx, ebx
   mov eax, offset[Cadena]
   
.while ebx < 4
   
   mov eax, byte ptr [eax+1]  -> Se que aca deberia sumar ebx, pero no funca
   cmp eax, '|'
   je Corta
   mov Texto, eax
   inc ebx   
   
.endw

Corta:
   invoke dwtoa, eax, addr Texto
   invoke MessageBox, NULL, addr Texto, addr Titulo, MB_OK
   invoke ExitProcess, 0

end Inicio

Si pongo como decis tu Flamer me dice missing op. y si pongo +1 me dice invalid instruction.. Me quiere enfermar jajaja

Bueno, por otro lado tambien precisaria que el while se ejecute hasta el tamaño del string,, no solo hasta 4 :/

Pd: Gracias MCKSys tambien por el aporte, ya comprendi el tema dword y el byte ;)


Título: Re: Ayuda con funcion "Split"
Publicado por: Flamer en 28 Marzo 2013, 00:42 am
como te dije dame tiempo de llegar a mi casa y te lo pongo bien

saludos flamer y dame tiempo


Título: Re: Ayuda con funcion "Split"
Publicado por: xv0 en 28 Marzo 2013, 01:02 am
Hola gentes!
Como deberia recorrer el string caracter por caracter ? Yo me encargo del cmp, del jmp y todo lo demas :D

A ver si lo entiendo porque la verdad esto se esta desviando, quieres mover carácter por carácter a eax no?

Para luego imprimir cada carácter con la api messagebox?

Sguiendo el código anterior hice esto aver si te puede ayudar

Código
  1. _C.0
  2.  
  3. lodsb
  4. cmpb $0x7c, (%rsi)
  5. jne _C.0

Copia byte por byte a al "eax de 8 bit", hasta que se encuentre con "|" es eso lo que quieres?

Y Gracias cpu2 tambien pero eso es fasm, no? apenas puedo con masm aun jejeje

De nada, se trata de la sintaxis de AT&T, los ejemplos son de 64 bits solo los tienes que traducir a nasm y 32 bits.

Un saludo.


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 28 Marzo 2013, 01:15 am
En realidad yo preciso una funcion que sea Split, sin mas.. yo le paso un string como parametro a la funcion y ella se encarga de Splitearla.. El tema de los mensajes de windows son solo para mostrar en pantalla como me queda la cadena X)

Luego veo el tema de la traduccion AT&T.. Si ya me complica masm.. imaginate que entiendo yo de eso jaja

Saludos !


Título: Re: Ayuda con funcion "Split"
Publicado por: MCKSys Argentina en 28 Marzo 2013, 05:21 am
Veo que no tienes en cuenta algunas cosas. Examinemos el problema:

Quieres hacer en MASM lo mismo que en VB6: usar la función split.

La función split toma un string de largo arbitrario (por sencillez diremos que es un string terminado en zero) y otro string, el cual NORMALMENTE es de largo 1 (por sencillez lo tomaremos como de largo 1).

Lo que hace la función es partir el primer string en la posición de cada ocurrencia del segundo string. Cabe destacar que el string de separación (el segundo string) no se incluye en el resultado.

Luego, las strings obtenidas se colocan en un array (matriz en vb) de strings.

Faltan analizar los casos especiales, como por ej.: si no se encuentra el 2º string, pero por ahora basta con lo dicho.

Ahora, para lo anterior, debes tener en cuenta lo siguiente:

El array de cadenas: lo devuelves como puntero? Osea, la función se encarga de allocar la memoria, llenarla (partir la cadena) y devolver un ptr al array en eax? O mejor lo pides como parámetro? Si viene como parámetro: cuál debería ser el tamaño? Un array de strings en realidad sería un array de punteros, donde deberás especificar el tamaño, con lo que ya tendrías una estructura.

Como ves, no es tan sencillo como suena, pero tampoco imposible. Te aconsejo mirar la carpeta HELP del MASM. En especial el archivo masmlib. Verás que la lib de MASM tiene muchas cosas que puedes usar y que te permitirán implementar esta función de una forma sencilla. Ejemplos que te podrían servir en este caso:

create_array  Create an array of pointers to a user defined array
InString Find substring in zero terminated source string
szWcnt  Count the occurrence of text in a zero terminated string

y la lista sigue y sigue... :)

Saludos!


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 28 Marzo 2013, 05:48 am
Huu,, y yo de novato mandandome estas ocurrencias... Igual, creo que no seria para tanto MCK, te puedo decir MCK no ? jaja
Bueno, a lo que voy..
Citar
Lo que hace la función es partir el primer string en la posición de cada ocurrencia del segundo string.
No entiendo esa parte.. Lo que hace la funcion es partir una cadena, cuando encuentra un delimitador.. en este caso el caracter " | ". Asi mismo yo se que mi cadena solo se va a dividir en 2, y si en el futuro agrandase la funcion, bueno.. despues veo..

Voy a ser claro para que no de a confusion ;)

La cadena que preciso cortar puede ser por ejemplo: "CONNECT|Username" y comandos de ese tipo,,, supongo ya habran visto este tipo de cadenas en 1 millon de sources y se sobre entiende para que sirve.. ;)

Pd: voy a mirar eso que me dijiste y el enlace que hay por ahi arriba


Título: Re: Ayuda con funcion "Split"
Publicado por: Flamer en 28 Marzo 2013, 05:50 am
Hola ya quedo el codigo
Código:
.data
Mensaje db "Hola mundo",0
Titulo db "Resultado",0
.data?
Caracter db ?
.code
xor eax,eax
xor ebx,ebx
.while ebx<=10
   mov al,byte ptr ds:[Mensaje+ebx]
   mov Caracter,al
   invoke messagebox,null,addr Caracter,addr Titulo,MB_OK
   inc ebx
.endw

dime si te salta error ami mesale bien

saludos flamer y dime como te fue


Título: Re: Ayuda con funcion "Split"
Publicado por: xv0 en 28 Marzo 2013, 09:53 am
Código
  1. .section .data
  2.  
  3. cadena:
  4. .ascii "cc|aa"
  5.  
  6. .section .text
  7. .globl _start
  8.  
  9. _start:
  10.  
  11. movq $cadena, %rbx
  12.  
  13. _C.0:
  14.  
  15. incb %bl
  16. cmpb $0x7c, (%rbx)
  17. jne _C.0
  18.  
  19. movw -0x2(%rbx), %di
  20. incb %bl
  21. movw (%rbx), %si

Cuando encontrara  "|" copiaría los carácteres "cc" a di, y "aa" a si.

Más o menos es eso lo que pretendes no?

Un saludo.


Título: Re: Ayuda con funcion "Split"
Publicado por: mr.blood en 28 Marzo 2013, 15:56 pm
Por si te sirve lo hice en C. Si te da una idea o si quieres usarla en tu codigo de ASM.

http://foro.elhacker.net/programacion_cc/c_funcion_split-t386651.0.html

Sa1uDoS


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 29 Marzo 2013, 00:06 am
Excelente amigos! Gracias por las respuestas a todos!! Yo pase 16 hs en querer resolverlo,, ya me tenia mal jaja

Es exactamente eso lo que preciso cpu2 pero adaptado al code de flamer que funciona impeca.. asi que ahora me toca a mi unirlos jeje Gracias! Mr.blood, tambien me sirve de guia.. aca todo sirve, no hay desperdicios ;)

Gracias a todos! Ya volvere con alguna pregunta de novato jeje



Título: Re: Ayuda con funcion "Split"
Publicado por: Binary_Death en 30 Marzo 2013, 04:48 am
Hacer una función split en la que el delimitador sea un carácter, sólo un carácter, es muy fácil. Tienes que recorrer la cadena byte a byte y comparar (hay instrucciones precisas en ASM que usan los registros  ESI y EDI, muy útiles para estos casos).

Yo seguiría este procedimiento:

Reserva memoria para un array de punteros. Almacena la dirección inicial de la cadena a splitear en el primer elemento del array.
Ahora vamos recorriendo la cadena y buscamos la primera ocurrencia del delimitador. En cuanto la encontremos, sustituimos el byte por un byte nulo (0x00) y aumentamos el contador para pasar al siguiente carácter, cuya dirección almacenamos en el siguiente elemento de nuestro array de punteros.
Seguimos esto en bucle hasta encontrarnos con el final de la cadena.

Hecho esto, tendremos un bonito array de punteros cada uno apuntando a un trozo de la cadena, o mejor dicho, tendremos muchas cadenas almacenadas consecutivamente en memoria. Perfecto.

Ahora, si quieres hacer un split como el de VB (delimitador de más de un carácter), la cosa se complica. Lo difícil en ese caso es el algoritmo a usar, y hay que pensarlo bien para que sea óptimo.


Título: Re: Ayuda con funcion "Split"
Publicado por: MCKSys Argentina en 30 Marzo 2013, 23:09 pm
Ahora, si quieres hacer un split como el de VB (delimitador de más de un carácter), la cosa se complica. Lo difícil en ese caso es el algoritmo a usar, y hay que pensarlo bien para que sea óptimo.

Siempre puedes tracear el runtime de VB y ver qué hace... :)

Por supuesto, hay que tener en cuenta que VB usa UNICODE internamente.


Título: Re: Ayuda con funcion "Split"
Publicado por: Vaagish en 2 Abril 2013, 02:33 am
Bueno,, gracias a la ayuda de ustedes, logre hacer funcionar el Split.. Les voy a dejar aca el codigo que me dio resultado.. Ya se que se puede mejorar montones, y lo pongo aca, justamente para que si alguien quiere lo corrija.. me serviria mucho.
No se olviden que yo no se practicamente nada de ASM, pero hacer que funcione fue bastante para mi jeje ;)

Código:
.386
.model flat, stdcall
option casemap:none

include Includes.inc

.data

Mensaje db "Mens|ajes",0
Titulo db "Resultado",0

.data?

Dato1 db 50 dup (?)
Dato2 db 50 dup (?)

.code

Inicio:

invoke Split, addr Mensaje
ret
invoke ExitProcess, 0


Split proc String:DWORD
   
    mov ecx, -1
mov ebx, -1
   
    Repite:
   
        inc ecx
        mov al, byte ptr ds:[Mensaje+ecx]
  cmp al, '|'
  je Salta
  mov [Dato1+ecx], al
jmp Repite

Salta:

inc ecx
inc ebx
cmp byte ptr ds:[Mensaje+ecx],0
        je Salir
       
        mov al, byte ptr ds:[Mensaje+ecx]
        mov [Dato2+ebx], al
jmp Salta

Salir:
invoke MessageBox, NULL, addr Dato1, addr Titulo, MB_OK
invoke MessageBox, NULL, addr Dato2, addr Titulo, MB_OK

ret

Split endp

end Inicio

Ya se que la funcion tiene un parametro que no uso, pero en el programa que estoy haciendo si lo voy a precisar.. Aparte no se controlan algunos errores, como que si el string comienza con "|" o si no tiene ningun "|". Pero yo se que cadena deberia recibir.. y siempre es un string separado en 2 por un caracter "|". Asi que, sabiendo eso.. si la cadena llega completa.. no deberia dar errores.. ;)


Título: Re: Ayuda con funcion "Split"
Publicado por: xv0 en 3 Abril 2013, 12:30 pm
A ver si esto te ayuda.

Código
  1. .section .data
  2.  
  3. data: .ascii "ab|cdefg"
  4.  
  5. .section .text
  6. .globl _start
  7.  
  8. _start:
  9.  
  10. movl $data, %edi
  11. pushq %rax
  12. movq %rsp, %rbx
  13.  
  14. _C.0:
  15.  
  16. incb %dl
  17. scasb
  18. jne _C.0
  19. subl %edx, %edi
  20. decb %dl
  21. movb %dl, %r8b
  22. pushq %rdi
  23. popq %rsi
  24.  
  25. _C.1:
  26.  
  27. lodsb
  28. cmpb $0x7c, %al
  29. je _C.3
  30. movb %al, (%rbx)
  31.  
  32. _C.2:
  33.  
  34. incb %bl
  35. decb %dl
  36. jnz _C.1
  37. subb %r8b, %bl
  38.  
  39. pushq $0x1
  40. popq %rdi
  41. pushq %rbx
  42. popq %rsi
  43. movb %r8b, %dl
  44. movb $0x4, %al
  45. syscall
  46.  
  47. movb $0x1, %al
  48. syscall
  49.  
  50. _C.3:
  51.  
  52. movb $0x0a, (%rbx)
  53. jmp _C.2

Un saludo.


Título: Re: Ayuda con funcion "Split"
Publicado por: xv0 en 27 Mayo 2013, 18:49 pm
Revivo el tema para mostrar el siguiente código, apenas 31 bytes, se podría mejorar para que eliminara más de un carácter.

Código
  1. _split:
  2.  
  3. xorl %edx, %edx
  4.  
  5. _C.1:
  6.  
  7. incl %edx
  8. scasb
  9. jne _C.1
  10.  
  11. _C.2:
  12.  
  13. subl %edx, %edi
  14. decl %edx
  15. pushl %edx
  16. movl %edi, %esi
  17.  
  18. _C.3:
  19.  
  20. lodsb
  21. cmpb $0x7c, %al
  22. je _C.4
  23. stosb
  24. jmp _C.5
  25.  
  26. _C.4:
  27.  
  28. movb $0x00, (%edi)
  29. incl %edi
  30.  
  31. _C.5:
  32.  
  33. decl %edx
  34. jnz _C.3
  35. popl %ebx
  36. subl %ebx, %edi
  37. retl

Cargar la dirección en edi y la función te retorna un puntero en el mismo edi.

Un saludo.


Título: Re: Ayuda con funcion "Split"
Publicado por: mr.blood en 27 Mayo 2013, 23:23 pm
Código
  1. mov eax, 'b'
  2.  
  3. mov edi, cadena
  4.  
  5. bucle:
  6. scasb
  7. jne bucle
  8.  
  9. mov byte[edi-1], 0
  10. mov eax, edi
  11. sub eax, cadena
  12.  

No sé si eso te puede valer pero ocupa 27bytes. Lo quCreo que puede hacerse aún más cortoe hace es reemplazar el caracter por el el caracter nulo y devuelve el eax la posición donde comienza la segunda cadena.

Sa1uDoS