elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Duda sobre valores de la memoria!!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre valores de la memoria!!!  (Leído 10,871 veces)
WILMER5

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Duda sobre valores de la memoria!!!
« en: 7 Septiembre 2008, 19:04 pm »

Holas amigo estoy haciendo un pequeño programa en visual bsic 6.0 donde quiero modificar valores de la memoria en tiempo de ejecución, por ejemplo el programa selecciona un proceso y en una direccion de memoria leer y guardar valores, soy un poco novato en esto pero ya he avanzado un poco... para valores de 1,2 y 4 byte ya lo se hacer de esta manera:

Esta es la funcion que uso para leer valores y me funciona perfecto

Public Function ReadLong(Offset As Long, ProcessID As Long) As Long
Dim ProcessHandle As Long
Dim Value As Long
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
If ProcessHandle = 0 Then
MsgBox "No se encuentra el proceso", vbCritical, "Error de Lectura"
Exit Function
End If
ReadProcessMem ProcessHandle, Offset, Value, 4, 0&
ReadLong = Value
CloseHandle ProcessHandle
End Function


Esta es la funcion que uso para escribir valores.

Public Function WriteLong(Offset As Long, ProcessID As Long, Value As Long) As Boolean

Dim ProcessHandle As Long
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
If ProcessHandle = 0 Then
MsgBox "No se encuentra el proceso", vbCritical, "Error de Lectura"
Exit Function
End If
WriteProcessMemory ProcessHandle, Offset, Value, 4, 0&
CloseHandle ProcessHandle
End Function


ahora lo que me gustaria saber es como leer y guardar valores de Array de Byte

Por ejemplo:

en la dirección de memoria &H353BD7C0 guardar los siguientes valores, esto es un array de 96 bytes...

28 79 3D 35 00 00 00 00 2C 79 3D 35 00 00 00 00 48 BB 3B 35 01 00 00 00 4C 79 3D 35 01 00 00 00 DC 75 2F 35 58 93 2D 35 A4 04 00 00 F8 BE 3B 35 70 A3 0F 35 C0 A0 0F 35 D0 A0 0F 35 E0 A0 0F 35 00 A1 0F 35 10 A1 0F 35 20 A1 0F 35 F0 A0 0F 35 01 00 00 00 FF FF FF FF 30 A6 0F 35 58 93 2D 35

Acotación: Cada bloque de memoria tiene 16 posiciones, para 4 posiciones ya lo se modificar con la funcion que puse. de todos modos adjunto una imagen de referencia para explicarme mejor.



Muchas Gracias por leer mi pregunta espero que puedan ayudarme!!!

En línea

...........

Desconectado Desconectado

Mensajes: 281


Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #1 en: 8 Septiembre 2008, 00:29 am »

http://msdn.microsoft.com/en-us/library/ms681674.aspx
Entre los parámetros de esa función tienes:

lpBuffer

    Puntero al buffer que contiene los datos que se van a escribir.

nSize

    Número de bytes que se van a escribir.

Pues simplemente especifica el número de bytes que quieras. En tu ejemplo tienes 4, pues cambia ese 4 por un 96, y en "Value" debes tener esos 96 bytes como un array.

Igual no entiendo muy bien tu pregunta, porque me extraña que no lo hayas visto por ti mismo.
En línea

WILMER5

Desconectado Desconectado

Mensajes: 14


Ver Perfil
ya lo habia intentado...
« Respuesta #2 en: 8 Septiembre 2008, 02:46 am »

ya lo habia intentando el igual no funciona, la funcion es solo para leer y escribir solo 4 bytes, y no hallo la manera de que me lea los 16 que quiero, como explique en el tema, con la funcion solo leo y modifico 4 bytes, pero cada bloque de memoria tiene 16 bytes, para poder escribir el array de bytes se necesita ocupar 6 bloques de memoria de 16 bytes cada uno, al poder modificar uno me imagino yo que lo demas seria mas facil, pero ay es donde esta mi duda, como hacer para que lea y escriba los 16 bytes de cada bloque de memoria!!!

De todos modos Gracias por responder,
En línea

...........

Desconectado Desconectado

Mensajes: 281


Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #3 en: 8 Septiembre 2008, 18:10 pm »

No sé de donde has sacado la conclusión de que la memoria se divide en bloque de 16 bytes, pero no es así. Los dump de memoria como el de la imagen de Olly suelen tener 16 bytes en cada línea por ser una forma conveniente de mostarlo, pero nada más. Esas APIs leen/escriben cualquier número de bytes en la memoria del proceso, siempre y cuando dicho segmento tenga los permisos adecuados.
En línea

byebye


Desconectado Desconectado

Mensajes: 5.093



Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #4 en: 8 Septiembre 2008, 21:03 pm »

aparte que en "value" no  almacenaras 16 bytes.
En línea

WILMER5

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #5 en: 8 Septiembre 2008, 21:32 pm »

No sé de donde has sacado la conclusión de que la memoria se divide en bloque de 16 bytes, pero no es así. Los dump de memoria como el de la imagen de Olly suelen tener 16 bytes en cada línea por ser una forma conveniente de mostarlo, pero nada más. Esas APIs leen/escriben cualquier número de bytes en la memoria del proceso, siempre y cuando dicho segmento tenga los permisos adecuados.

digo que se divide en 16 byte porque asi me lo muestra el programa, en el post creo que aclare que soy novato en esto, y que el avance que tuve fue de modificar solo 4 byte los primero cuatro, como cada linea tiene 16, me imagine que al poder leer y escribir los 16 bytes de esa direccion de memoria, pordria hacer lo mismo con las otras!!!

