bash - una - grep expresiones regulares
Usando grep para buscar cadenas hexagonales en un archivo (6)
Acabo de usar esto:
grep -c $''/x0c'' filename
Para buscar y contar un carácter de control de página en el archivo ...
Para incluir un desplazamiento en la salida:
grep -b -o $''/x0c'' filename | less
Simplemente estoy canalizando el resultado a menos porque el personaje que estoy buscando no se imprime bien y menos muestra los resultados limpiamente. Ejemplo de salida:
21:^L
23:^L
2005:^L
He estado intentando todo el día hacer que esto funcione. ¿Alguien sabe cómo obtener grep, o algo por el estilo, para recuperar las compensaciones de cadenas hexagonales en un archivo?
Tengo un montón de hexdumps que necesito verificar para buscar cadenas y luego ejecutarlos nuevamente y verificar si el valor ha cambiado.
He intentado con hexdump y dd, pero el problema es que es una transmisión, pierdo mi compensación para los archivos.
Alguien debe haber tenido este problema y una solución alternativa. ¿Que puedo hacer?
Para aclarar, tengo una serie de regiones de memoria descargadas de GDB.
Estoy tratando de reducir un número buscando todos los lugares donde está almacenado el número, y luego volviéndolo a hacer y comprobando si el nuevo valor está almacenado en la misma ubicación de memoria.
No puedo hacer que grep haga nada porque estoy buscando valores hexadecimales así que todas las veces que lo he intentado (como un bazillion, más o menos) no me dará el resultado correcto.
Los volcados hexadecimales son solo archivos binarios completos, los patrones están dentro de los valores de flotación en mayores así que 8? bytes?
Los patrones no están envolviendo las líneas de las que soy consciente. Soy consciente de en qué cambia, y puedo hacer el mismo proceso y comparar las listas para ver qué coincidencia. Las descargas hexagonales normalmente terminan (en total) 100 megas-ish.
Perl PODRÍA ser una opción, pero en este punto, asumiría que mi falta de conocimiento con bash y sus herramientas es el principal culpable.
Es un poco difícil de explicar el resultado que estoy obteniendo ya que realmente no estoy obteniendo ningún resultado.
Estoy anticipando (y esperando) algo como:
<offset>:<searched value>
Que es la salida estándar bastante buena que normalmente obtendría con grep -URbFo <searchterm> . > <output>
grep -URbFo <searchterm> . > <output>
El problema es que, cuando trato de buscar valores hexadecimales, me sale el problema si no busco los valores hexadecimales, así que si busco 00 debería obtener un millón de visitas, porque ese es siempre el espacio en blanco, pero en su lugar está buscando para 00 como texto, entonces en hexadecimal, 3030. ¿Alguna idea es?
PUEDO forzarlo a través de hexdump o algo del enlace pero debido a que es una transmisión no me dará los desplazamientos y el nombre de archivo con los que encontró una coincidencia.
Usar la opción grep -b
tampoco parece funcionar, probé todas las banderas que parecían útiles para mi situación, y nada funcionó.
Usando xxd -u /usr/bin/xxd
como ejemplo obtengo un resultado que sería útil, pero no puedo usarlo para buscar.
0004760: 73CC 6446 161E 266A 3140 5E79 4D37 FDC6 s.dF..&j1@^yM7..
0004770: BF04 0E34 A44E 5BE7 229F 9EEF 5F4F DFFA ...4.N[."..._O..
0004780: FADE 0C01 0000 000C 0000 0000 0000 0000 ................
Buen resultado, justo lo que veo, pero simplemente no funciona para mí en esta situación ...
Estas son algunas de las cosas que he intentado desde publicar esto:
xxd -u /usr/bin/xxd | grep ''DF''
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S.....
root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H ''DF''
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S.....
Esto parece funcionar para mí:
grep --only-matching --byte-offset --binary --text --perl-regexp "</x-hex pattern>" <file>
forma corta:
grep -obUaP "</x-hex pattern>" <file>
Ejemplo:
grep -obUaP "/x01/x02" /bin/grep
Salida (cygwin binary):
153: </x01/x02>
33210: </x01/x02>
53453: </x01/x02>
Entonces puede grep esto otra vez para extraer compensaciones. Pero no olvides usar el modo binario nuevamente.
Intentamos varias cosas antes de llegar a una solución aceptable:
xxd -u /usr/bin/xxd | grep ''DF''
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S.....
root# grep -ibH "df" /usr/bin/xxd
Binary file /usr/bin/xxd matches
xxd -u /usr/bin/xxd | grep -H ''DF''
(standard input):00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S.....
Luego descubrimos que podíamos obtener resultados utilizables con
xxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H ''DF'' /tmp/xxd
Tenga en cuenta que el uso de un simple objetivo de búsqueda como ''DF'' coincidirá incorrectamente con los caracteres que se extienden a través de los límites de bytes, es decir,
xxd -u /usr/bin/xxd | grep ''DF''
00017b0: 4010 8D05 0DFF FF0A 0300 53E3 0610 A003 @.........S.....
--------------------^^
Entonces usamos una expresión regular ORed para buscar ''DF'' O ''DF'' (el searchTarget precedido o seguido por un espacio char).
El resultado final parece ser
xxd -u -ps -c 10000000000 DumpFile > DumpFile.hex
egrep '' DF|DF '' Dumpfile.hex
0001020: 0089 0424 8D95 D8F5 FFFF 89F0 E8DF F6FF ...$............
-----------------------------------------^^
0001220: 0C24 E871 0B00 0083 F8FF 89C3 0F84 DF03 .$.q............
--------------------------------------------^^
Si desea buscar cadenas imprimibles , puede usar:
strings -ao filename | grep string
las cadenas generarán todas las cadenas imprimibles desde un binario con desplazamientos, y grep buscará dentro.
Si quieres buscar cualquier cadena binaria , aquí está tu amigo:
También hay una herramienta muy útil llamada binwalk , escrita en python, que permite la coincidencia de patrones binarios (y mucho más). A continuación, le mostramos cómo buscaría una cadena binaria, que genera el desplazamiento en decimal y hex (de los docs ):
$ binwalk -R "/x00/x01/x02/x03/x04" firmware.bin
DECIMAL HEX DESCRIPTION
--------------------------------------------------------------------------
377654 0x5C336 Raw string signature
grep tiene un modificador -P que permite usar la sintaxis perl regexp, la perl regex permite mirar bytes, usando la sintaxis / x ..
para que pueda buscar una cadena hexadecimal dada en un archivo con: grep -aP "/xdf"
pero el outpt no será muy útil; de hecho, mejor hacer una expresión regular en la salida de hexdump;
Sin embargo, grep -P puede ser útil para encontrar solo archivos que matriculen un patrón binario dado. O para hacer una consulta binaria de un patrón que realmente sucede en el texto (ver por ejemplo Cómo regexp ideogramas CJK (en utf-8) )