Problema al limpiar variable

Iniciado por Vaagish, 11 Abril 2013, 22:45 PM

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

Vaagish

Hola!! Como andan ?
Bueno,, la consulta es facil hoy.. resulta que tengo un problema al limpiar una variable llamada buffer, la cual se modifica constantemente cuando llega un dato por una conexion con socket.. aca dejo el code y el problema detallado.

.data?

buffer      db 512 dup(?)       ;Bufer para guardar datos recibidos

Eso en la sección .data?, luego en la sección .code:

Recv:
invoke recv, sock, addr buffer, sizeof buffer, 0
   
cmp sock, 0
je EMsg
   
EMsg:
invoke MessageBox, 0, addr buffer, addr Titulo, MB_OK
jmp Recv

El problema es que el "buffer" siempre queda cargado con la mayor cantidad de bytes que se le hayan pasado, por ejemplo:

si cargo buffer con "Hola", y luego cargo buffer con "J" el buffer queda asi: "Jola"

Ya probe con: mov buffer, 0 pero no da resultado...

Tendria que recorrer el buffer byte por byte y si es <> de 0 borrarlo ?? Es esa la solucion ?

Desde ya muchas gracias !! :)

MCKSys Argentina

Probaste algo como:

Código (asm) [Seleccionar]

mov eax, offset buffer
mov byte ptr[eax], 0


antes de hacer recv?
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Flamer

Cita de: MCKSys Argentina en 12 Abril 2013, 05:08 AM
Probaste algo como:

Código (asm) [Seleccionar]

mov eax, offset buffer
mov byte ptr[eax], 0


antes de hacer recv?

mmm no dudo de ti fly tu sabes muncho pero solo pienso yo que con eso solo limpiarias la primera posicion de memoria de la variable, orita no estoy en la pc apenas calando pero eso es lo que pienso y con el tema pienso que tendras que saber la longitud de la variable y hacer un bucle y limpiar cada posicion de memoria

y si estoy mal corrijanme

saludos flamer

Vaagish

Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva  respuesta...

Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..

MCKSys Argentina

Cuando trabajas con cadenas terminadas en cero, si pones un cero al principio, lo demas ya no importa: la cadena tiene largo 0...  ;)

Ahora, si quieres escribir si o si TODO el buffer, usa memfill y listo.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


mr.blood

Cita de: Vaagish en 12 Abril 2013, 06:13 AM
Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva  respuesta...

Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..

Con que pongas un 0 en la posicion cadena[strlen(cadena)]=0 asi delimitas la cadena, no hace falta que limpies todo.

Sa1uDoS

Flamer

Citar
Con que pongas un 0 en la posicion cadena
[strlen(cadena)]=0 asi delimitas la cadena,
no hace falta que limpies todo.
Sa1uDoS
delimitando la cadena como dises los bytes quedarian en memoria y se borrarian al sobreescribir en ellos pero tendria que tener cuidado de no hacer un llamado a la cadena y salgan a la luz.
Osea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.

Es muy buena opcion pero con cuidado

saludos flamer

Vaagish

Impecable! memfill do the hard work!!

CitarOsea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.

Exacto.. y yo preciso el buffer en un MessageBox.. siempre me tira el buffer con la mayor cantidad de bytes guardados..

mr.blood

Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.

Sa1uDoS

Flamer

Cita de: mr.blood en 12 Abril 2013, 22:05 PM
Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.

Sa1uDoS
la mento desirte pero no son cadenas son posiciones de memoria y lo de delimitar y sobreescribir en ellas creo que no funcionaria pensandolo bien ya que cuando declaro la variable buffer se asigno una sierta posicion de memoria y es la que seba a imprimir ejemplo:
si buffer en piesa de 00401000 y termina en 0040100F y sobre escribe hasta 00401007 y luego manda a imprimir seba a imprimir hasta la ultima posicion que es 0040100F junto con lo que no se sobreescribio o como dise tu si pongo un 0 en la posicion 00401007 y mando a imprimir la variable hasta hay seba a imprimir

saludos flamer y delimitar si se puede pasando lo sobreescribido a otra variable pero seri mas pancho

Nota: en ASM cuando se declara una variable ase referencia a sierta posicion de memoria no son cadenas como en lenguajes de alto nivel y si estoy mal corrijanme y perdonen las falta de ortografia