lunes, 20 de julio de 2009

while(1), simple as that!.

Hola!,

queria contarles de un problema que tuve y como lo solucione muy facilmente.

La situacion era la siguiente: tenia un webserver corriendo y ademas otro programa que fowardeaba los requests http de determinada clase al webserver. Determinado request hacia que se cargue una dll on-demand que yo queria tracear. En principio, sospechaba del proceso responsable de cargar dicha dll pero probando con Olly varias cosas como por ejemplo, setearlo para que se detenga cuando una dll nueva es cargada, no funcionaba, ni tampoco un BPX en LoadLibraryA. La cosa se ponia dificil.

Conversando un rato con un amigo (Yibam) y comentandole el problema que tenia, ideamos un par de soluciones que podian llegar a resultar, como por ejemplo, utilizando un driver y desde kernel seteando un callback para que cuando se carguen las dlls podamos determinar que proceso era y que dll cargaba. Otra idea fue implementar eso mismo pero desde user-mode con uhooker....todas eran soluciones un tanto liosas para algo tan simple.

Luego, hablando con otro amigo (marciano) me dijo: "y si pones un INT3 en el DllMain?", la idea era buena, la probe pero resulta que el webserver parecia catchear la excepcion y tirar un error :(

Finalmente di con la solucion (gracias marciano nuevamente), por que en lugar de un INT3 no colocamos un JMP EIP (while(1))?. Pues dicho y hecho, eso fue lo que hice y pum!!!! habia un proceso que se "comia" el 99% del CPU!, attacheandome a dicho proceso pude comprobar que era el causante de cargar la dll que tanto buscaba.

Al final, un problema que parecia sencillo, para el cual habiamos diseñado soluciones algo complejas, termino solucionandose con algo super sencillo!, como era de esperar.

Bueno, eso, una estupidez pero queria contarselas!.

Hasta la proxima!.

No hay comentarios: