Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: x64core en 31 Octubre 2011, 19:24 pm



Título: Como crear Memoria Dinamica?
Publicado por: x64core en 31 Octubre 2011, 19:24 pm
bueno tengo esa duda :/
como puedo crear memoria dinamica sin usar apis? :P
es posible? lo normal seria con la virtualAlloc no?
pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por
eso necesitaria crear una variable dinamica porque no sabria si fuera utilizada o no :P
y tambien por la eficiencia ;D
gracias ;D


Título: Re: Como crear Memoria Dinamica?
Publicado por: BlackZeroX en 1 Noviembre 2011, 06:49 am
Ammm se me ocurre ocupar un Array de Bytes y con Redim Preserve y jugar un poco con el puntero de la variable... mira:

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function VarPtrArr Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
  5. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
  6. Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
  7.  
  8. Public Function allocMem(ByVal lSize As Long) As Long
  9. '   //  Retorna la Dirrecion de un SafeArray.
  10. Dim pBuff()     As Byte
  11.    If (lSize <= &H0) Then Exit Function
  12.    ReDim pBuff(0 To (lSize - 1))
  13.    GetMem4 VarPtrArr(pBuff), VarPtr(allocMem)
  14.    PutMem4 VarPtrArr(pBuff), 0
  15. End Function
  16.  
  17. Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
  18. '   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
  19. Dim pBuff()     As Byte
  20.    PutMem4 VarPtrArr(pBuff), lptr
  21.    If not (lSize = &H0) Then
  22.        ReDim Preserve pBuff(0 To (lSize - 1))
  23.    else
  24.        erase pBuff
  25.    end if
  26.    GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
  27.    PutMem4 VarPtrArr(pBuff), 0
  28. End Function
  29.  
  30. Public Function getMemData(ByVal lptr As Long) As Long
  31. '   //  lPtr debe ser el valor (Address) que retorno en allocMem()/reallocMem().
  32. '   //  Esta funcion retorna la Dirrecion de memoria EDITABLE de lPtr (Dirrecion de un SafeArray).
  33. '   //  Referencias.
  34. '   //  http://msdn.microsoft.com/en-us/library/aa908603.aspx
  35.    If (lptr = &H0) Then Exit Function
  36.    GetMem4 (lptr + &HC), VarPtr(getMemData)    '   //  obtenemos pvData
  37. End Function
  38.  
  39. Public Sub releaseMem(ByVal lptr As Long)
  40. '   //  lPtr debe ser la Dirrecion que retorno en allocMem().
  41. Dim pBuff()     As Byte
  42.    PutMem4 VarPtrArr(pBuff), lptr
  43. End Sub
  44.  
  45.  

ejemplo:

Código
  1.  
  2. Private Sub Form_Load()
  3. Dim lptr    As Long
  4. Dim lVal    As Long
  5.    lptr = allocMem(8)
  6.    PutMem4 getMemData(lptr) + 3, 10
  7.    lptr = reallocMem(lptr, 4)
  8.    GetMem4 getMemData(lptr) + 3, VarPtr(lVal)
  9.    Call releaseMem(lptr)
  10.    Debug.Print lVal
  11. End Sub
  12.  
  13.  


Título: Re: Como crear Memoria Dinamica?
Publicado por: BlackZeroX en 1 Noviembre 2011, 06:55 am

pero derepente en una funcion dependiendo de una condicion quiero devolver un puntero a una variable string por


para eso tienes el API SysAllocStringByteLen  pero leete la MSDN por que el puntero lo tienes que liberar.

Dulces Lunas!¡.


Título: Re: Como crear Memoria Dinamica?
Publicado por: x64core en 1 Noviembre 2011, 07:43 am
Gracias BlackZeroX  ;-) siempre me salvas  ;-)
se me habia ocurrido lo de los arrays tambien ;D


Título: Re: Como crear Memoria Dinamica?
Publicado por: Slek Hacker en 3 Noviembre 2011, 21:32 pm
Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)? ¿Para qué sirve exactamente releaseMem?
¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?
Y la función reallocMem, ¿no debería ser así?
Código
  1. Public Function reallocMem(ByVal lptr As Long, ByVal lSize As Long) As Long
  2. '   //  Retorna la Dirrecion de un SafeArray que se retorno en allocMem()/reallocMem().
  3. Dim pBuff()     As Byte
  4.    PutMem4 VarPtrArr(pBuff), lptr
  5.    If (lSize = &H0) Then
  6.        Erase pBuff
  7.    Else
  8.        ReDim Preserve pBuff(0 To (lSize - 1))
  9.    End If
  10.    GetMem4 VarPtrArr(pBuff), VarPtr(reallocMem)
  11.    PutMem4 VarPtrArr(pBuff), 0
  12. End Function

Gracias!


Título: Re: Como crear Memoria Dinamica?
Publicado por: BlackZeroX en 4 Noviembre 2011, 03:26 am
.
Tengo un par de preguntas sobre este tema. A ver, la función reallocMem, ¿la usas para convertir los datos de Long a Integer (osea, de 8 bytes de tamaño a 4)?

long = 4 bytes
integer = 2 bytes

reallocMem solo invoca una redimencion del bloque de memoria es decir hace lo mismo que realloc() de C

¿Para qué sirve exactamente releaseMem?

libera el bloque de memoria. es como free() de C.

¿Por qué sumas +3 a la dirección de memoria editable del SafeArray?

Se reservaron 8 bytes editables allocMem(8).

Entonces getMemData nos retorna el inicio de estos 8 bytes que podemos editar libremente.

00000000

solo me muevo 3 bytes y Pusheo el numero 10 con putmem4() es decir de longitud 4

es decir en estos bytes

00000000

Y la función reallocMem, ¿no debería ser así?

Perdon en lugar de If (lSize = &H0) Then era  If not (lSize = &H0) Then... me falto not...

P.D.: Aqui hay otra forma... con ejemplo a una creacion de String de vb6 con su creacion seteo y liberacion aqui (http://foro.elhacker.net/programacion_visual_basic/mmemory_writeprocessmemoryvbacopybytesrtlmovememory_replacement_noapi-t343343.0.html;msg1680347#msg1680347).

Nota: Estos metodos al parecer son mas recomendables para Malware que para un proyecto profesional... aun nunca esta demas meterle algo dificil para que te llamen a solucionar a ti un problema xP... jejejeje.

Dulces Lunas!¡.


Título: Re: Como crear Memoria Dinamica?
Publicado por: Slek Hacker en 4 Noviembre 2011, 10:54 am
Ok ya lo pillo. Entonces, el +3 ese se podría omitir, y pushear el 10 al principio de los 8 bytes editables no?


Título: Re: Como crear Memoria Dinamica?
Publicado por: BlackZeroX en 4 Noviembre 2011, 11:18 am
si

Dulces Lunas!¡.