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 protectionSi pudieran aclararme esas dudas de manera explicativa, se los agradecería demasiado,Saludos
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
Todo mucho más aclarado, gracias apuromafo ::)
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
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
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
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