Ir al contenido principal

Entradas

Mostrando las entradas etiquetadas como Assembler

Ingeniería Inversa de Firmware en un PIC 16Fxxx de Microchip

Como parece que no tengo mejores cosas que hacer, no se me ocurre otra forma mejor de pasar una tarde de Sábado que hacer un poco de Ingeniería Inversa a un microcontrolador PIC de la casa Microchip.   En esta ocasión se trata de un microcontrolador de la familia 16Fxxx (tipo 16F876, 16F84, etc.) cuyos opcodes tienen un tamaño de 14 bits. El mismo sistema será válido para otros microcontroladores de otras familias o incluso fabricantes, incluso aún cambiando la arquitectura del microcontrolador, la base esencial del análisis será similar en multitud de casos.   Siempre que se me plantea una situación similar, me gusta entender los entresijos de lo que tengo entre manos y, en la medida de lo posible intento empezar "a mano" o "a pelo" en el proceso de obtención de los Nemotécnicos ó, en definitiva las instrucciones en lenguaje ensamblador.   A continuación os muestro un pequeño pedacito de un firmware que he estado analizando, se trata del comienzo del m...

WinDbg - Setting breakpoint on Entry Point

Hay varias formas de localizar el punto de entrada (EP) de un programa, y aquí expongo un par de ellas. La primera es la más sencilla y rápida, la segunda un poco más compleja pero que abre el abanico de opciones. WinDbg como sabemos dispone de varios pseudo-registros predefinidos que nos facilitan bastante las sesiones de depuración. Uno de estos registros es $exentry. Para colocar un breakpoint en el punto de entrada del ejecutable basta con escribir este comando: 0:000> bu @$exentry El segundo método es un poco más enrevesado pero igualmente válido. Consiste en localizar manualmente el entrypoint mediante el uso de las cabeceras PE del módulo. Para ello, lo primero que hacemos es buscar la ImageBase del ejecutable. Esto lo podemos conseguir con el comando LM que nos dará el ImageBase y el ImageSize, pero también podemos localizarlo con el comando !PEB que nos muestra información sobre el proceso (PEB - Process Environment Block) Una vez tenemos la ImageBase tenemos que ...

WinDbg Breakpoint on key pressed

Imaginad por un momento que os surge la necesidad de detener la ejecución de un programa cuando se pulsa una determinada tecla o combinación de estas, en fin, algo normal que a cualquier persona se le puede pasar por la imaginación, ¿o no?. Bromas aparte, para conseguirlo podemos utilizar infinidad de técnicas y en esta ocasión voy a comentaros la última que he empleado yo en uno de los trabajos que estoy realizando actualmente. Esta técnica consiste en colocar un punto de ruptura en la llamada a la API TranslateAccelerator. Ahora bien, debemos tener en cuenta que si colocamos un breakpoint de ejecución sin más, el debugger estará constantemente saltando y no podremos conseguir nuestro objetivo o, cuando menos, será muy desesperante. Para evitar tal situación, lo que tenemos que hacer es utilizar un breakpoint condicional para indicarle al debugger que se detenga solamente cuando se cumple una determinada condición o condiciones y por consiguiente que continúe con la ejecución nor...