Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: Lewert en 10 Julio 2009, 18:50 PM

Título: [Problema] De buffer a variable
Publicado por: Lewert en 10 Julio 2009, 18:50 PM
Hola hola :D

Estoy programando en ASM y me he encontrado con un pequeño problema que no he sabido como arreglar.
Supongamos que declaro un buffer:
Código (asm) [Seleccionar]
Nombre rb 100
y al usar una API, ese buffer se llena pero no del todo. ¿Hay algún modo de "pasar" esa parte llenada a una variable directamente?
Título: Re: [Problema] De buffer a variable
Publicado por: Yurix en 10 Julio 2009, 21:45 PM
----
Supongamos que declaro un buffer:
Código

Nombre rb 100

y al usar una API, ese buffer se llena pero no del todo. ¿Hay algún modo de "pasar" esa parte llenada a una variable directamente?
-----------

Haber si te explicas un poco mejor , tienes el buffer lleno y quieres "baciarlo" y copiarlo a otra variable?? Es eso

Es fácil , primero debes de saber que no se puede copiar de memoria a memoria (hasta donde se!) , primero debes de copiar un byte a cualquier registro del CPU con la capacidad de un byte , ejemplo AH o AL que pertenecen a EAX , después copias lo que tienes en estos registros hacia el espacio en memoria de la variable que esta "vacia" , al mismo tiempo tenes que comprobar si has llegado al fin del buffer , ej comprobando que los bytes que estas copiando son 00 hexa , en el caso que estés trabajando con strings que por ley terminan en 00 , si no estas trabajando con strings tienes que copiar lo que se encuentre dentro de un rango determinado , ej el tamaño de el Buffer e ir restando con cada operación de copia que hagas hasta llegar a 0 que es el fin del buffer.

SAludos








Título: Re: [Problema] De buffer a variable
Publicado por: Lewert en 10 Julio 2009, 22:07 PM
No me has entendido :-[

Yo declaro un buffer de 100 bytes para poder usarlo en una API, y al usar esa API el buffer se llena solo 30 bytes (dejando 70 bytes libres). ¿Como puedo copiar esos 30 bytes en una variable? Supongo que mediante RtlMoveMemory se puede, pero yo me refiero a hacerlo directamente... mediante registros o movs.
Título: Re: [Problema] De buffer a variable
Publicado por: YST en 10 Julio 2009, 22:11 PM
Nose bien lo que quieres hacer pero mas o menos por lo que entendi  te hice un codigo :P

Código (asm) [Seleccionar]

include 'win32ax.inc'
.data
lBuffer rb 100
.code
start:
    invoke GetLogicalDriveStrings,100,lBuffer
    invoke lstrlenW,lBuffer
    mov ebx,2
    mul ebx
    mov ebx,eax
    inc ebx
   invoke GlobalAlloc ,GPTR, ebx       ;Creamos otro buffer
   mov edi,eax ; Guardamos el buffer en edi
   stdcall cRtlMoveMemory,eax,lBuffer,ebx     ;Copiamos lo que se encuentra en lBuffer a el buffer generado por GlobalAlloc
   stdcall Zerar,lBuffer,ebx;Vaciamos el lBuffer
     invoke MessageBox,0,edi,0,0
       invoke MessageBox,0,lBuffer,0,0
   invoke ExitProcess,0
     ;Descripcion: Esta función funciona igual que la winapi RtlMoveMemory
; by YST
proc cRtlMoveMemory,cBuffer,Cpuntero,cCantidad
push esi edi
xchg edi,[cBuffer]
xchg esi,[Cpuntero]
.bucleb:
dec [cCantidad]
movsb
cmp  [cCantidad],0
jge .bucleb
pop edi esi
ret
endp

proc Zerar,Puntero,Cantidad

   push ecx
   push ebx

             mov ecx,[Cantidad]
                mov ebx,[Puntero]
               .bucle:

               mov byte[ebx+ecx],0
               loop .bucle
               mov byte[ebx],0
               pop ebx
               pop ecx
               ret
endp
.end start
Título: Re: [Problema] De buffer a variable
Publicado por: ny0x en 11 Julio 2009, 03:18 AM
quieres copiar de un buffer a otro? si es asi puedes mover la direccion del origen en esi y la del destino en edi y utilizar movsb (para bytes), movsw (para words), movsd( dwords) y si tienes un procesador de 64 , movsq(para qwords). junto con el prefijo rep

Título: Re: [Problema] De buffer a variable
Publicado por: Lewert en 12 Julio 2009, 20:38 PM
El problema ya lo solucioné. Gracias a todos :P
Ahora me he topado con otro problema. ¿Alguien podria ponerme un ejemplo de como darle un valor de salida a un parametro en una función?

Ejemplo:
Código (asm) [Seleccionar]

proc DirectorioDeWindows, Ruta
mov [Ruta], 'C:\Windows'
ret
endp

Se que el code está mal, es para que os hagais una idea.
Título: Re: [Problema] De buffer a variable
Publicado por: ny0x en 12 Julio 2009, 20:56 PM
guarda en el parametro la direccion de una variable, y dentro de la funcion usas el parametro como puntero
Título: Re: [Problema] De buffer a variable
Publicado por: Lewert en 12 Julio 2009, 21:44 PM
x0ʎu he hecho lo que dices pero sigue habiendo un pequeño problema. Dentro de la función si le doy un valor al parametro funciona todo correctamente, pero al hacer lo siguiente fuera de la función
Código (asm) [Seleccionar]

stdcall Funcion, Parametro
mov eax, Parametro

el Parametro está vacio. No se si me entiendes :-\
Dentro de la función todo bien pero al utilizarla desde fuera no funciona.
Título: Re: [Problema] De buffer a variable
Publicado por: ny0x en 12 Julio 2009, 21:56 PM
ponme el trozo de codigo que te da problemas, para que entienda mejor  ;)
Título: Re: [Problema] De buffer a variable
Publicado por: YST en 12 Julio 2009, 23:42 PM
Por cierto en que estas ensamblando en masm o fasm ?

Por que si es fasm seria

mov eax,[Parametro] y en masm no me acuerdo :xD
Título: Re: [Problema] De buffer a variable
Publicado por: Arkangel_0x7C5 en 13 Julio 2009, 02:08 AM
haber, pongamos algo de orden. Normalmente los parametros se pasan a la funcion a traves de la pila y se devuelve un valor de retorno en el registro EAX.

Esto es cosa de las convenciones de llamada.

Saludos.

PD: Estas cosas deberian de salir en un buen tuto de asm
Título: Re: [Problema] De buffer a variable
Publicado por: ny0x en 13 Julio 2009, 02:26 AM
es el problema de usar macros, te ocultan como funcionan en verdad las funciones  :rolleyes:
Título: Re: [Problema] De buffer a variable
Publicado por: Arkangel_0x7C5 en 13 Julio 2009, 02:38 AM
Cita de: x0ʎu en 13 Julio 2009, 02:26 AM
es el problema de usar macros, te ocultan como funcionan en verdad las funciones  :rolleyes:

Ya, pero si usas asm, se deberia aprender primero como funcionan las cosas basicas. y luego usar algun que otro macro para tareas repetitivas.
Y al que no le gustelo de no usar casi macros, le recomiendo que use c/c++ porque en este lenguaje la verdadera ventaja esta en poder hacer las cosas desde realmente zero.

Saludos