Array de Bytes a String.

Iniciado por **Aincrad**, 15 Mayo 2019, 14:35 PM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

Hola, tengo otra duda, no entiendo muy bien como funciona este code :

Código (vbnet) [Seleccionar]
Dim shellcode As String = "PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIylJHk9s0C0s0SPmYxeTqzrqtnkaBDpNkV2VlNkpRb4nkqbQ8dOx7rjfFtqyoVQo0nLgLqq1lfbVL10IQ8O6mWqiWZBl0BrSgNkaBDPNkbbwLUQJplKQPpxOukpbTRjWqXPV0nkg828Nkshq0c1N3zCUlQYnk5dlKS1N6eaKOfQYPNLjaxOdMS1kwUhKPQeydtCQmIh7KsM7TBUIrV8LKPX6DgqICpfNkVlrkLKrxWls1zsLK5TNkuQN0Oyg4GTvD3kQKSQqIcjPQkO9pChcobzLKVrJKMVsmBJfaLMMUx9GpEPC0v0E8vQlKBOMWYoyEMkM0wmtjDJCXoVoeoMomyojuEl4FalDJk09kkPQe35mkw7fsd2PoBJ30sciohUbCSQbLbCfNauD8SUs0AA"
       Dim shell_array(shellcode.Length - 1) As Byte
       Dim i As Integer = 0
       Do
           shell_array(i) = Convert.ToByte(shellcode(i))
           i = i + 1

       Loop While i < shellcode.Length



En si Convierte el String a un array de bytes , lo cual genera un calc.exe (Calculadora de windows) .




Pregunta :


Ok , todo bien por ahi, Pero como Podría hacerlo al contrario. convertir un array de bytes (Algún .exe) a ese tipo de cadena String. ?

                  Gracias de antemano.






Eleкtro

#1
Cita de: **Aincrad** en 15 Mayo 2019, 14:35 PMcomo Podría hacerlo al contrario. convertir un array de bytes (Algún .exe) a ese tipo de cadena String. ?

Código (vbnet) [Seleccionar]
Dim ascii As String = "PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIylJHk9s0C0s0SPmYxeTqzrqtnkaBDpNkV2VlNkpRb4nkqbQ8dOx7rjfFtqyoVQo0nLgLqq1lfbVL10IQ8O6mWqiWZBl0BrSgNkaBDPNkbbwLUQJplKQPpxOukpbTRjWqXPV0nkg828Nkshq0c1N3zCUlQYnk5dlKS1N6eaKOfQYPNLjaxOdMS1kwUhKPQeydtCQmIh7KsM7TBUIrV8LKPX6DgqICpfNkVlrkLKrxWls1zsLK5TNkuQN0Oyg4GTvD3kQKSQqIcjPQkO9pChcobzLKVrJKMVsmBJfaLMMUx9GpEPC0v0E8vQlKBOMWYoyEMkM0wmtjDJCXoVoeoMomyojuEl4FalDJk09kkPQe35mkw7fsd2PoBJ30sciohUbCSQbLbCfNauD8SUs0AA"
Dim raw As Byte() = Array.ConvertAll(ascii.ToCharArray(), Function(c As Char) Convert.ToByte(c))

ascii = String.Join(Nothing, Array.ConvertAll(raw, Function(b As Byte) Convert.ToChar(b)))
Console.WriteLine(ascii)

+
Código (vbnet) [Seleccionar]
Dim raw As Byte() = File.ReadAllBytes("C:\program.exe")
Dim ascii As String = String.Join(Nothing, Array.ConvertAll(raw, Function(b As Byte) Convert.ToChar(b)))
Console.WriteLine(ascii)


Saludos.








**Aincrad**

#2
Gracias por responder , Una pregunta con el sigiente codigo :

Cita de: Eleкtro en 15 Mayo 2019, 18:13 PM
Código (vbnet) [Seleccionar]
Dim raw As Byte() = File.ReadAllBytes("C:\program.exe")
Dim ascii As String = String.Join(Nothing, Array.ConvertAll(raw, Function(b As Byte) Convert.ToChar(b)))
Console.WriteLine(ascii)


Salida de cualquier .exe :

MZ

en vez de algo como esto :


PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIylJHk9s0C0s0SPmYxeTqzrqtnkaBDpNkV2VlNkpRb4nkqbQ8dOx7rjfFtqyoVQo0nLgLqq1lfbVL10IQ8O6mWqiWZBl0BrSgNkaBDPNkbbwLUQJplKQPpxOukpbTRjWqXPV0nkg828Nkshq0c1N3zCUlQYnk5dlKS1N6eaKOfQYPNLjaxOdMS1kwUhKPQeydtCQmIh7KsM7TBUIrV8LKPX6DgqICpfNkVlrkLKrxWls1zsLK5TNkuQN0Oyg4GTvD3kQKSQqIcjPQkO9pChcobzLKVrJKMVsmBJfaLMMUx9GpEPC0v0E8vQlKBOMWYoyEMkM0wmtjDJCXoVoeoMomyojuEl4FalDJk09kkPQe35mkw7fsd2PoBJ30sciohUbCSQbLbCfNauD8SUs0AA





