Karpoff Spanish Tutor

Manual del IDA_Pro Parte 3


 

cracker: leirus   fecha: 30/10/2000

 

 introduccion

en el anterior capítulo nos quedamos viendo la ventana de carga de fichero. bueno, realmente cargamos el fichero y dejamos a ida que lo desensamblase en toda su plenitud. pero como os decía, ahora viene lo bueno

 

 al atake

7.- las ventanas del ida

como parece evidente, en este capítulo, vamos a explicar las distintas ventanas de las que consta el ida, así como de sus funciones y usos particulares. de este modo, podremos encontrar en el menú view, las distintas ventanas, así como de otros comandos de utilidad. las explicaremos paso a paso y una por una:

- dissasembly : podremos acceder a este comando pulsando la tecla f3 y su finalidad principal es la de visualizar una ventana de desensamblado nueva sin cerrar la anterior. de este modo, podremos ver en un mismo ida distintos desensamblados, pudiendo orientar cada uno a una parte concreta de las funciones que nos interesen. es útil, por ejemplo, cuando queremos dejar desensamblada una parte de código que nos resulta especialmente sospechosa porque, por ejemplo, se llame desde el programa varias veces.

- toggle dump view: intercambia entre el desensamblado y el dumpeado. la diferencia fundamental y trivial entre ambos es que en el primero obtendremos código esansamblador a partir de bytes del programa, y en el segundo es que son los propios bytes sin tratar del programa, es decir, un volcado (en hexadecimal) del contenido del fichero ejecutable en la memoria del ordenador. cabría preguntarse la finalidad y utilidad de esta característica. y es que ida no es sólo un desensamblador, sino que también nos permite modificar, parchear e incluso guardar el archivo en formato exe.¿ que queremos decir ? pues que si quieres parchear el programa porque has encontrado un punto débil en él y no quieres comerte más el tarro, pues puedes hacerlo directamente con el ida. además, el volcado se muestra en formato hexadecimal, como ya hemos dicho anteriormente:

bueno pues, estas "ventanas", no eran realmente ventanas como tales, sino más bien formas distintas de representar una misma información. lo que he querido conseguir (y espero haberlo conseguido) con este capítulo, es mostrar las diferentes maneras en las que presenta el ida la información que nos proporciona y encontrar un camino viable y seguro para que podamos usar esa información en nuestro beneficio. para ello, voy a explicar ahora lo que realmente nos atañe, las distintas ventanas en las que ida nos indicará las funciones que se han reconocido, los nombres de variables, las estructuras de datos que ha encontrado, las referencias cruzadas, etc.

