Título: Duda con sección (VirtualFree) Publicado por: .:UND3R:. en 1 Octubre 2011, 19:14 pm Hola a todos, estoy intentando desempaquetar un programa, este tiene antidump,tengo la siguiente duda.
si voy a la Memoria del programa dumpeado veo lo siguiente: Citar Memory map Address Size Owner Section Contains Type Access Initial Mapped as 00010000 00001000 Priv RW RW 00020000 00001000 Priv RW RW 0012C000 00001000 Priv RW Guar RW 0012D000 00003000 stack of mai Priv RW Guar RW 00130000 00003000 Map R R 00140000 00001000 Priv RWE RWE 00150000 00006000 Priv RW RW 00250000 00006000 Priv RW RW 00260000 00003000 Map RW RW 00270000 00016000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls 00290000 00041000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\locale.nls 002E0000 00041000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls 00330000 00006000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls 00340000 00041000 Map R R 00390000 00001000 Priv RW RW 003A0000 00001000 Priv RW RW 003B0000 00004000 Priv RW RW si veo el programa empaquetado veo lo siguiente: Citar Memory map Address Size Owner Section Contains Type Access Initial Mapped as 00010000 00001000 Priv RW RW 00020000 00001000 Priv RW RW 0012C000 00001000 Priv RW Guar RW 0012D000 00003000 stack of mai Priv RW Guar RW 00130000 00003000 Map R R 00140000 00001000 Priv RWE RWE 00150000 0000A000 Priv RW RW 00250000 00006000 Priv RW RW 00260000 00003000 Map RW RW 00270000 00016000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls 00290000 00041000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\locale.nls 002E0000 00041000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls 00330000 00006000 Map R R \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls 00340000 00041000 Map R R 00390000 00001000 Priv RW RW 003A0000 00001000 Priv RW RW 003B0000 00005000 Priv RW RW el problema surge que el dumpeado intenta acceder al address: 00157E78 que lógicamente no está en el dumpeado, por lo que investigando debo liberar tal sección en la memoria con VirtualFree y luego con VirtualAlloc crearla nuevamente pero con el size correspondiente, luego de eso injertar lo que falta, el problema es que se cita lo siguiente: Citar en mi maquina la sección del antidump empieza en 150000 y alli el sistema creo un heap y tiene valores necesarios para correr el programa si solo borramos y copiamos lo del antidump no correra Citar The VirtualFree function releases or decommits (or both) a region of pages within the virtual address space of the calling process. BOOL VirtualFree( LPVOID lpAddress, // address of region of committed pages DWORD dwSize, // size of region DWORD dwFreeType // type of free operation ); Citar The VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero. LPVOID VirtualAlloc( LPVOID lpAddress, // address of region to reserve or commit DWORD dwSize, // size of region DWORD flAllocationType, // type of allocation DWORD flProtect // type of access protection ); hago el siguiente injerto(aquí mi duda): Citar push 4000 push ??????? push 150000 call VirtualFree nop push 4 push 2000 push ?????? push 150000 call VirtualAlloc nop push 4 push 1000 push ?????? push 150000 call VirtualAlloc (el injerto lo tomé del tutorial de ricardo narvaja) el problema es el size no sé cuanto colocar, debido que no sé que es un heap y cuanto espacio debo colocar y por qué ese espacio, otra cosa es por que se hace dos llamados a VirtualAlloc con diferencia en el parámetro type of access protection Si pudieran aclararme esas dudas de manera explicativa, se los agradecería demasiado,Saludos Título: Re: Duda con sección (VirtualFree) Publicado por: apuromafo CLS en 4 Octubre 2011, 20:14 pm en palabras entendibles
heap= un espacio en la memoria RAM, no en alguna parte del programa, dumpearas y esa parte estara o no segun el permiso que se le hizo, para eso verifica HeapAlloc, y otras asi, segun el permiso de la sección ahora bien como heap en si es como una parte del s.o o una capa http://msdn.microsoft.com/en-us/library/ms810603.aspx pero en palabras criticas de lo que se hizo en el heap, es un espacio reservado que tiene un permiso especial para la aplicacion que le llamo, en este caso se ve que se puede usar una u otra api para que sea accedible: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366794%28v=vs.85%29.aspx luego vemos arriba ves:Address Size 00150000 00006000 osea arriba ves: Address 00150000 hex Size 00006000 hex luego ves que dice Priv , esta sección es privada de acceso, puedes usar un dumpeador por sección especializado como pupe, o otras aplicaciones. muchos hablan aveces de las PAGES pero volviendo a tus preguntas eso es una constante ahi veras tu cual usar: parametros y constantes de memoria http://msdn.microsoft.com/en-us/library/windows/desktop/aa366786%28v=vs.85%29.aspx api virtual alloc http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx ahora bien volviendo, porque en el injerto usaron virtual alloc y no otra? como bien veias en el espacio: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366794%28v=vs.85%29.aspx cuando usas virtual alloc, intentas que la direccion sea esa tenga cierta informacion...en este caso de la sección que tenemos que este en ese lugar pero que pasaria si fallara?, es mejor que resuelvas la redireccion, yo eso hice en pelock y le puse como tute, porque realmente es complejo explicar algo desde ring3, que proviene desde ring0, una vez nahuel o ncr, hizo algo imposible con un driver, reservar memoria en el espacio cero, osea el comienzo de la memoria, obviamente con ring 0 pero bueno, independiente de los rootkit, hook y temas de permisos y secciones, lo importante es saber que parametros puede retornar, saludos Apuromafo Título: Re: Duda con sección (VirtualFree) Publicado por: .:UND3R:. en 4 Octubre 2011, 20:24 pm Todo mucho más aclarado, gracias apuromafo ::)
Título: Re: Duda con sección (VirtualFree) Publicado por: .:UND3R:. en 4 Octubre 2011, 22:22 pm Sigo con problemas, he hecho lo siguiente:
Tengo el Unpackme original, detenido en el OEP y tiene la siguiente memoria virtual: Memory map, item 6 Address=00150000 Size=0002A000 (172032.) Owner= 00150000 (itself) Section= Type=Priv 00021004 Access=RW Initial access=RW Citar volco con pupe la sección y la injerto como última sección en el programa: Pe header code .. .. . Section(490000) ahora tomo el dumpeado y hago que parta desde aquí: Citar 004BA000 60 PUSHAD 004BA001 BE 00001500 MOV ESI,150000 004BA006 BF 00004900 MOV EDI,Copia_de.00490000 004BA00B B9 FF9B0000 MOV ECX,9BFF 004BA010 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 004BA012 68 00400000 PUSH 4000 004BA017 68 00700200 PUSH 27000 004BA01C 68 00001500 PUSH 150000 004BA021 FF15 A4094600 CALL DWORD PTR DS:[<&kernel32.VirtualFree>] ; kernel32.VirtualFree 004BA027 90 NOP 004BA028 6A 04 PUSH 4 004BA02A 68 00200000 PUSH 2000 004BA02F 68 00A00200 PUSH 2A000 004BA034 68 00001500 PUSH 150000 004BA039 FF15 A8094600 CALL DWORD PTR DS:[<&kernel32.VirtualAlloc>] ; kernel32.VirtualAlloc 004BA03F 90 NOP 004BA040 6A 04 PUSH 4 004BA042 68 00100000 PUSH 1000 004BA047 68 00A00200 PUSH 2A000 004BA04C 68 00001500 PUSH 150000 004BA051 FF15 A8094600 CALL DWORD PTR DS:[<&kernel32.VirtualAlloc>] ; kernel32.VirtualAlloc 004BA057 90 NOP 004BA058 BF 00001500 MOV EDI,150000 004BA05D BE 00004900 MOV ESI,Copia_de.00490000 004BA062 B9 FFA70000 MOV ECX,0A7FF 004BA067 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 004BA069 61 POPAD 004BA06A BB 00E0FD7F MOV EBX,7FFDE000 004BA06F BC BCFF1200 MOV ESP,12FFBC 004BA074 BD C0FF1200 MOV EBP,12FFC0 004BA079 - E9 32D1F6FF JMP Copia_de.<ModuleEntryPoint> esto lo que hace es copiar todo lo que está en el dumpeado en memoria 150000 lo sobre escribe en la sección section copiando el heap en tal sección, una vez hecho eso borra la sección 150000 y luego la crea nuevamente 150000 con size 2A000 luego de eso copia todo lo que está en la sección section a 150000 por lógica y en resumen guarda el heap en section y luego de guardarlo crea de nuevo en memoria a 150000 y copia todo lo que está en section a 150000 pero esto no me funciona, no entiendo el por qué si tan solo copia el heap que tiene estando en el OEP y lo vuelve a escribir agregando adicionalmente lo que falta, si alguien me pudiera decir si este procedimiento esta correcto se lo agradecería Saludos Título: Re: Duda con sección (VirtualFree) Publicado por: apuromafo CLS en 4 Octubre 2011, 22:27 pm 004BA05D BE 00004900 MOV ESI,Copia_de.00490000
004BA062 B9 FFA70000 MOV ECX,0A7FF versus lo primero que dijiste MOV EDI,150000 como sabes que tienes acceso a 150000? le diste permiso de escritura? intenta otra cosa menos densa, aparte de copiar, busca donde realmente esta el programa 490000 ahi esta o esta en 40000+490000 ? cual es el programa? sera el famoso unpackme de pelock? del cual he comentado varias veces que aveces da lios los injertos y es mejor reparar todo el codesplicit? saludos Apuromafo Título: Re: Duda con sección (VirtualFree) Publicado por: .:UND3R:. en 4 Octubre 2011, 23:19 pm es un Unpackme, es el siguiente: http://www.megaupload.com/?d=0BJWO39K (http://www.megaupload.com/?d=0BJWO39K) tiene stolen bytes, Iat redireccionada y antidump aquí está todo reparado menos el antidump: http://www.megaupload.com/?d=XUXRRDQ8 (http://www.megaupload.com/?d=XUXRRDQ8) (el antidump lo he podido reparar y funciona perfectamente, pero quiero repararlo de la forma mencionada en el post, si pudieras ayudarme) lo único que debes hacer es detenerte en el OEP(falso) ubicado en 4271b5 puede usar el siguiente script para los hardware on execution: http://foro.elhacker.net/ingenieria_inversa/scripthbp_bypass_excepciones-t339827.0.html (http://foro.elhacker.net/ingenieria_inversa/scripthbp_bypass_excepciones-t339827.0.html) Saludos estando detenido ahí en el original unpack, podrás ver la sección creada EDIT: el dump no le cambié el EP hacia el injerto debe ser 004BA000 Título: Re: Duda con sección (VirtualFree) Publicado por: apuromafo CLS en 5 Octubre 2011, 05:24 am aver.ideas .coloca el codedoctor y multimate assembler como plugins
idea para los xor puedes usar el codedoctor para los jmp lugar puedes con Multimate cambiar por lo menos el parametro en vez de 17xxx a otra 15xxx o la que quieras... para los otros stolen , pareciera ser poco.. y con notepad o block de notas reemplazas desde el texto de multimate psi, existe un unpacker para acprotect y un tute para ese packed adjunto tal cosa en http://www.mediafire.com/?bahqb8plxeiuo8n saludos Apuromafo pd:estare inactivo en la semana, por eso comento del unpacker, tengo varias evaluaciones..saludos |