Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - SEL1

#1
Citar
El campo PE sí que es un DWORD, pero la cadena PE es un WORD es toda regla, ocupa 2 bytes, por tanto no es un error.

La documentación especifica que es un DWORD "PE\0\0" por lo tanto deberías atenerte a lo que dicen los documentos. El otro WORD que no checkeas podría contener cualquier cosa.

Citar
No coloco ningún SEH porque generalmente eso se hacía cuando buscabas la base de kernel32.dll en memoria por el método tradicional, viendo la dirección que pusheo el sistema operativo en la pila para retornar a ella y a partir de ahí retrocediendo hasta encontrar el campo MZ, pero en este caso por cortesía de The Swash uso otro método, de forma que no accedo a memoria que no tenga permisos de lectura.

Pongamoslo así... para comenzar... cuando abrís el archivo y tomas e_lfanew, si el campo contiene un valor invalido que sobrepase el tamaño del mapa: estas muerto.

#2
A muy simple vista el codigo tiene muchos bugs, por ejemplo, la marca "PE" no es un WORD es un DWORD. El codigo no usa SEH, y si lo usara en archivos infectados igual caeria porque no soporta NO_SEH ni SafeSEH...

Otra cosa muy extraña es que buscaste la ultima sección mas "alta" haciendo un loop cuando pudiste hacer ((NumberOfSections-1) * sizeof IMAGE_SECTION_HEADER)) y desde IMAGE_NT_HEADERS ir hasta la ultima sección sin ningun loop. Lo otro es que una sección alta en memoria puede estar antes que una mas baja... con algunos trucos. ;) Tampoco necesitabas alinear SizeOfImage, solamente tomar la nueva y alineada VirtualSize y sumarla a la VirtualAddress de la ultima sección.

Luego vere bien el codigo.
#3
Interesante uso de XLAT... aunque los procesadores siguen soportando la instruction, y es rara vez utilizada (por lo menos ahora los compiladores ya no la generan). :)