Bienvenidas mis mentes inquietas felicitarlos por haber derrotado el examen de la Sección 3 y aquí estamos
con este mini o micro curso de lenguaje ensamblador para el cracker.
Bueno aquí vemos que cuando una máquina procesa información en realidad vamos a ver al final está utilizando
algo llamado lenguaje máquina que no es otra cosa que una sucesión de unos y ceros codificados para
que la máquina no entienda porque en definitiva el lenguaje de la máquina es binario ceros y unos después
para que sea humanamente más inteligible más manejable se puede representar connotación hexadecimal
concretamente se va a representar con dos dígitos en hexadecimal un dígito en hexadecimal me da 4 bits.
Así que con dos dígitos yo tengo un bit ok.
Generalmente como se agrupan las palabras en un ordenador también se pueden agrupar de 16 bits es decir
de dos bit de 32 pero vamos a empezar por el primer escalón de esta escalera fascinante que es cracking
a nivel de procesador.
Los programas cuando uno habla de un programa hecho por un ser humano están programados en un lenguaje
de programación el lenguaje de programación más cerca al nivel máquina al código máquina es decir los
ceros y los 1 que puede utilizar un ser humano sin morir en el intento es el ensamblador a más bajo
nivel significa que está más cerca del lenguaje que entienden las máquinas después el lenguaje más superiores
como vimos que generan es más fácil programar pero generan código redundante y demasiado grande y pesado
por eso lo que está programado en ensamblador tiene la característica de ser muy liviano muy preciso
en la línea de tiempo y muy rápido.
Entonces bueno cuando hablamos de programar cuando hablamos de crackear vamos a buscar instrucciones
no en código máquina porque sería imposible 0 1 1 0 sino que vamos a hacer una defensa anulación del
Código de la máquina los ceros y unos y obtener este tipo de lenguaje se está viendo acá.
En esta infografía hay ensamblador el ensamblador está compuesto como dice ahí por instrucciones.
Las instrucciones son por ejemplo estas por ejemplo mov o mover es una instrucción generalmente las
instrucciones en ensamblador pueden tener dos tres o cuatro letras ok.
Acá hay una instrucción de interrupción generalmente interrupción 20 la que está dada en hexadecimal
no en decimal y generalmente interrupción veintiún instrucción XX se utiliza para salir del programa.
Esto es lo que hace finalizar la ejecución del programa.
Después tenemos lo que no se ve generalmente hay llamadas o sea con instrucciones con instrucciones
de salto que son las que nos interesan.
Si después dice Acá está diciendo que está compuesto por instruciones máquinas las cuales operan a nivel
de registros.
Acá se empieza a poner bueno muchachos primero instrucciones.
Acá tenemos varias Marden por ejemplo podemos ver la instrucción que quedó tapada y arriba acá arriba
pero en realidad la primera arriba dice QOL.
Si esta es la instrucción que es buscada por el cracker tenemos varias instrucciones para ser borrado.
Instrucciones para detener instrucciones para interrumpir como dije y salir del flujo del programa instrucciones
para saltar.
Estas son las más interesantes porque hay dos son dos formas de llamarlas con dos letras o con cuatro
letras inclusive se puede llamar diferente aunque tenga dos o tres letras.
Por ejemplo el J.E que salta una comparación es igual.
También se puede llamar Jota Zeta es decir que salta si la comparación es cero si y otra que nos interesa
es el JND que tenían puede figurar como Jota N Z ok.
Instrucciones de saltos condicionales e incondicionales instrucciones de interrupción de detención de
borrado y la que estaba acá arriba que nos alcanza a ver que son instrucciones de salto o llamada a
una determinada parte del código generalmente donde se hacen las comparaciones con algún tipo de algoritmo
de ofuscación.
Después estoy diciendo que un procesador Pentium posee más de sin instrucciones y estamos hablando de
un Pentium pelado y después está el Pentium con instrucciones MMX o sea multimedia extensions.
Después existen procesadores con instrucciones ss. y así se le van agregando instrucciones así que esta
lista puede ser muchísimo más grande pero bueno no se asusten porque en realidad no lo van a necesitar
para el noble arte del cracking.
Hablando un poco de microprocesadores sepan que hay varias arquitecturas sino solamente cuando uno dice
arquitectura 64 bit y 32 bit no no me refiero a que en un principio cuando uno empieza a jalar del hilo
del estudio de los microprocesadores tenemos dos tipos de arquitectura tenemos la arquitectura llamada
6S o CISC o sea arquitectura de instrucciones complejas y las arquitecturas RISC es decir de instrucciones
más fáciles si es una especie de concepto opuesto de diseño y las instrucciones CISC son las complejas
tienen como como método principal o como estandarte tener muchas instrucciones un montón instrucciones
para hacer cosas complejas entonces hay que aprenderse un montón instrucciones y después lo que es el
Risk tiene pocas instrucciones de propósito general.
Y si yo quiero hacer algo complejo las voy uniendo ok voy uniendo 10 instrucciones y generó algo un
poco más complejo pero es mucho más fácil a la hora de aprenderse todas estas instrucciones que hallaca
ok
y llegamos a los señores registros.
Esto es lo que nunca nadie entiende en un curso de ensamblador pero eso se lo voy a hacer entender.
Los registros son área de almacenamiento pero ultra veloz es qué significa.
Imaginemos un registro como un cajón una caja cajón si depende el tipo de registro si son banderas son
registros de propósito general de cemento.
Cada cajón puede tener en el caso de las banderas puede tener un solo dato.
Supongamos que los datos sean libros un solo libro o dependiendo del tipo de registro y son esto por
ejemplo acumulador base pueden tener varios y generalmente múltiplos de ocho otra cosa que dice que
es interesante dice que los registros de almacenamiento muy pequeños comparados con la memoria RAM pero
ultra veloces como vimos siempre que uno quiere acceder y comparar la memoria RAM por más que sea de
mil no por dar un ejemplo gracioso con el núcleo de procesador que es dónde está todo esto que están
viendo acá.
En realidad el procesador siempre tiene un multiplicador es decir que desde Elbaz de memoria principal
el FSB donde ingresan los datos de los puentes de comunicación siempre para llegar al núcleo de procesador
donde está toda esta serie de artificios técnicos y electrónicos siempre hay que multiplicar por cuanto
se multiplica.
Bueno depende de cómo esté diseñado pero generalmente por 10 entonces podemos deducir que los registros
son 10 veces más veloces que el resto de la memoria RAM.
Alguno me dirá por qué no hacen la RAM tan veloz como los registros y porque se le prende fuego por
la Ley de Chul.
Cuanto más corriente circule por un conductor este genera más calor y hay una ley también que nace de
la conmutación no se olviden que en realidad estos son interruptores se cierra se abre el circuito como
una llave pero hecha con transistores o con semiconductores.
En realidad un semiconductor genera más calor cuando pasa del estado cuando pasa el estado de cortar
a no cortar cerrar abrir de abrir o cerrar.
Se genera más calor que cuando está manteniendo el Estado en abierto o encerrado.
Entonces si yo hago unos registros que tengan la velocidad que tienen los registros esto pero que sean
gigantes que el lugar entre un libro Ocho libros o disse libro entre miles de libros o datos a la velocidad
de la RAM simplemente se prendería fuego todavía no lo han logrado hacer.
Así que los registros tienen su razón de ser para el resto salimos al banco de trabajo que es la memoria
RAM qué más puede mover de los registros no hay registro para uso general ahí arriba de todo se ve que
dice Flags banderas los registros de estado son como semáforos que pueden tener un valor un 1 o un cero
estar encendidos o apagados.
Bueno para qué sirve los registros de Estado muestran como un semáforo con una señalización los estados
de microprocesador si por cualquier tema bastante complejo si pero esto no lo tenemos que saber para
crackear después que tenemos por acá.
Acá tenemos los registros de uso general porque todos tienen en común la H la HHH la L y R.
Bueno esto porque los registros se pueden hacer referencia por la parte alta del registro o por la parte
baja.
Qué quiero decir con esto imaginemos dijimos que los registros son como cajones que tenemos un cajón
que en el caso de estos registros está mostrando uso general no son como las banderas que tienen un
solo libro sino que pueden tener varios bueno direccionar lo llama al registro acumulador que será por
la parte alta si acumula Héctor Oikawa como lector.
Es como si agarro el cajón y le hago una división y pongo libros abajo y libros arriba.
El registro es el mismo por ejemplo es a x y si no especifico pero si la parte alta haciendo referencia
al registro a.
Si la parte baja al registro a luego hacia abajo ok.
Qué son estos registros y por qué tienen unas letras tan simpática.
Bueno el registro ah sí diferenciándolo como X a X vendría a englobar tanto el alto como el bajo el
registro X es un registro acumulador.
Para qué se utiliza el registro acumulador.
Bueno para hacer operaciones de suma resta de comparación lógica algo y algo o algo.
Y también para almacenar los resultados.
Vamos a hacer un pequeño programita ahora en ensamblador.
En la parte práctica y van a ver cuando yo sumo el contenido del registro a X le doy un valor al registro
X y después lo suma a otro registro por ejemplo registro base.
Si lo sumo el resultado lo vuelvo a guardar en X no lo voy a guardar en BL o en BH.
Así que por eso que se dice acumuladora acumula resultados después el registro bx es un registro base
se usa para dar direcciones de inicio tabla también se utiliza para poner valores para hacer operaciones
matemáticas sumar restar el registro C se dan cuenta que esto es inglés acumulé Heitor Voice Kanter
acumulador base contador de data resistes un registro de multi uso de datos y el registro Contador para
los que vienen de la vieja escuela del BASIC.
Se utiliza para hacer los Luv for next.
Por ejemplo yo tengo algo que el programa empieza KKK y tengo un valor por ejemplo ah ya va a ser igual
a 1 y el programa empieza a dar vuelta y cuando da la segunda vuelta tiene que ser igual a 2 y cuando
da la tercera vuelta por el código tiene que ser igual a 3.
Por ejemplo si hicieras un programa que cuentes ciclos donde guardo el 1 el 2 y el 3 en este hermoso
registro C o Counter de Contador si.
Qué más podemos ver tenemos otros registros si nos fijamos acá tenemos registro de segmento.
Si no voy a hacer nada específico con el registro de cemento como lo fui con esto porque en realidad
para el cracker no le interesa mucho el registro de cemento digámoslo así se utilizan para direccionar
la memoria de acceso aleatorio la RAM.
Para ubicar un inicio en la RAM o un lugar específico el arranque se va dividiendo en pequeñas Elita.
Ok no es que un cajón puede contener un millón de libros.
Si yo quiero almacenar más información pongo más cajones pero tiene cada cajón un límite que se va direccionando
en casi sellito que tienen unas decenas de K por decirlo así.
Qué más tenemos registro de puntero trabajo acá registro de punteros que acá tienen sus nombres se utilizan
básicamente para dar el offset.
Se acuerdan que el offset objetivo yo tengo que esto es un programa y tengo datos pueden ser de uno
cero uno uno cero en el programa aplastarlos cero.
Pero yo quiero empezar a contar desde acá para allá y bueno entonces el hilo se va a ser 1 2 3 4 que
vamos a estar con offset ok ok.
4.
Bueno es complicado dibujar con el offset en 4 así que es muy importante yo direccionó los elementos
de RAM y voy haciendo corrimiento para allá ejecutando.
Qué más tenemos.
A ver tenemos acá aparece la unidad aritmético lógica aritmética lógica lluny.
Ya vimos lo que era es una unidad que se encarga de hacer la parte aritmética es decir suma resta dividí
y la parte lógica compara y o que la parte lógica.
Por ejemplo esto es una compuerta compuerta puede tener la forma pero puede tener una compuerta por
ejemplo end y y esta es la entrada y la salida.
Yo acabarian tener solamente un 1 cuando estas dos patitas tengan 1 es decir cuando ésta y porque esta
si es una compuerta o por voy a tener solamente una salida en 1 cuando acá tenga un 1 y Akan 0 o sea
uno o otro.
O puedo tener un huracán y un solo acá la diferencia es lógica.
Ese tipo de lógicas también la maneja la unidad aritmético lógica.
En la primera computadora hablamos de la década del 90 la unidad en México lógica no podía ser cuenta
con números con coma.
Era todo entero.
Así que si quiere hacer cuentas con números con comas se tenía que disfrazar cuanto menos de judíos.
Pero lo hacía y ponía más lento todo hasta que empezaron a llegar con los 3 86 los procesadores x86
algo llamado coprodujo el coprocesador matemático el coprocesador matemático no era otra cosa que la
unidad de punto flotante FPU Floating Point Unit que era la que podía hacer cuentas con números con
comas o números reales.
Después.
Hoy en día como uno habla de aleluyas sabe que tiene incorporada la FPU y que hoy en día ya viene así
qué más podemos ver lo que nos queda en esta infografía es la ágata la unidad de control esta estaba
medio olvidada nadie te explica bien que la unidad de control la idea de control lo que hace es ejecutar
operaciones físicas elementales en un orden específico para que se ejecute cada instrucción que vimos
del programa.
Esto tiene compuertas como vimos y entonces va pasando todas las señales para que una instrucción por
ejemplo sumar al que es una ecuación de suma termina siendo lo que tiene que hacer con los datos y ninguna
otra cosa.
Esto está regido muy regido por un reloj o por el reloj del sistema como un semáforo así que es muy
pero muy pero muy importante.
A esto también se le puede llamar en ciertos contextos microcódigo si tenemos el el más interno Elvas
no es otra cosa que cables que conducen la electricidad si pueden conducir en paralelo o en serie decir
muchos datos juntos con un permiso del reloj de la unidad de control o si es en serie va a mandar un
dato a esperar el próximo permiso.
Otro dato tras el próximo permiso de atrás para darle un ejemplo qué más dice Yo creo que ya estamos
bastante bien acá la derecha dice los registros flag o bandera solo pueden valer un estado de ciertas
operaciones.
Si esto ya lo vimos por ejemplo si hago una cuenta y tengo resto puede aprenderse alguna de estas por
decir así.
Bueno acá voy a desmitificar a cierta gente que dice que es gurú y habla de que está programando en
código máquina si está programado en código máquina es un alien no es un ser humano porque es casi imposible.
El código máquina no tiene nada que ver con el código ensamblador como dicen los que creen que saben
el código ensamblador es esto que se ve acá donde uno puede ver instrucciones humanamente inteligibles
mover sumar a hacer una compra una comprobación lógica esto es un XOR poner un valor push hace una comparación
JND.
Si si algo no es igual ok y hay algo llamado compilador que es un programa que cuando el ser humano
programa en esto que es un poco más entendible el compilador lo que hace es pasar cada una de estas
instrucciones a su equivalente en código de máquina esto si el código de máquina no tiene nada que ver
con esto.
Entonces dice Bueno a ver MUC L y todo este valor de acá es igual este estado en hexadecimal es igual
a H nueve dos dos uno uno cero cero cero.
La instrucción de abajo helar es igual a cero uno sea y qué hace.
Los pone uno a continuación del otro proceso que arranca en 8 9 22 0 0 FF y le pega lo que está lo que
le sigue el 0 1 sea.
Y qué hace un bloque de instrucciones.
En realidad esto no es otra cosa que ceros y uno uno cero cero uno representado como dije en notación
hexadecimal para hacerlo humanamente más entendible.
Y después todo esto que entiende sobre la máquina lo empaqueta en un hermoso Archivo.
En el caso de Windows llamado punto ExE por ejemplo porque es un archivo que se llama Mi primer programa
Punto punto eixe eso es un archivo compilado que tiene adentro código máquina que no tiene nada que
ver con esto.
Para lograr se puede lograr esto se puede lograr tener el código en ensamblador a partir del código
máquina.
Alguno podría pensar que si yo tengo una máquina con una manija una manivela para hacer salchichas y
pongo los cerdos de un lado y giro la manivela y salen las salchichas si giro la manivela en sentido
contrario no se reconstituye los cerdos.
Pero en este caso si se reconstituyentes es decir se puede llegar a partir de esto.
De esta secuencia de ceros y 1 a obtener este código sí cómo se hace se ensambla ok.
En lenguaje ensamblador se compiló y sostuvo esto de esto yo ensambla y puede obtener el código principal.
Si bien vamos a ver un poco de práctica sí es un poco larga esta clase pero creo que es a mí me encanta
me encanta y como no puedo con mi genio vamos a hacer un pequeño programa aunque sea que sume dos numeritos.