en la funcion que coloque dice que lleen 4 byte pero al colocar 16 me muestra error!!! ademas cuando colo un valor mayor a 4, por ejemplo 5,6,7,8 me muestra el mismo valor como si colocara 4... y ay es donde esta mi mayor duda, si alguien ya lo ha hecho o tiene alguna funcion de ejemplo espero que por favor la publique o me guie a realizarla, ojo: no estoy pidiendo a nadie que me haga nada solo un poco de ayuda a gente con experiencia en esto para poder hacer la cosas!!!!
En línea

byebye


Desconectado Desconectado

Mensajes: 5.093



Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #6 en: 8 Septiembre 2008, 23:04 pm »

esq como te digo la variable value es de tipo long, ahi no almacenaras 16 bytes.

mirate bien los tipos de datos.
En línea

WILMER5

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #7 en: 8 Septiembre 2008, 23:25 pm »

esq como te digo la variable value es de tipo long, ahi no almacenaras 16 bytes.

mirate bien los tipos de datos.

tambien probe cambiando las declaraciones de las funciones y de las variables y
tampoco me funciono, me sigue leyendo como maximo 4 bytes.!!!
En línea

...........

Desconectado Desconectado

Mensajes: 281


Ver Perfil
Re: Duda sobre valores de la memoria!!!
« Respuesta #8 en: 9 Septiembre 2008, 06:04 am »

Estuve jugando un poquito y vi que VB almacena los elementos de un array de forma peculiar:
http://www.codeguru.com/vb/gen/vb_misc/algorithms/article.php/c7495

Entonces, para obtener un puntero al primer elemento de un array de bytes, tienes que usar: VarPtr(MiArray(0)).

"Value" sí es un Long, ya que es un puntero al inicio del array.

He hecho un miniprograma que escribe 5 bytes en la dirección 403000 del propio proceso (inicio del segmento de datos):

EL VISUAL BASIC SE CIERRA AL EJECUTARLO, NI IDEA PORQUÉ,  PERO EL PROGRAMA FUNCIONA PERFECTAMENTE

Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
----------------------------------------------------------------------------------------------

Private Function WriteMemory(ByVal Offset As Long, ByVal ProcessID As Long, ByVal Value As Long, ByVal NumBytes As Long) As Boolean

Const PROCESS_VM_OPERATION As Long = &H8
Const PROCESS_VM_WRITE As Long = &H20

Dim ProcessHandle As Long
ProcessHandle = OpenProcess(PROCESS_VM_WRITE Or PROCESS_VM_OPERATION, False, ProcessID)

If ProcessHandle = 0 Then
    MsgBox "No se encuentra el proceso", vbCritical, "Error de Lectura"
    Exit Function
End If

Dim exito As Boolean
exito = WriteProcessMemory(ProcessHandle, Offset, Value, NumBytes, 0)

CloseHandle (ProcessHandle)

WriteMemory = exito

End Function

---------------------------------------------------------------------------------------------

Private Sub Form_Load()

Dim MiArray(4) As Byte
MiArray(0) = &H11
MiArray(1) = &H22
MiArray(2) = &H33
MiArray(3) = &H44
MiArray(4) = &H55

Dim exito As Boolean
exito = WriteMemory(&H403000, GetCurrentProcessId(), VarPtr(MiArray(0)), 5)

End Sub





.
.
.
.
.
.

Si ahora queremos leer esos mismos 5 bytes:


Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
--------------------------------------------------------------------
Private Function ReadMemory(ByVal Offset As Long, ByVal ProcessID As Long, ByVal NumBytes As Long) As Byte()

Dim ProcessHandle As Long
Dim Value As Long
Dim ArrayLeer() As Byte
ReDim ArrayLeer(NumBytes)
Value = VarPtr(ArrayLeer(0))
Const PROCESS_VM_READ As Long = &H10

ProcessHandle = OpenProcess(PROCESS_VM_READ, False, ProcessID)

Dim exito As Boolean
exito = ReadProcessMemory(ProcessHandle, Offset, Value, NumBytes, 0)

CloseHandle ProcessHandle

ReadMemory = ArrayLeer

End Function
---------------------------------------------------------------------------
Dim leer() As Byte
leer = ReadMemory(&H403000, GetCurrentProcessId(), 5)

Dim i As Long
Dim texto As String
For i = 0 To 4
   texto = texto & Hex(leer(i))
Next
MsgBox (texto)




« Última modificación: 9 Septiembre 2008, 07:52 am por susanalic » En línea

WILMER5

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Eternamente agradecido!!!
« Respuesta #9 en: 9 Septiembre 2008, 21:32 pm »

Susalic estoy eternamente agradecido contigo, muchas gracias por ayudarme, lo probe y me funciona a la perfección, no solo para 5 bytes sino para los que quiera... me quito el sombrero ante ti, y una vez más Gracias!!!
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre memoria Ram « 1 2 3 »
Hardware
~ Ghost_Networks ~ 20 11,091 Último mensaje 25 Diciembre 2010, 11:13 am
por VILLANO
Duda sobre un metodo que devuelva tres valores random « 1 2 »
Java
Dyabel03 12 10,137 Último mensaje 13 Marzo 2011, 07:53 am
por .mokk.
Tomar valores hex de memoria con OllyScript??
Ingeniería Inversa
.:UND3R:. 4 3,622 Último mensaje 15 Noviembre 2011, 19:06 pm
por MCKSys Argentina
Duda sobre C
Programación C/C++
JPS 4 4,007 Último mensaje 8 Febrero 2018, 15:59 pm
por dijsktra
Duda sobre nodos y uso de memoria
Programación C/C++
Pedro122h 3 2,692 Último mensaje 10 Marzo 2022, 23:55 pm
por Pedro122h
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines