Mostrando las entradas con la etiqueta Ingeniería inversa para Los principiantes. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ingeniería inversa para Los principiantes. Mostrar todas las entradas

martes, 29 de marzo de 2016

Ingeniería inversa para Los principiantes - CAPITULO 1

CAPITULO 1
A short introduction to the CPU - Una breve introducción a la CPU


La CPU es el dispositivo que ejecuta el código máquina de un programa consta de.
Un breve glosario:
 
Instrucción : Un comando CPU primitiva. Los ejemplos más simples son: mover datos entre los registros, que trabajan con memoria, las operaciones aritméticas primitivos. Como regla general, cada CPU tiene su propia arquitectura del conjunto de instrucciones (ISA).
 
Código máquina : El código que la CPU procesa directamente. Cada instrucción es generalmente codificada por varios bytes.
 
El lenguaje ensamblador: código mnemónico y algunas extensiones como macros que tiene la intención de hacer la vida de un programador más fácil.
 
registro de la CPU: Cada CPU tiene un conjunto fijo de registros de propósito general (GPR). ≈ 8 en x86, x86-64 en ≈ 16, ≈ 16 en ARM. La forma más fácil de entender un registro es pensar en ella como una variable temporal sin tipo. Imagínese si estuviera trabajando con un alto nivel PL 1 y sólo podía utilizar ocho variables de 32 bits (o 64 bits).Sin embargo, mucho se puede hacer usando sólo estos!
 
Uno podría preguntarse por qué es necesario que haya una diferencia entre el código máquina y una PL. La respuesta radica en el hecho de que los seres humanos y las CPU no son una como- es mucho más fácil para los seres humanos para utilizar un PL de alto nivel como C / C ++, Java, Python, etc., pero es más fácil para una CPU de usar un nivel mucho más bajo de abstracción.
Tal vez lo haría sea posible inventar una CPU que puede ejecutar código PL alto nivel, pero sería muchas veces más complejo que el CPU que sabemos de hoy. En una manera similar, es muy incómodo para los seres humanos que escriben en lenguaje ensamblador, debido a que es por lo bajo nivel y difícil de escribir en sin hacer un gran número de molestos errores.
El programa que convierte el código PL alto nivel en el conjunto es llamado un compilador.
 
1.1 A couple of words about different ISAs - Un par de palabras sobre diferentes ISAs
 
La ISA x86 siempre ha sido uno de los códigos de operación de longitud variable, por lo que cuando la era del 64 bits  vino, las extensiones x64 no afectaron la ISA de manera muy significativa. De hecho, la ISA x86 todavía contiene una gran cantidad de instrucciones que apareció por primera vez en la CPU de 16 bits 8086, sin embargo, todavía se encuentran en la CPU de hoy. 
 
ARM es una CPU RISC 2-diseñado con una longitud constante del código de operación ten en cuenta, que tenía algunas ventajas en el pasado. En el principio, todas las instrucciones ARM eran codificada en 4 bytes. Esto ahora se conoce como "modo ARM". 
 
Entonces pensaron que no era tan frugal como se había pensado inicialmente. De hecho, la mayor parte se usa instrucciones de la CPU en aplicaciones del mundo real se pueden codificar con menos información.
Por lo tanto, añaden otra ISA, llamado pulgar, donde cada instrucción se codifica en sólo 2 bytes. Esto ahora se conoce como "modo de pulgar". Sin embargo, no todas las instrucciones ARM pueden ser codificados en sólo 2 bytes, por lo que el conjunto de instrucciones del pulgar es algo limitada.
Vale la pena señalar que el código compilado para el modo de ARM y modo de pulgar puede coexistir, por supuesto, dentro de un mismo programa.
 
Los creadores de ARM Pulgar pensado podría ser ampliada, dando lugar a Pulgar-2 o "Thumb-2", que aparecido en ARMv7.Thumb-2 sigue utilizando las instrucciones de 2 bytes, pero tiene algunos de las nuevas instrucciones que tienen el tamaño de 4 bytes.Hay una idea errónea de que Thumb-2 es una mezcla de ARM y el pulgar. Esto es incorrecto. Más bien, Thumb-2 se extendió a apoyar plenamente todas las características del procesador por lo que podría competir con ARMmodo de un objetivo que se alcanzó con claridad, ya que la mayoría de las aplicaciones para el iPod / i-phone / iPad han sido compilados para el conjunto de instrucciones Thumb-2 (la verdad, debido en gran parte al hecho de que Xcode hace esto por defecto).Más tarde, el ARM de 64 bits salió.Esta NIA tiene códigos de operación de 4 bytes, y carecía de la necesidad de cualquier modo Thumb adicional.Sin embargo, los requisitos de 64 bits afectaron a la ISA, lo que resulta en nosotros ahora tiene tres juegos de instrucciones ARM: 
el modo de armado, de modo de Thumb(incluyendo Thumb-2) y ARM64.Estas ISA se cruzan parcialmente, pero se puede decir que son diferentes las NIA, en vez que las variaciones de la misma.Por lo tanto, nos gustaría probar para añadir fragmentos de código en los tres ISA ARM en este libro.
 
Hay muchas otras NIA RISC con una longitud de códigos de operación de 32 bits fijos, tales como MIPS, PowerPC y Alpha AXP.
 

Ingeniería inversa para Los principiantes - Introduccion

Code patterns -  patrones de código

Cuando el autor de este libro comenzó a aprender C y, después, C ++, que solía escribir pequeñas piezas de código, compilar, y que se ven en la salida del lenguaje ensamblador.
Esto hace que sea muy fácil para él entender lo que estaba pasando en el código que había escrito. Lo hizo tantas veces que la relación entre
código el C/C++  y lo que el compilador fue producido marcar profunda en su mente. Es fácil imaginar al instante un esbozo de C apariencia códigos y función. Quizás esta técnica podría ser útil para los demás.
Hay veces, que se usan los compiladores antiguos aquí, con el fin de obtener el más corto (y más simple) fragmento de código posible.
Exercises - Ceremonias
Cuando el autor de este libro estudio el lenguaje ensamblador, que a menudo también compilaba con pequeñas funciones de C y que luego se escriben de forma gradual hasta el montaje, tratando de hacer su código lo más corto posible.Esto probablemente no vale la pena hacerlo en escenarios del mundo real hoy en día, porque es difícil competir con los ordenadores modernos en términos de eficiencia.sin embargo, eso es una muy buena manera de obtener una mejor comprensión del conjunto.
No dude, por lo tanto, para tomar cualquier código ensamblador de este libro y tratar de hacerlo "corta". Sin embargo, no se olvide de poner a prueba lo que hay escrito.
Optimization levels and debug information - niveles de optimización e información de depuración
El código fuente puede ser compilado por diferentes compiladores con diversos niveles de optimización. Un compilador típico tiene alrededor de tres niveles, tales donde el nivel cero indica mejoramiento deshabilitado . La optimización también puede ser dirigido hacia el tamaño del código o la velocidad de código.
Un compilador no la optimización es más rápido y produce código más comprensible (aunque verbosa), mientras que un compilador de optimización es más lento y trata de producir código que corre más rápido (pero no necesariamente es más compacto).
Además de los niveles de optimización y dirección, un compilador puede incluir en el archivo resultante alguna información de depuración, código produciendo así haciendo una fácil depuración.
Una de las características importantes del código de depuración 'es que puede contener enlaces entre cada línea del código fuente y las respectivas direcciones de código de máquina.
La optimización de los compiladores, por el contrario, tienden a producir una salida donde las líneas enteras de código fuente se pueden optimizar de distintas "distancia" maneras  y por lo tanto ni siquiera estar presente en el resultado código de máquina.
La ingeniería inversa pueden encontrar ya sea la versión, simplemente porque algunos desarrolladores se convierten en los parámetros de optimización del compilador y otras no. Debido a esto, vamos a tratar de trabajar en ambos ejemplos de depuración y liberar las versiones del código presentado en este libro, siempre que sea posible.