Crear archivos binarios en UNIX
Esta pregunta estuvo ahí por un tiempo y pensé que debería ofrecer algunos puntos de bonificación si puedo hacer que funcione.
¿Qué hice? ...Recientemente en el trabajo, escribí un analizador que convertiría un archivo binario en un formato legible. El archivo binario no es un archivo Ascii con10101010
caracteres. Ha sido codificado en binario. Entonces si hago uncat
en el archivo, obtengo lo siguiente -
[jaypal~/Temp/GTP]$ cat T20111017153052.NEW
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!
??!
??#ripassword??W傅?W傆??0H??
#R??@Vtc@@(?ղ??n?POC01
Así que uséhexdump
utilidad para que el archivo muestre el siguiente contenido y lo redirija a un archivo. Ahora tenía mi archivo de salida, que era un archivo de texto que contenía valores hexadecimales.
[jaypal~/Temp/GTP]$ hexdump -C T20111017153052.NEW
00000000 3d 3d 01 f8 73 47 54 50 02 f1 d5 b2 be 4e e4 d7 |==..sGTP.....N..|
00000010 00 01 01 00 01 80 00 cc 57 e5 82 00 00 00 00 00 |........W.......|
00000020 00 00 00 00 00 00 00 00 87 d3 f5 13 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 10 |................|
00000040 01 01 0f 00 00 00 00 00 26 58 78 31 00 b3 54 c5 |........&Xx1..T.|
00000050 26 58 78 31 00 b4 3b 0a 00 00 ad 64 13 40 01 03 |&Xx1..;....d.@..|
00000060 23 16 65 f3 01 01 0b 91 30 19 48 99 f2 ff ff ff |#.e.....0.H.....|
00000070 ff ff ff 02 00 7c 00 dc 01 58 00 a0 40 40 28 02 |.....|...X..@@(.|
00000080 f1 d5 b2 b8 ca 56 74 50 4f 43 30 31 00 00 00 00 |.....VtPOC01....|
00000090 00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00 |...cc...........|
000000a0 00 00 00 65 45 00 00 b4 fb 6b 40 00 39 11 16 cd |[email protected]...|
000000b0 cc 57 e5 82 87 d3 f5 52 85 a1 08 4b 00 a0 69 02 |.W.....R...K..i.|
000000c0 32 10 00 90 00 00 00 00 ad 64 00 00 02 13 40 01 |2........d....@.|
Después de toneladas deawk
, sed
ycut
, el script convirtió los valores hexadecimales en texto legible. Para hacerlo, utilicé el posicionamiento de desplazamiento que marcaría la posición inicial y final de cada parámetro convertido. El archivo resultante después de toda conversión se ve así
[jaypal:~/Temp/GTP] cat textfile.txt
Beginning of DB Package Identifier: ==
Total Package Length: 508
Offset to Data Record Count field: 115
Data Source: GTP
Timestamp: 2011-10-25
Matching Site Processor ID: 1
DB Package format version: 1
DB Package Resolution Type: 0
DB Package Resolution Value: 1
DB Package Resolution Cause Value: 128
Transport Protocol: 0
SGSN IP Address: 220.206.129.47
GGSN IP Address: 202.4.210.51
¿Por qué lo hiceSoy ingeniero de pruebas y validar manualmente los archivos binarios fue un gran problema. Tuve que analizar manualmente los desplazamientos y usar una calculadora para convertirlos y validarlos contra Wireshark y GUI.
Ahora la parte de la preguntaDeseo hacer lo contrario de lo que hice. Este era mi plan:
Tiene un archivo de texto de entrada fácil de leer que tendríaParameters : Values
. El usuario simplemente puede poner valores junto a ellos (por ejemplo, Fecha sería un parámetro y el usuario puede dar la fecha que desea que tenga el archivo de datos). El script cortará toda la información relevante (información proporcionada por el usuario) del archivo de texto de entrada y los convertirá en valores hexadecimales. Una vez que el archivo se haya convertido a valores hexadecimales, deseo codificarlo nuevamente en binario.Primero se realizan tres pasos
Problemna vez que mi script convierte el archivo de texto de entrada en un archivo de texto con valores hexadecimales, obtengo un archivo como el siguiente notice que puedo hacercat
en es).
[visdba@hw-diam-test01 ParserDump]$ cat temp_file | sed 's/.\{32\}/&\n/g' | sed 's/../& /g'
3d 3d 01 fc 73 47 54 50 02 f1 d6 55 3c 9f 49 9c
00 01 01 00 01 80 00 dc ce 81 2f 00 00 00 00 00
00 00 00 00 00 00 00 00 ca 04 d2 33 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
01 01 0f 00 00 07 04 ea 00 00 ff ff 00 00 14 b7
00 00 ff ff 00 00 83 ec 00 00 83 62 54 14 59 00
60 38 34 f5 01 01 0b 58 62 70 11 60 f6 ff ff ff
ff ff ff 02 00 7c 00 d0 01 4c 00 b0 40 40 28 02
f1 d6 55 38 cb 2b 23 50 4f 43 30 31 00 00 00 00
00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00
Mi intención escodificad este archivo convertido en unbinari para que cuando lo hagacat
en el archivo, obtengo un montón de valores basura.
[jaypal~/Temp/GTP]$ cat temp.file
==?sGTP?ղ?N????W????&Xx1?T?&Xx1?;
?d@#e?
?0H????????|?X?@@(?ղ??VtPOC01
cceE??k@9??W傇??R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!
??!
Entonces, la pregunta es esta. @ ¿Cómo lo codifico de esta forma?
¿Por qué quiero hacer esto?No tenemos muchos mensajes GTP (Protocolo de túnel GPRS) en producción. Pensé que si hacía ingeniería inversa en esto, podría crear efectivamente un generador de datos y crear mis propios datos.
Suma las cosas Puede haber herramientas sofisticadas, pero no quiero pasar mucho tiempo aprendiéndolas. Han pasado alrededor de 2 meses, he empezado a trabajar en la plataforma * nix y solo estoy manejando sus herramientas eléctricas comosed
yawk
.
o que sí quiero es ayuda y orientación para que esto suceda.
Gracias de nuevo por leer! 200 puntos esperan a alguien que pueda guiarme en la dirección correcta. :)
Archivos de muestrAquí hay una muestra de OriginalArchivo binari
Aquí hay una muestra deInput Text File que permitiría al usuario introducir valores
Aquí hay una muestra deArchiv que crea mi script después de que se complete toda la conversión del archivo de texto de entrada.
¿Cómo cambio la codificación deFile 3
aFile 1
?