[Problema] De buffer a variable

Iniciado por Lewert, 10 Julio 2009, 18:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Lewert

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?
Crack the bytes, crack yourself

Yurix

----
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










http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.

Lewert

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.
Crack the bytes, crack yourself

YST

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


Yo le enseñe a Kayser a usar objetos en ASM

ny0x

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


Lewert

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.
Crack the bytes, crack yourself

ny0x

guarda en el parametro la direccion de una variable, y dentro de la funcion usas el parametro como puntero

Lewert

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.
Crack the bytes, crack yourself

ny0x

ponme el trozo de codigo que te da problemas, para que entienda mejor  ;)

YST

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


Yo le enseñe a Kayser a usar objetos en ASM