Escribiendo el archivo con File.WriteAllBytes me genera un .exe totalmente dañando.













Serapis

#3
A ver... de entrada un byte y un carácter (ANSI), son lo mismo una representación con 8 bits...
Ahora bien, los caracteres tienen asociado una representación gráfica, pero sucede que no todos los caracteres son imprimibles, de hecho incluso uno tiene una asociación sonora, y varios juegan un papel de control, por ejemplo el CR al tratar de imprimirlo, genera el salto de línea... el 34, que es las comillas, podría romper una comillas previas, etc...
Entonces no puedes tomar un fichero binario, pasarlo a string, y al ir a imprimirlo, esperar (sin más) ver cada byte ahí con una representación gráfica para cada uno...

Lo que tampoco implica que no puedas hacer lo que persigues... pero dando un pequeño rodeo.
Lee el array de bytes del exe, y lo conviertes a (por ejemplo) Base64 (o Base32, Base16, etc...), que como sabes (o debieras saber, si te dedicas a esto), codifica los bytes a caracteres legibles...

En realidad, lo que hace es tomar (al leer para representarlos) 3bytes de 8 en 8bits y luego leerse 4bytes de 6 en 6bits (pués (3x8) = (4x6) ). Esos 4bytes de 6 bits (6 bits direccionan 64 posiciones), son el índice en una tabla de 64 caracteres, que normalmente son A-Z, a-z, 0-9 más otros dos caracteres que suelen variar según la codificación (esto es a veces se le llama de otra manera).

Luego con el string, haces lo que te dé la gana (por ejemplo guardarlo como un fichero de texto)... más tarde, si lo quieres convertir a un array de bytes, lees el string (o el array de bytes y convertido a string) y finalmente harás la operación inversa... es decir pasar cada 4 bytes de 6 bits a 3 bytes de 8 bits...

En NET puedes usar la codificación UUEncode...

Base32, es similar, pero usa un conjunto de 32 caracteres, igualmente podrías usar Base16 (esto es hexadecimal) para el conjunto de caracteres imprimibles: 0-9, A-F).

Eleкtro

#4
Cita de: **Aincrad** en 15 Mayo 2019, 19:42 PMSalida de cualquier .exe :
MZ

La conversión que te he mostrado funciona correctamente.

El inicio de la cabecera que obtendrás será algo como esto:
MZ???????ÿÿ??¸???????@???????????????????????????????????ð???º?´ Í!¸LÍ!This program cannot be run in DOS mode.

Un editor hexadecimal sustituirá los caracteres nulos (ceros) y no imprimibles, por puntitos...
MZ..........ÿÿ..........@...................................ð.....º....Í!..LÍ!This.program.cannot.be.run.in.DOS.mode

Si quieres obtener un resultado similar, pues siempre puedes sustituir cierto tipo de caracteres para representarlo visualmente de forma legible...
Código (vbnet) [Seleccionar]
Dim raw As Byte() = File.ReadAllBytes("C:\program.exe")
Dim ascii As String = String.Join(Nothing, Array.ConvertAll(raw, Function(b As Byte)
                                                                    Dim c As Char = Convert.ToChar(b)
                                                                    Return If(Not Char.IsControl(c), c, "."c)
                                                                End Function))


Pero esto no es lo que preguntaste. Preguntaste como obtener el mismo string que proporcionaste.




Cita de: **Aincrad** en 15 Mayo 2019, 19:42 PM
en vez de algo como esto :
PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIylJHk9s0C0s0SPmYxeTqzrqtnkaBDpNkV2VlNkpRb4nkqbQ8dOx7rjfFtqyoVQo0nLgLqq1lfbVL10IQ8O6mWqiWZBl0BrSgNkaBDPNkbbwLUQJplKQPpxOukpbTRjWqXPV0nkg828Nkshq0c1N3zCUlQYnk5dlKS1N6eaKOfQYPNLjaxOdMS1kwUhKPQeydtCQmIh7KsM7TBUIrV8LKPX6DgqICpfNkVlrkLKrxWls1zsLK5TNkuQN0Oyg4GTvD3kQKSQqIcjPQkO9pChcobzLKVrJKMVsmBJfaLMMUx9GpEPC0v0E8vQlKBOMWYoyEMkM0wmtjDJCXoVoeoMomyojuEl4FalDJk09kkPQe35mkw7fsd2PoBJ30sciohUbCSQbLbCfNauD8SUs0AA


Eso no es cierto. Tomando como referencia esa cadena de texto que has proporcionado, el código que te he mostrado convierte los caracteres a bytes, genera un archivo con esos bytes, lee los bytes del archivo y los vuelve a convertir a caracteres, obteniendo así exactamente la misma cadena de texto que has proporcioando.

Cita de: **Aincrad** en 15 Mayo 2019, 19:42 PM
Escribiendo el archivo con File.WriteAllBytes me genera un .exe totalmente dañando.

Algo debes estar haciendo incorrectamente. Los bytes que escribes con el métofo File.WriteAllBytes() son los mismos que lees del archivo con la función File.ReadAllBytes(), es literalmente una copia del archivo.

Saludos.