elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga  (Leído 4,772 veces)
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« en: 17 Junio 2009, 21:16 pm »

Estoy un poco roto.

Me estoy iniciando en esto del PyDbg que es un debugger programatico en python y me ha maravillado.

Tiene algunos bugs pero el codigo fuente es muy claro, yo ya he corregido uno (el de los bps hw) y ampliado alguna funcion.

El mayor escollo con que he topado es el de siempre, los metodos anti-debug, he conseguido limpiar algunas huellas pero llegado al metodo de las HeapFlags me he quedado estancado.

La primera solucion fue crear mi funcion de carga del proceso, myload, que crea el proceso suspendido, sustituye el entry point por un JMP EIP, lo resume, y luego attachea el debugger sustituyendo el entry point con los bytes originales. Funciona a veces, pero si lo uso no van los bps hardware, y me interesa usarlos para cargar el UnpackArmadillo6 que os adjunte el otro dia.

No se si pastearos aqui el codigo o que, bueno alla va, sera un rollo, lo he comentado algo:
Código:
def myload (self, path_to_file, command_line=None, create_new_console=None, show_window = None):
        pi = PROCESS_INFORMATION()
        si = STARTUPINFO()

        si.cb = sizeof(si)

        # these flags control the main window display of the debuggee.
        if not show_window:
                si.dwFlags     = 0x1
                si.wShowWindow = 0x0

        # CreateProcess() seems to work better with command line arguments when the path_to_file is passed as NULL.
        if command_line:
                command_line = path_to_file + " " + command_line
                path_to_file = 0
           
        creation_flags = 4 # CREATE_SUSPENDED

        if create_new_console:
                creation_flags |= CREATE_NEW_CONSOLE

        success = kernel32.CreateProcessA(c_char_p(path_to_file),
                                          c_char_p(command_line),
                                          0,
                                          0,
                                          0,
                                          creation_flags,
                                          0,
                                          0,
                                          byref(si),
                                          byref(pi))

        if not success:
            raise pdx("CreateProcess()", True)

        # store the handles we need.
        self.pid       = pi.dwProcessId
        self.h_process = pi.hProcess

        # resolve the PEB address.
        selector_entry = LDT_ENTRY()
        thread_context = self.get_thread_context(pi.hThread)

        if not kernel32.GetThreadSelectorEntry(pi.hThread, thread_context.SegFs, byref(selector_entry)):
                self.win32_error("GetThreadSelectorEntry()")

        teb  = selector_entry.BaseLow
        teb += (selector_entry.HighWord.Bits.BaseMid << 16) + (selector_entry.HighWord.Bits.BaseHi << 24)

        # add this TEB to the internal dictionary.
        self.tebs[pi.dwThreadId] = teb
        self.h_thread = pi.hThread
        self.dwThreadId = pi.dwThreadId
       
        self.peb = self.read_process_memory(teb + 0x30, 4)
        self.peb = struct.unpack("<L", self.peb)[0]
       
        pef = pefile.PE(path_to_file)
        address = pef.OPTIONAL_HEADER.AddressOfEntryPoint + pef.OPTIONAL_HEADER.ImageBase
        # save the original byte at the requested breakpoint address.
        original_bytes = self.read_process_memory(address, 2)

        self.write_process_memory(address, "\xEB\xFE") #JMP EIP
        kernel32.ResumeThread(pi.hThread)
        self.attach(self.pid)
        self.write_process_memory(address, original_bytes, 2)
        kernel32.FlushInstructionCache(self.h_process, 0, 0)

he usado tambien pefile la libreria para obetner el entry point del fichero aa cargar, nada, lo dicho esta nueva herrramienta merece la pena

Hay otra forma de borrar las heapflags? que no sea la de la clave del registro(aunque me acabare rindiendo a ella), y por cierto alguien sabe que pasaria si cambiase las HeapFlags en memoria con un ReadProcessMemory??

Sludos,
En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #1 en: 17 Junio 2009, 23:14 pm »

Era una cosilla, dwFlags = 0x0 vaya tonteria lo que hacia funcionar raro la cosa
Por lo demas los hw bps no funcionan porque armadillo los borra! como lidiar con esto? alguna idea? se me ocurre poner un handler ante el evento de despues de procesar la excepcion pero no se como hacer esto, tal vez no este contemplado, como lo hara olly??
En línea

Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #2 en: 18 Junio 2009, 09:16 am »

Era una cosilla, dwFlags = 0x0 vaya tonteria lo que hacia funcionar raro la cosa
Por lo demas los hw bps no funcionan porque armadillo los borra! como lidiar con esto? alguna idea? se me ocurre poner un handler ante el evento de despues de procesar la excepcion pero no se como hacer esto, tal vez no este contemplado, como lo hara olly??

poner un breakpoint normal (0xCC) en los retornos de las API.

Un saludo.

Shaddy.
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #3 en: 18 Junio 2009, 16:29 pm »

Ummm Shaddy me dio la idea, gracias, al final despues de mucho debuggeo lo consegui, el PyDbg ya carga el UnpackmeArmadillo6  ;D

Lo hice así, capturo todas las excepciones con un manejador, en este pongo un breakpoint en el inicio de la SEH function, y en el manejador de esta un breakpoint en el retorno(retorno al ntdll, o al so, lo que sea)( luego borro los breakpoints claro), en el manejador del break de retorno de la esxcepcion restauro los valores de los registros de depuracion y zas!! en toda la boca Armadillo!!! jajaja  :P

mas info: (enlace recursivo lo siento) http://foro.elhacker.net/asm/evitar_que_te_borren_los_debug_registers_en_un_debugger_ring3-t258455.0.html;msg1255085#msg1255085
« Última modificación: 18 Junio 2009, 16:43 pm por biribau » En línea

Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #4 en: 18 Junio 2009, 16:34 pm »

Ummm Shaddy me dio la idea, gracias, al final despues de mucho debuggeo lo consegui, el PyDbg ya carga el UnpackmeArmadillo6  ;D

Lo hice así, capturo todas las excepciones con un manejador, en este pongo un breakpoint en el inicio de la SEH function, y en el manejador de esta un breakpoint en el retorno(retorno al ntdll, o al so, lo que sea)( luego borro los breakpoints claro), en el manejador del break de retorno de la esxcepcion restauro los valores de los registros de depuracion y zas!! en toda la boca Armadillo!!! jajaja  :P

Felicidades! :), podrías hacerte un tutorial de como lo has hecho :P.

Un saludo.

Shaddy.
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
tena


Desconectado Desconectado

Mensajes: 668



Ver Perfil
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #5 en: 18 Junio 2009, 19:09 pm »

Mis felicitaciones...
Seria interezante leer ese posible tute  :)

slds
En línea

Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: PyDbg el no va mas, que opinais? + Ayuda con funcion de carga
« Respuesta #6 en: 18 Junio 2009, 20:12 pm »

Tute tute  :rolleyes: Felicidades!!
En línea





Mi blog:
http://amerikanocls.blogspot.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Carga de funcion de una dll c++
Programación C/C++
alerico90 1 1,848 Último mensaje 14 Agosto 2015, 22:52 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines