[solucionado] Problema con PEB

Iniciado por cuentanegra1990, 14 Julio 2015, 16:25 PM

0 Miembros y 2 Visitantes están viendo este tema.

cuentanegra1990

#10
Te pido disculpas Eternal Idol enserio si te ha ofendido, pensé que al ser ensamblador podríais ayudarme.

Veras en el ejemplo que pongo en ensamblador hace uso de la lista InMemoryOrderModuleList(en el fondo me da igual utilizar esa u otra lista), esta si que tiene la dirección base en el desplazamiento de 0x010 de la tabla _LDR_DATA_TABLE_ENTRY, pero mi problema no es eso si no como enlazar la lista InMemoryOrderModuleList con la tabla _LDR_DATA_TABLE_ENTRY por medio de Flink.

Yo lo he llevado a la practica y veo que al realizar el desplazamiento que pongo ya estaría en la primera entrada si saber por que se hace uso de Flink.

pd: Como digo me da igual la lista que seleccione lo único que necesito que me digáis es si lo estoy haciendo bien ya que mi experiencia en dicha practica me lleva a pensar que al seleccionar la una lista ya me llevaría a la primera entrada ya que la lista es del tipo LIST_ENTRY y esta en su desplazamiento de 0 ya estaría apuntando directamente a _LDR_DATA_TABLE_ENTRY.

mov ebx, [ ebx + 0x14 ]    // get PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)         -----Aquí-----

En esa linea se hace un desplazamiento de 0x14 la cual selecciona la lista InMemoryOrderModuleList...Por que en el comentario pone que hace uso de Flink? y ademas dice que ya esta en la primera entrada(_LDR_DATA_TABLE_ENTRY)?

Mi problema es el uso de Flink, que como digo no se especifica en ningún lado.

Espero que se me haya entendido, por que de verdad no se si me explico bien o hago llegar a entender lo que pretendo explicar.


Eternal Idol

Lee de nuevo y prestando atencion en lugar de escribir tanto.

Esto que pusiste antes esta bien hasta la ultima instruccion:
Código (asm) [Seleccionar]
   xor ebx, ebx               // clear ebx
   mov ebx, fs:[ 0x30 ]       // get a pointer to the PEB
   mov ebx, [ ebx + 0x0C ]    // get PEB->Ldr
   mov ebx, [ ebx + 0x14 ]    // get PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)         -----Aquí-----
   mov ebx, [ ebx ]           // get the next entry (2nd entry)
   mov ebx, [ ebx ]           // get the next entry (3rd entry)
   mov ebx, [ ebx + 0x10 ]    // get the 3rd entries base address (kernel32.dll)


Ya te dije la razon en mi anterior mensaje, no necesitas preguntar mas nada sinceramente, tenes el codigo funcionando si solucionas ese error.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

#12
Ami si que me da la dirección de kernel32 ya que esta en la tercera entrada:

1ª Entrada = proceso
2ª Entrada = ntdll
3ª Entrada = kernel32

Haciendo uso de la lista InMemoryOrderModuleList si que me pone en ebx la direccion de kernel32.dll

mov ebx, [ ebx + 0x10 ]    // get the 3rd entries base address (kernel32.dll)

0:000> dt nt!_LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
  +0x000 InMemoryOrderLinks : _LIST_ENTRY
  +0x008 InInitializationOrderLinks : _LIST_ENTRY
  +0x010 DllBase          : Ptr32 Void
  +0x014 EntryPoint       : Ptr32 Void
  +0x018 SizeOfImage      : Uint4B
  +0x01C FullDllName      : _UNICODE_STRING
  +0x024 BaseDllName      : _UNICODE_STRING


Pero como digo la direccion de kernel32 la obtengo pero no contento con eso quiero saber como se obtenia y mi duda es la lina esta ya que me confunde su comentario.

mov ebx, [ ebx + 0x14 ]    // get PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)

Si con el desplazamiento 0x14 únicamente me selecciona la lista, por que ya esta en la primera entrada haciendo uso de Flink?

Eternal Idol

Es el primer campo de la estructura  :rolleyes: No se que pretendes que haya ahi a excepcion de un FLink.

0:000> dt nt!_LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
   +0x000 InMemoryOrderLinks : _LIST_ENTRY

0:000> dt ntdll!_LIST_ENTRY
   +0x000 Flink            : Ptr32 _LIST_ENTRY
   +0x004 Blink            : Ptr32 _LIST_ENTRY
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

#14
Eternal Idol lo que necesito es una confirmación mas que nada,

Las 3 listas doblemente enlazadas son del tipo LIST_ENTRY y como tal estructura es como bien dices:

0:000> dt ntdll!_LIST_ENTRY
  +0x000 Flink            : Ptr32 _LIST_ENTRY
  +0x004 Blink            : Ptr32 _LIST_ENTRY

Que al seleccionar una de las listas ya estaría apuntando a _LDR_DATA_TABLE_ENTRY por que su desplazamiento es de +0x000?

Eso es lo único que necesito saber ya que de ser así ya encontraría sentido al comentario este:

mov ebx, [ ebx + 0x14 ]   // get PEB->Ldr.InMemoryOrderModuleList.Flink (1st entry)

Al hacer el desplazamiento de 0x14 por que esta haciendo un Flink? y como que llega a _LDR_DATA_TABLE_ENTRY?

Dios que mal me explico :-\

Eternal Idol

#15
No se cuantas veces habra que dartela. ES ASI, SI.

Cita de: cuentanegra1990 en 20 Julio 2015, 10:11 AM
Al hacer el desplazamiento de 0x14 por que esta haciendo un Flink? y como que llega a _LDR_DATA_TABLE_ENTRY?

Dios que mal me explico :-\

0:000> dt ntdll!_PEB_LDR_DATA
  +0x000 Length           : Uint4B
  +0x004 Initialized      : UChar
  +0x008 SsHandle         : Ptr32 Void
  +0x00c InLoadOrderModuleList : _LIST_ENTRY
  +0x014 InMemoryOrderModuleList : _LIST_ENTRY
  +0x01c InInitializationOrderModuleList : _LIST_ENTRY
  +0x024 EntryInProgress  : Ptr32 Void
  +0x028 ShutdownInProgress : UChar
  +0x02c ShutdownThreadId : Ptr32 Void

Las benditas listas son LIST_ENTRY ... ahora mira la definicion de LIST_ENTRY y si seguis sin entenderlo creo que no hay solucion posible.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

Era lo que me suponía, por cierto yo tras obtener la dirección del modulo kernel32 y ponerla en el registro ebx, si imprimo esa dirección junto a la que me devuelve la función GetModuleHandleA() observo que la misma dirección.

Eternal Idol

Cita de: cuentanegra1990 en 20 Julio 2015, 10:23 AM
Era lo que me suponía, por cierto yo tras obtener la dirección del modulo kernel32 y ponerla en el registro ebx, si imprimo esa dirección junto a la que me devuelve la función GetModuleHandleA() observo que la misma dirección.

Magia.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cuentanegra1990

Pues la gran duda que tenia ya me la has resuelto al decirme que mi suposiciones eran correctas.

Podemos dar el tema como correcto, gracias Eternal Idol!

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón