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.
Guardo el archivo con extensión EXE. Lo ejecuto en consola y éste es el resultado:
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.
Muchas gracias por la explicacion, ahora aprender un poco mas sobre este tema.
Excelente forma de explicarlo compañero, un gusto aprender de profesionales como tu.
Samuel Arellano
Mexicali, Baja California. México
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?
+506 6265 8208 pueden mandar un binario tiene PF