Duda con sección (VirtualFree)

Iniciado por .:UND3R:., 1 Octubre 2011, 19:14 PM

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

.:UND3R:.

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:

CitarMemory 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:

Citaren 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


CitarThe 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
   );

CitarThe 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):

Citarpush 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





Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

apuromafo CLS

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


.:UND3R:.

Todo mucho más aclarado, gracias apuromafo  ::)

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

.:UND3R:.

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

Citarvolco 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í:
Citar004BA000    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

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

apuromafo CLS

#4
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

.:UND3R:.

#5

es un Unpackme, es el siguiente:
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

(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

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

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

apuromafo CLS

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