Implementar Stack Trace (Walk through stack)

Iniciado por kub0x, 15 Marzo 2014, 15:53 PM

0 Miembros y 1 Visitante están viendo este tema.

kub0x

Buenas tardes foreros,

ando con un proyecto entre manos en C++ y me tocó implementar la parte del stack trace tanto en el tratamiento de excepciones como en las llamadas de las funciones clave.

La verdad que ésto me impresiono bastante y me gustaría plantear lo mismo en ASM.

En ASM tenemos que la pila se divide en stack frames (marcos de pila). El registro EBP apuntará al marco de pila actual, pero claro, cada frame tiene propio tamaño, por lo que me imposibilita el poder 'caminar' por la pila en busca de las direcciones de las funciones o métodos contenidos en la pila.

Para poder calcular el tamaño de una frame podriamos restar EBP y ESP, ya que a ESP le quitamos el tamaño de los parámetros y variables locales reservadas por la función.

¿Podría alguien encaminarme? En caso de conseguirlo entonces publicaría el code.

Un saludo!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


ThunderCls

Para windows puedes usar las API's StackWalk64/CaptureStackBackTrace lee acerca de ellas en la MSDN para que veas como se usan  ;)
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

kub0x

Cita de: kub0x en 15 Marzo 2014, 15:53 PM
ando con un proyecto entre manos en C++ y me tocó implementar la parte del stack trace tanto en el tratamiento de excepciones como en las llamadas de las funciones clave.

Bueno como arriba dije, esta parte ya la tengo cubierta. CaptureBackStackTrace no es funcional a la hora de tratar con excepciones ya que no devuelve toda la Stack Trace, así que me pasé a StackWalk. Con StackWalk no he tenido ningún problema, actualmente funciona al pelo ;)

Os pido consejo porque me gustaría implementar una rutina que haga lo mismo en ASM.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


Eternal Idol

¿Ya tenes el codigo que necesitas en la API de Windows? Podes usar el WinDbg o el IDA para ver el codigo en cuestion.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

cpu2

#4
Por lo que entendi quieres una funcion que determine el tamaño de la pila no? O el espacio que gasta cada funcion?

Si es el primero, lo puedes implementar con codigo muy simple, que es mas o menos lo que dijiste, pero no tiene por que ser ebp, puede ser cualquier registro que apunte a una direccion anterior a esp.

Código (asm) [Seleccionar]
.section .text
.globl _start

movq %rsp, %rbp
pushq %rax
pushq %rax      ;------> imaginate que esos push son una llamada a una funcion
sub %rsp, %rbp


Como se trata de un x64 los pushq restan 8 bytes en teoria la pila estaria en 16 bytes, tendrias 16 en rbp "o en cualquier otro registro" pero tambien puedes guardar datos en la pila sin decrementar esta, y ese metodo no valdria.

Un saludo.

Arkangel_0x7C5

Si lo que quieres es ir localizando los stack frame para luego ver su tamaño, simplemente tienes que ir usando ebp para localizar el frame actual
Luego en [ebp] encontraras el valor anterior de ebp. por lo que solo tienes que hacer esto hasta llegar al final de la pila....

Saludos Ark