- functions window : en primer lugar, tenemos esta ventana, importantísima por cierto. creo que su propio nombre indica su funcionalidad. efectivamente, en esta ventana, aparacen las distintas funciones que ha encontrado el ida, así como el nombre que le ha sido asignado en función de su funcionalidad, valga la redundancia. es decir, que según lo que haga el trozo de código reconocido así será asignado su nombre. por ejemplo, si una función se encarga de comparar 2 cadenas, pues se le nombrará, por ejemplo j_strcmp. pero eso ahora no nos importa. la ventana está dividida en varias columnas. a saber: la primera es el nombre dado a la función (sub_offset en la mayoría de los casos); la segunda es el segmento del programa donde se encuentra dicha función (normalmente en code o en text; la tercera es el offset (dentro del segmento) donde comienza la función; la cuarta, que representa la longitud en bytes (hexadecimal) de la función; y la cuarta, que tiene un formato especial que detallamos:

r - la función retorna al llamador.
f - "función lejana".
l - función de librería.
s - función estática.
b - ?
m - reserved
s - reserved
i - reserved
c - reserved
d - reserved
v - reserved

esta ventana, tiene la peculiaridad de que podremos añadir, modificar o eliminar funciones a nuestro gusto. para ello, pulsaremos con el botón derecho sobre cualquier función, posteriormente pulsaríamos sobre delete en el caso de que queramos eliminar la función o edit en el caso de que quisiémos y modificarla. haremos esto último y deberíamos estar viendo una ventana como ésta:


en la que podemos apreciar que hay varios campos que configurar en una función. en primer lugar el nombre de la función. podremos poner el que nosotros queramos, para facilitarnos la tarea, y dejar de usar los nombres un tanto "crípticos" que usa el ida en sus asignaciones. también podremos modificar, como podemos ver, la dirección de comienzo y la del final. por tanto, también podremos modificar su tamaño, como el lógico. esto puede sernos útil para "trastear" con el programa y por ejemplo, cuando llame a la ayuda, redirigirlo a salir o cosas así. eso lo dejo a vuestro gusto e imaginación. también tenemos la posibildad de guardar espacio para variables locales, salvación de registros y bytes eliminados. por último, tendremos el poder de alterar las características de la función que antes mencionábamos. es decir, los flags que determinaban si una función retornaba, o era de librería, etc.

finalmente, y volviendo a la ventana de funciones, haciendo doble-click sobre cada función, nos llevará a ella.

- names window : en primer lugar, debemos definir que es un "name" en ida. pues como todo el mundo se podía imaginar, es una forma de referirse a algo, sea un dato, una función, una variable o cualquier cosa mediante nombre, algo que conocemos o que se nos acerca más a nuestro lenguaje. sin embargo, al igual que en las funciones, los nombres son generados por ida ateniéndose al contexto, y dando un nombre que se acerque a la realidad de la cosa representada. es lo que se conoce en ida como "dummy name". los detallamos a continuación:

sub_ instrucción, comienzo de la subrutina
locret_ instrucción de retorno
loc_ instrucción
off_ dato, contiene un valor de offset (dirección)
seg_ dato, contiene el valor de la dirección del segmento
asc_ dato, cadena ascii
byte_ dato, byte (o matriz de bytes)
word_ dato, 16-bit (o matriz de palabras)
dword_ dato, 32-bit (o matriz de dobles palabras)
qword_ dato, 64-bit (o matriz de cuádruples palabras)
flt_ dato de coma flotante, 32-bit (o matriz de flotante)
dbl_ dato de coma flotante, 64-bit (o matriz de dobles)
tbyte_ dato de coma flotante, 80-bit (o matriz de terabytes)
stru_ estructura (o matriz de estructuras)
algn_ sentencia de alineamiento
unk_ byte inexplorado

pero los nombres, podemos modificarlos a nuestro gusto, dándoles nombres más definitorios. como en el caso anterior, en las ventana de funciones, pulsaremos con el botón derecho sobre cualquiera de los nombres representados y sobre "edit". ahora pasaremos a explicar lo que significa cada uno de los campos que aparecen:

hemos de decir que hay varios campos que podremos modificar sin ton ni son. eso me gusta, pero deberás saber lo que modificas para conseguir tus objetivos. en primer lugar, tenemos el nombre que daremos a al nombre, valga la redundacia. podremos poner lo que queramos. en segundo lugar, tenemos que definir el máximo número de nombres nuevos, es decir, la cantidad de nombres que podremos incluir. después hay una selección un tanto extraña, pues local name prefix y local name tienen exactamente el mismo efecto: definir el nombre únicamente para la función actual. en include in names list, tendrás la opción de incluir o no el nombre que acabas de definir en la lista de nombres. si no seleccionas esta casilla, la función no aparecerá, y se tomará como oculta. en public name, el nombre se define como global, al contrario que en la primera casilla. autogenerated name su propio nombre lo indica, diciéndonos si el nombre ha sido o no autogenerado. weak name declarará el nombre como "débil". create anyway creará el nombre aunque ya exista. ida se encargará de ponerle un sufijo adecuado para diferenciarlo.

como anteriormente, si hacemos doble-click sobre la ventana de nombres, nos llevará a él.

- signatures window : en esta ventana se nos mostrará las signaturas o marcas que el ida tiene en su base de datos y que le permitene reconocer el lenguaje con el que ha sido escrito el programa y las funciones típicas de ese lenguaje. por ejemplo, si el programa ha sido escrito en c/c++, el ida aplicará las signaturas correspondientes (diferencia entre versiones de lenguajes) y, por ejemplo, reconocerá printf como función propia del lenguaje. en cualquier caso, esta ventana es una ventana que no vamos a utilizar con frecuencia, es más de hecho más vale que no la toquemos, porque ida en la mayoría de los casos reconocerá por si sólo el tipo de lenguaje de una manera eficiente.


bueno de momento basta por hoy, en el próximo capítulo seguiremos con el tratamiento de las ventanas. haremos un amplio estudio sobre la ventana de los segmentos. de momento, esperaos a la siguiente entrega.

hasta la próxima.

"ahora sé porqué lloráis los humanos, pero es algo que yo nunca podré hacer"
terminator 2: el juicio final.

http://go.to/leirus - leirus@telepolis.com
http://pagina.de/kfor - kfor@telepolis.com

 

karpoff spanish tutor: pagina dedicada a la divulgacion de informacion en castellano, sobre ingenieria inversa y programacion. email "colabora con tus proyectos"
www.000webhost.com