feed

Ingeniería de Software

Desensamblador y Depurador IDA corriendo en Windows

En el último artículo de la serie vimos lo útiles que pueden llegar a ser los hardware breakpoints para depurar aplicaciones que por ejemplo hacen comprobaciones de CRC y no pueden ser depuradas modificando sus datos en memoria.

Hoy vamos a ver como podemos utilizar memory breakpoints para sobrepasar los límites impuestos por los hardware breakpoints y poder entre otras cosas controlar el acceso a grandes partes de la memoria.

Memory...

Leer más »

Ayer vimos como el depurador reemplaza el primer byte de un opcode en una dirección de memoria específica donde, previamente, hemos fijado un breakpoint y donde colocamos el opcode 0xcc o lo que es lo mismo la instrucción int 3 que le indica al procesador que se detenga y lance un evento de depurado que es capturado por el depurador.

También vimos que en este proceso, al sobreescribir parte de la...

Leer más »

Y llegamos al punto caliente de nuestra serie sobre el funcionamiento de los depuradores de C y C++. Ya sabemos como funciona la CPU y la pila de la memoria. También sabemos que son los eventos de depurado y que el sistema operativo ofrece una interfaz para atraparlos.

Hoy vamos a hablar en profundidad sobre los puntos de interrupción o “breakpoints“ que son sin duda la parte fundamental de...

Leer más »

En esta serie ya hemos hablado sobre los registros de carácter general del procesador en arquitectura x86 y de como funciona la pila o stack. Ambos conceptos son completamente necesarios para lograr entender en profundidad como funciona un depurador.

Hoy vamos a hablar sobre los eventos de depurado . De forma abstracta, un depurador no es más que un bucle sin fin que espera a que sucedan eventos...

Leer más »

Ayer hablábamos sobre la CPU y los registros de propósito general para entender como procesa a bajo nivel el hardware de nuestro sistema el código compilado al interpretar los opcodes que generan los compiladores.

Hoy vamos a ver muy brevemente como funciona la memoria y más específicamente la pila en la arquitectura x86. De esta forma todos estos conceptos no nos serán arcanos cuando entremos en...

Leer más »

Todos aquellos programadores que hayan programado en C o C++ conocen los típicos depuradores de código disponibles para el código máquina generado por el compilador de dichos lenguajes.

Dependiendo del sistema operativo estaremos acostumbrados a gdb y sus amigos (ddd, kgdb, etc, etc), LLDB, WinDbg, OllyDbg , etc. No vamos a entrar en cual de estos depuradores es mejor sino que vamos a hacer un...

Leer más »

La construcción de un software es un ejercicio de trabajo y tiempo considerable, de gran complejidad incluso en sus formas más simples y que debe permanecer activo en el tiempo con una importancia cada vez más grande en la sociedad actual.

Por ello la generación de aplicaciones informáticas por la metodología de ASM (A Salto de Mata) no solamente es negativa sino que implica riesgos inasumibles...

Leer más »



Cuando programamos cualquier tipo de aplicación, es común la necesidad de almacenar estados o valores de tipo boleano para nuestras estructuras de datos. Si por ejemplo programamos en C99 podemos hacer uso del tipo _Bool que ocupa un byte de longitud, también ocupa un byte el tipo bool de C++.

Sin embargo, utilizar un byte para un valor que puede ser representado por un único bit es un gasto...

Leer más »

Anteriormente hemos hablado sobre la importancia de saber valorar y definir nuestros recursos y lo que cuesta nuestro tiempo a la hora de acometer cualquier proyecto de autoempleo. También hemos hablado sobre la importancia de las metodologías en el trabajo autoempleado. Pero aún no hemos hablado de ¿Por qué es importante definir y validar casos de uso?.

En mayor o menor medida, todos conocemos...

Leer más »

Síguenos