elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 08:30  


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Usar Putmem1 con cadenas?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Usar Putmem1 con cadenas?  (Leído 806 veces)
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Usar Putmem1 con cadenas?
« en: 16 Septiembre 2011, 18:07 »

buenas tengo una duda :P
estoy usando las funciones que vienen internas en vb
estoy con putmem1:

Código
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)


pues estaba haciendo unas pruebas usando copymemory y se me ocurrio esa funcion con cadenas pero noce si eso es posible ya que me da error este codigo:

Código
Dim CADENA          As String
Dim dirCAD          As Long
Dim Valor           As String
 
CADENA = "ABCDEFGH"
Valor = "Z"
dirCAD = StrPtr(CADENA)
 
 
PutMem1 dirCAD + 1, StrPtr(Valor)
 
bueno me lanza error de desbordamiento y creo que es porque en el segundo parametro necesito escribir un valor de un byte y estoy intentando escribir 4 bytes :P y no encuntro la forma correcta de hacer lo que quiero :P
practicamente lo que quiero es insertar la "Z" en el lugar donde esta "B"

con copymemory se hace facil:
y lo logro hacer pero se me ocurrio usar esa funcion o noce si esa funcion solamente trabaja con numero :P ya que con valores numericos ya lo hice y funciono y queria usarla con cadenas

Código
CopyMemory dirCAD + 2, StrPtr(Valor), 1
 

e probado pasando como segundo parametro el valor propio ( que eso es lo que pide el segundo parametro no? , no el puntero al valor) asi:

Código:
PutMem1 dirCAD + 1, Valor ' valor = "Z"
pero igual me lanza error de tipo y es logico
y tambien pense que era porque necesitaa dos bytes ( "Z" + "\0" )
y use putmem2 pero tampoco
bueno en si como se hace correctamente? ;D o definitivamente esas funciones no trabajan con cadenas ?
gracias




En línea
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #1 en: 16 Septiembre 2011, 21:07 »

Te dejo una tabla de equivalencias.
Código:
PutMem1 - Byte  - 1 Byte  - Byte
PutMem2 - Word  - 2 Bytes - Integer
PutMem4 - DWord - 4 Bytes - Long
PutMem8 - QWord - 8 Bytes - Currency

DoEvents! :P


« Última modificación: 17 Septiembre 2011, 00:41 por Psyke1 » En línea

cobein


Desconectado Desconectado

Mensajes: 753



Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #2 en: 16 Septiembre 2011, 22:41 »

Dos acalaraciones, primero los strings son unicode en memoria asi que strptr es el inicio y de ahi en mas la posicion es caracter * 2, el segundo parametro en este caso (asc("Z")) es el byte que vas a poner en la memoria.

Código:
   Dim CADENA          As String
    Dim dirCAD          As Long
    Dim Valor           As String
 
CADENA = "ABCDEFGH"
Valor = "Z"
dirCAD = StrPtr(CADENA)
 
 
PutMem1 dirCAD + 2, Asc("Z")
Debug.Print CADENA
« Última modificación: 16 Septiembre 2011, 22:45 por cobein » En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #3 en: 16 Septiembre 2011, 23:36 »

.
Cada caracter esta separado por un byte NULO o con valor 0... por ello es mejor usar PutMem2 pero igual y solo quieres hacer alguna otra cosa...

Código
 
Option Explicit
 
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)
Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
 
Private Sub Form_Load()
Dim sStr            As String
Const NAME          As String = "Miguel Angel"
Const CARACTER      As Long = &H2               '   //  Posicion del caracter a leer.
Dim bChar           As Byte
 
   sStr = "ABCDEFGH"
 
   MsgBox sStr
   GetMem1 (StrPtr(NAME) + ((CARACTER * 2) - 2)), VarPtr(bChar) '   //  Leemos un Byte...
   PutMem1 (StrPtr(sStr) + 2), bChar         '   //  Escribimos el byte en la posicion de "B"
   MsgBox sStr
End Sub
 
 

@Psyke1

Si usas SysAllocStringLen deberas liberar la memoria con SysFreeString.

Dulces Lunas!¡.
« Última modificación: 17 Septiembre 2011, 00:06 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #4 en: 17 Septiembre 2011, 00:35 »

@BlackZero
Entonces por esa regla de tres... ¿después de usar Copymemory() deberíamos usar GlobalUnlock() y GlobalFree()? :huh:

DoEvents! :P
« Última modificación: 17 Septiembre 2011, 00:39 por Psyke1 » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #5 en: 17 Septiembre 2011, 00:42 »

.
CopyMemory en ningun momento reserva memoria... solo copia un bloque de bytes a otro bloque...

Citando la MSDN de la API SysAllocStringLen

Citar

If pch is NULL, a string of the requested length is allocated, but not initialized. The pch string can contain embedded null characters and does not need to end with a NULL. Free the returned string later with SysFreeString.


Nota: MSDN.

P.D.: esta discusion tiene cita a una respuesta que Psyke1 ha borrado...

Dulces Lunas!¡.
« Última modificación: 17 Septiembre 2011, 00:48 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #6 en: 17 Septiembre 2011, 00:43 »

Ook, muchas gracias, ahora entiendo... ;)

DoEvents! :P
En línea

RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: Usar Putmem1 con cadenas?
« Respuesta #7 en: 17 Septiembre 2011, 18:18 »

Dos acalaraciones, primero los strings son unicode en memoria asi que strptr es el inicio y de ahi en mas la posicion es caracter * 2, el segundo parametro en este caso (asc("Z")) es el byte que vas a poner en la memoria.

Código:
    Dim CADENA          As String
    Dim dirCAD          As Long
    Dim Valor           As String
 
CADENA = "ABCDEFGH"
Valor = "Z"
dirCAD = StrPtr(CADENA)
 
 
PutMem1 dirCAD + 2, Asc("Z")
Debug.Print CADENA

gracias cobein analizando el codigo que pasa con el otro byte? en la funcion asc("Z") el tamaño es de un byte no? el numero que devuelve no es mayor que 255 :P por eso tengo esa duda


.
Cada caracter esta separado por un byte NULO o con valor 0... por ello es mejor usar PutMem2 pero igual y solo quieres hacer alguna otra cosa...

Código
 
Option Explicit
 
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)
Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
 
Private Sub Form_Load()
Dim sStr            As String
Const NAME          As String = "Miguel Angel"
Const CARACTER      As Long = &H2               '   //  Posicion del caracter a leer.
Dim bChar           As Byte
 
   sStr = "ABCDEFGH"
 
   MsgBox sStr
   GetMem1 (StrPtr(NAME) + ((CARACTER * 2) - 2)), VarPtr(bChar) '   //  Leemos un Byte...
   PutMem1 (StrPtr(sStr) + 2), bChar         '   //  Escribimos el byte en la posicion de "B"
   MsgBox sStr
End Sub
 
 

@Psyke1

Si usas SysAllocStringLen deberas liberar la memoria con SysFreeString.

Dulces Lunas!¡.


gracias BlackZeroX tengo una duda segun lo que dices, e leido que las cadenas para las api se almacenan en formato LPSTR
entonces es asi:

       |H|O|L|A|/0|

entonces lo que dices que cada caracter al final tiene un caracter nulo :P no es lo mismo que LPSTR ya que el caracter nulo lo lleva al final de la cadena
mas lo que dice cobein que los caracteres se almacenan en memoria en formato Unicode que creo que son 2 bytes
y entonces seria mas otro byte del caracter nulo? osea 3 byte :P no entiendo
o se me ocurre que el caracter nullo no requiere de ningun byte? o si verdad :P ?

En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #8 en: 17 Septiembre 2011, 22:07 »

.
Revisa este codigo... te lo acabe de hacer solo para que veas como es una String Unicode en vb6...

En los primeros 4 bytes se almacen la longitud en BYTES de la cadena... despues se empiesan por poner los numeros en ascii de cada letra, separados por el ascii 0 o byte 0, y tengo entendido que la cadena termina con 2 bytes 0 en esto ultimo me puedo equivocar pero no lo creo ya que de lo contrario el api lstrlenW (corrijanme por favor ya que no recuerdo su nombre esactamente), no sabria hasta donde termina dicha cadena en Unicode...

El tipo de string es:  CWSTR

Código
 
Option Explicit
 
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
 
Private Sub Form_Load()
Dim bStrUnicode(17)     As Byte     '   //  4 bytes (Longitud), Num Caracteres * 2, 2 bytes 0
                                   '   //  (4 + (6*2) + 2) = 18 es decir 0 - 17 dimensiones...
Dim i                   As Long
Dim pStr                As String
Dim lpStrBack           As Long
 
   '   //  Primeros 4 bytes...
   PutMem4 ByVal VarPtr(bStrUnicode(0)), 12
   i = &H4
   '   //  Bytes de los caracteres + su separador...
   bStrUnicode(i) = Asc("M"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("i"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("g"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("u"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("e"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("l"): bStrUnicode(i + 1) = 0: i = i + &H2
   '   //  Ultimos 2 bytes infdican el final de la cadena Unicode...
   bStrUnicode(i) = 0: bStrUnicode(i + 1) = 0          '   //  Bytes a mi parecer Obligatorios... corrijanme
   
   pStr = "BlackZeroX"
   GetMem4 ByVal VarPtr(pStr), VarPtr(lpStrBack)       '   //  Repaldo del puntero al bloque...
   MsgBox pStr
   PutMem4 ByVal VarPtr(pStr), VarPtr(bStrUnicode(4))  '   //  Apuntamos al indice 4 de bStrUnicode
   MsgBox pStr
   PutMem4 ByVal VarPtr(pStr), lpStrBack               '   //  Restauramos... es obligatorio o causaria un crash...
   MsgBox pStr
 
End Sub
 
 

en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.

Código
 
Type CWStr
   lLn         As Long     '   // 12. Deben ser igual a la longitud en bytes de bData... (6 * 2)
   bData(11)   As Byte     '   // Miguel; Estas dimenciones dependen de la longitud de la cadena. en este caso es de longitud (6 * 2).
   iEnd        As Integer  '   // Se iguala a 0 para setear el termino de la cadena. integer = 2 bytes...
End Type
 
 

Temibles Lunas!¡.
« Última modificación: 17 Septiembre 2011, 23:10 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #9 en: 17 Septiembre 2011, 23:13 »

entonces lo que dices que cada caracter al final tiene un caracter nulo :P no es lo mismo que LPSTR ya que el caracter nulo lo lleva al final de la cadena
mas lo que dice cobein que los caracteres se almacenan en memoria en formato Unicode que creo que son 2 bytes
y entonces seria mas otro byte del caracter nulo? osea 3 byte :P no entiendo
o se me ocurre que el caracter nullo no requiere de ningun byte? o si verdad :P ?

1ro:  LPSTR    es una Definicion/Alias de un puntero a una cadena ANSI de PSTR.

2do:
.
Cada caracter esta separado por un byte NULO o con valor 0...


Aun que al final la cadena termina en 2 bytes 0... guiandome en el Alias LPWSTR.
Aun que el tipo correcto de las strings es BSTR.

Dulces Lunas!¡.
« Última modificación: 17 Septiembre 2011, 23:23 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: Usar Putmem1 con cadenas?
« Respuesta #10 en: 17 Septiembre 2011, 23:40 »

.
Revisa este codigo... te lo acabe de hacer solo para que veas como es una String Unicode en vb6...

En los primeros 4 bytes se almacen la longitud en BYTES de la cadena... despues se empiesan por poner los numeros en ascii de cada letra, separados por el ascii 0 o byte 0, y tengo entendido que la cadena termina con 2 bytes 0 en esto ultimo me puedo equivocar pero no lo creo ya que de lo contrario el api lstrlenW (corrijanme por favor ya que no recuerdo su nombre esactamente), no sabria hasta donde termina dicha cadena en Unicode...

El tipo de string es:  CWSTR

Código
 
Option Explicit
 
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
 
Private Sub Form_Load()
Dim bStrUnicode(17)     As Byte     '   //  4 bytes (Longitud), Num Caracteres * 2, 2 bytes 0
                                   '   //  (4 + (6*2) + 2) = 18 es decir 0 - 17 dimensiones...
Dim i                   As Long
Dim pStr                As String
Dim lpStrBack           As Long
 
   '   //  Primeros 4 bytes...
   PutMem4 ByVal VarPtr(bStrUnicode(0)), 12
   i = &H4
   '   //  Bytes de los caracteres + su separador...
   bStrUnicode(i) = Asc("M"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("i"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("g"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("u"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("e"): bStrUnicode(i + 1) = 0: i = i + &H2
   bStrUnicode(i) = Asc("l"): bStrUnicode(i + 1) = 0: i = i + &H2
   '   //  Ultimos 2 bytes infdican el final de la cadena Unicode...
   bStrUnicode(i) = 0: bStrUnicode(i + 1) = 0          '   //  Bytes a mi parecer Obligatorios... corrijanme
   
   pStr = "BlackZeroX"
   GetMem4 ByVal VarPtr(pStr), VarPtr(lpStrBack)       '   //  Repaldo del puntero al bloque...
   MsgBox pStr
   PutMem4 ByVal VarPtr(pStr), VarPtr(bStrUnicode(4))  '   //  Apuntamos al indice 4 de bStrUnicode
   MsgBox pStr
   PutMem4 ByVal VarPtr(pStr), lpStrBack               '   //  Restauramos... es obligatorio o causaria un crash...
   MsgBox pStr
 
End Sub
 
 

en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.

Código
 
Type CWStr
   lLn         As Long     '   // 12. Deben ser igual a la longitud en bytes de bData... (6 * 2)
   bData(11)   As Byte     '   // Miguel; Estas dimenciones dependen de la longitud de la cadena. en este caso es de longitud (6 * 2).
   iEnd        As Integer  '   // Se iguala a 0 para setear el termino de la cadena. integer = 2 bytes...
End Type
 
 

Temibles Lunas!¡.


gracias tio entendi la estructura de las cadenas muy buenos tus codigos aunq al veces me cuesta entenderlos pero los explicas bien ;D
y pues segun que en cada caracter termina con un byte en 0 eso sucede porque el caracter es ascii no?
si fuera algun caracter unicode como una letra japonesa utilizara ese byte no? y el caracter ya no tuviera byte con un 0... ?


1ro:  LPSTR    es una Definicion/Alias de un puntero a una cadena ANSI de PSTR.

2do:
Aun que al final la cadena termina en 2 bytes 0... guiandome en el Alias LPWSTR.
Aun que el tipo correcto de las strings es BSTR.

Dulces Lunas!¡.

EDIT:
estaba incorrecto  ;D
« Última modificación: 18 Septiembre 2011, 00:09 por Raul100 » En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: Usar Putmem1 con cadenas?
« Respuesta #11 en: 18 Septiembre 2011, 02:45 »

y pues segun que en cada caracter termina con un byte en 0 eso sucede porque el caracter es ascii no?
si fuera algun caracter unicode como una letra japonesa utilizara ese byte no? y el caracter ya no tuviera byte con un 0... ?

Supongo que si la vdd nunca e usado esos caracteres al 100% ya que no tengo la necesidad... a mi esta estructura en un uso rapido me sirven para manejar rapidamente un split() por caracter... en un array de tipos integer...

Asi como lo hacen en este post... en la funcion IsHour_Psyke12.


Dulces Lunas!¡.
« Última modificación: 18 Septiembre 2011, 03:04 por BlackZeroX▓▓▒▒░░ » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
RHL


Desconectado Desconectado

Mensajes: 968


mental


Ver Perfil
Re: Usar Putmem1 con cadenas?
« Respuesta #12 en: 18 Septiembre 2011, 02:47 »

Gracias ;D
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cadenas...
Programación Visual Basic
Rey11 3 573 Último mensaje 30 Diciembre 2005, 22:13
por Rey11
usar no-ip con conexion wireless para usar p.ivy
Hacking Básico
NeXuS^^ 5 2,932 Último mensaje 25 Diciembre 2008, 12:19
por darkirax
al usar spoonwpa como hacer para usar dicionario propio?
Wireless en Linux
iuserp562 0 1,388 Último mensaje 3 Enero 2010, 22:18
por iuserp562
Comparar cadenas sin usar strcmp
Programación C/C++
Rockmore 12 2,624 Último mensaje 25 Octubre 2010, 07:01
por do-while
[VB+ASM][SRC] PUTMEMx - PUTMEM1,2,4,8,... [ASM inline]
Programación Visual Basic
RHL 2 536 Último mensaje 10 Diciembre 2011, 23:45
por RHL
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines