Pequeña duda sobre la reserva de memoria al crear un proceso

Iniciado por lessionone, 22 Abril 2012, 11:54 AM

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

lessionone

Hola buenas, tengo unas pequeñas dudas.

¿Yo cuando creo un proceso se le asigna una cantidad de bytes de la memoria ram y una direcion aleatoria en dicha memoria?

De ser lo anterior correcto, ¿El espacio que se le asigna en la memoria es igual a los bytes que tiene el programa el cual a creado el proceso?

Si no me he explicado bien por favor decirmelo e intento explicarme mejor.

Karcrack

El espacio de memoria de un proceso no tiene porque acabar estando en la memoria RAM, sino que también puede acabar en el archivo de paginación.

En ese espacio se mete todo tú ejecutable con las secciones pertinentes y se cargan todas las DLLs que éste necesite. La dirección base donde se coloca el ejecutable está establecida en el PE Header del mismo y puede ser colocado de forma *aleatoria* si está activado el ASLR.

Así pues, respondiendo a tus preguntas:
1- No siempre es en la memoria RAM. No siempre es *aleatoria* la dirección base para la copia.
2- El espacio es mayor.

PD: Todo estos conocimientos los he adquirido en la practica, así que puede que algún detalle se me escape.

Saludos

lessionone

Karcrack un 10, muy bien respondido, pero yo estoy muy verde con el tema de trabajo en memorias y quiero darle practica con el visual para ver como funciona esto.

Se que el archivo de paginacion es el pagefile.sys en windows y se que este es como un archivo de apoyo a la memoria ram intercambiando datos para su carga en la memoria (vamos como la cache ayuda al procesador), pero no nos vamos a meter mas de lleno y pregunto:

1º ¿El archivo de paginacion es lo mismo que la memoria virtual?

2º Si yo llamo a un proceso, por ejemplo, la calculadora de window(calc.exe) y deseo vaciar del espacio que se le a asignado a los datos del ejecutable calc.exe, dll y todo lo que haya en ese espacio asignado. Si no he iniciado el proceso, sino que lo tengo suspendido, ¿Como podria vaciar ese espacio? En un principio mi pregunta es solo como puedo vaciar ese espacio para luego cargar otro codigo.

Esto de trabajar con el formato de los ejecutables y su carga en la memoria creo que es fundamental aprender bien para la creacion de malware

Karcrack

Para compreder la carga de ejecutables on the fly viendo un runPE cualquiera verás que lo primero que hace es desmapear (respondiendo a tu pregunta #2), esto es: vaciar todo el espacio que el cargador de windows había commiteado. Una vez vacío ya empiezas a mapear las zonas de memoria siguiendo lo especificado en el PE Header.

Si te surge cualquier duda ya sabes que para eso estamos ;)

lessionone

ufff, vamos a echarle dos wevos y a ver si aprendo algo.
Dices de que un runpe vacia el espacio que el cargador de windows habia asignado a ese proceso y me he puesto a mirar un runpe en visual.
CallAPI("ntdll", "NtUnmapViewOfSection", Pi.hProcess, Pinh.OptionalHeader.ImageBase)
Desgraciadamente a mi no me enseñaron el uso de Apis y ni idea sobre estas pero a ver si acierto:
1º ntdll: Llama a una libreria llamada ntdll de las que se instalan con el windows.
2º NtUnmapViewOfSection la libreria anterior le dice el espacio que esta cogiendo el servicio y que la vacie(como si fuera una llamada a un sub que se encargara de vaciarla)
3º Pi.hProcess: Un argumento que identifica el proceso
4º Pinh.OptionalHeader.ImageBase: ¿es otro argumento que va a ser un numero?, ¿probablemente la direccion de memoria donde se carga el ejecutable?
Si alguien me manda un manual de apis en español para cogerlo rapido o me lo explica muy sencillo lo que hacen pues mejor que mejor ;)
Me da la sensacion que las apis son como librerias ya creadas, pero call api yo nunca lo he usado, lo maximo es crear una .dll y luego usarlas aunque no me acuerdo en .net como lo hacia, jejeje.
Graciasssss.

Karcrack

Las librerías que contienen la API de Windows vienen en diversos formatos, uno de ellos es con DLLs. Éstas puedes imaginarlas como librerías [de libros] donde cada libro sería una función, con un identificador (título).

En este caso la librería tendría como nombre: "NTDLL". Esta librería se caracteriza por contener las funciones de nivel más inferior accesible desde el modo de usuario. Y el libro, "NtUnmapViewOfSection" es el que contiene el código para vaciar la memoria del proceso.

Lo único que me queda por añadir es que el elemento del PE Header llamado ImageBase contiene la dirección base a partir de la cual se meterán los datos. Y que será utilizado también en algunos de los elementos restantes del PE que tienen direcciones relativas en lugar de absolutas. Como curiosidad añado que algunos ficheros PE contienen información de relocalización (.reloc) que permite realojar el PE en otras direcciones base (ImageBase).

Saludos :)

lessionone

ok, muchas gracias Karcrack.
CallAPI("ntdll", "NtUnmapViewOfSection", pInfo.hProcess, Pinh.OptionalHeader.ImageBase)
'-----------------------------------------------------------------------
Private Function CallAPI(ByVal sLib As String, ByVal sMod As String, ByVal ParamArray Params() As Object) As Integer
        Dim lPtr As Integer
        Dim bvASM(&HEC00 - 1) As Byte
        Dim i As Integer
        Dim lMod As Integer
        lMod = GetProcAddress(LoadLibraryA(sLib), sMod)
End Function


&HEC00 ¿Esto que es? He cambiado el proceso y siempre es 60416, no entiendo por que debe de ser esto, este valor es decimal pero ¿porque 60416?

Karcrack

Es sencillamente un valor constante (0xEC00 -1), usado para crear un buffer lo suficientemente grande para meter todos los argumentos que quieras pasarle al puntero al que llamas.

De nada, para eso estamos ;)