Autor
|
Tema: [Problema] De buffer a variable (Leído 7,567 veces)
|
Lewert
Desconectado
Mensajes: 231
|
Hola hola Estoy programando en ASM y me he encontrado con un pequeño problema que no he sabido como arreglar. Supongamos que declaro un buffer: 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?
|
|
|
En línea
|
Crack the bytes, crack yourself
|
|
|
Yurix
Desconectado
Mensajes: 72
Paz para la guerra y guerra por la paz
|
---- 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
|
|
|
En línea
|
|
|
|
Lewert
Desconectado
Mensajes: 231
|
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.
|
|
|
En línea
|
Crack the bytes, crack yourself
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
Nose bien lo que quieres hacer pero mas o menos por lo que entendi te hice un codigo 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
|
|
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
ny0x
Desconectado
Mensajes: 336
|
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
|
|
|
En línea
|
|
|
|
Lewert
Desconectado
Mensajes: 231
|
El problema ya lo solucioné. Gracias a todos 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: proc DirectorioDeWindows, Ruta mov [Ruta], 'C:\Windows' ret endp
Se que el code está mal, es para que os hagais una idea.
|
|
|
En línea
|
Crack the bytes, crack yourself
|
|
|
ny0x
Desconectado
Mensajes: 336
|
guarda en el parametro la direccion de una variable, y dentro de la funcion usas el parametro como puntero
|
|
|
En línea
|
|
|
|
Lewert
Desconectado
Mensajes: 231
|
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 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.
|
|
|
En línea
|
Crack the bytes, crack yourself
|
|
|
ny0x
Desconectado
Mensajes: 336
|
ponme el trozo de codigo que te da problemas, para que entienda mejor
|
|
|
En línea
|
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
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
|
|
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
|
|