De binario a EXE

Este post es en respuesta a un ejercicio del grupo Aprendiendo C# en Facebook.

El ejercicio era el siguiente:

¿Qué hace este código máquina?
10111111 - 00011001 - 00000001 - 10001010 - 00000101 -
00111100 - 00100100 - 01110100 - 00000111 - 11111110 -
11001000 - 10001000 - 00000101 - 01000111 - 11101011 -
11110011 - 10110100 - 00001001 - 10111010 - 00011001 -
00000001 - 11001101 - 00100001 - 11001101 - 00100000 -
01010100 - 01100010 - 01101101 - 01110110 - 01100101 -
01110000 - 01110100 - 00100100

De entrada, obviamente, me sacó de onda… Pero algo era obvio: era un código binario que se podía convertir a entero, y de ahí tal vez obtendría la respuesta.

Usé una aplicación en .NET para convertir ese texto a sus valores enteros, con un código como éste:

string val = "10111111 - 00011001 - 00000001 - 10001010 - 00000101 - 00111100 - 00100100 - 01110100 - 00000111 - 11111110 - 11001000 - 10001000 - 00000101 - 01000111 - 11101011 - 11110011 - 10110100 - 00001001 - 10111010 - 00011001 - 00000001 - 11001101 - 00100001 - 11001101 - 00100000 - 01010100 - 01100010 - 01101101 - 01110110 - 01100101 - 01110000 - 01110100 - 00100100";
string[] vals = val.Split('-');
List<string> numeros = new List<string>();
foreach (string v in vals)
{
  numeros.Add(Convert.ToInt32(v.Trim(), 2).ToString());
}
return String.Join("-", numeros.ToArray());

Así rapidito, creo un objeto List. Por cada código binario en la cadena original, añado su valor numérico en esa lista, usando Convert.ToInt32, con el segundo parámetro indicando la base numérica de origen (2 por binario). Al final, devuelvo el resultado como una cadena usando String.Join. Por eso la lista es de objetos string, porque esa última instrucción me pide un arreglo de cadenas de texto. El resultado de esta operación es esto:

191-25-1-138-5-60-36-116-7-254-200-136-5-71-235-243-180-9-186-25-1-205-33-205-32-84-98-109-118-101-112-116-36

Pensé que tal vez eran códigos ASCII de caracteres, pero lo descarté rápidamente, al ver que el segundo dígito es 25, y los valores hexadecimales comienzan con el 32, como se ve en esta referencia.

Leyendo bien el ejercicio, dice que es código máquina, así que lo más obvio es que esos códigos fueran el contenido de un ejecutable. Así que tenía que pasar esos binarios a un archivo de tipo EXE.

Lo que hice fue modificar mi código para convertir los códigos binarios a hexadecimal.

string val = "10111111 - 00011001 - 00000001 - 10001010 - 00000101 - 00111100 - 00100100 - 01110100 - 00000111 - 11111110 - 11001000 - 10001000 - 00000101 - 01000111 - 11101011 - 11110011 - 10110100 - 00001001 - 10111010 - 00011001 - 00000001 - 11001101 - 00100001 - 11001101 - 00100000 - 01010100 - 01100010 - 01101101 - 01110110 - 01100101 - 01110000 - 01110100 - 00100100";
string[] vals = val.Split('-');
List<byte> numeros = new List<byte>();
foreach (string v in vals)
{
  numeros.Add(Convert.ToByte(v.Trim(), 2));
}
return BitConverter.ToString(numeros.ToArray());

La diferencia es que la lista ahora es de objetos byte, ya que la instrucción BitConverter.ToString pide como parámetro un arreglo de bytes. El resultado es:

BF-19-01-8A-05-3C-24-74-07-FE-C8-88-05-47-EB-F3-B4-09-BA-19-01-CD-21-CD-20-54-62-6D-76-65-70-74-24

Y este resultado necesito guardarlo como aplicación. Para esto usé HxD, editor hexadecimal de archivos.

HxD

Guardo el archivo con extensión EXE. Lo ejecuto en consola y éste es el resultado:

Aplicación en consola

Nota importante: Mucho cuidado cuando usan programas como HxD. Modificar un valor de una apliación la inutiliza, posiblemente de forma irreversible. No me culpen si echan a perder un programa de su sistema por jugar con el código hexadecimal.

Anuncios

Autor: Israel Muñoz

Soy desarrollador de software, principalmente dedicado a desarrollo de aplicaciones web. Especializado en .NET full-stack, además de tecnologías front-end HTML, CSS y JavaScript. A ratos, profesor de materias de informática. Me gusta mucho todo lo que tiene que ver con las tecnologías nuevas para desarrollo web, y el diseño de sitios y aplicaciones.

3 comentarios en “De binario a EXE”

  1. Hola. He intentado replicar el ejercicio punto por punto y no funciona. Entiendo que el ejecutable debe llevar información adicional al código que se ejecuta, ¿no?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s