Does anyone know how to get grep, or similar tool, to retrieve offsets of hex strings in a file?
I have a bunch of hexdumps (from GDB) that I need to check for strings and then run again and check if the value has changed.
I have tried hexdump
and dd
, but the problem is because it's a stream, I lose my offset for the files.
Someone must have had this problem and a workaround. What can I do?
To clarify:
- I have a series of dumped memory regions from GDB (typically several hundred MB)
- I am trying to narrow down a number by searching for all the places the number is stored, then doing it again and checking if the new value is stored at the same memory location.
- I cannot get
grep
to do anything because I am looking for hex values so all the times I have tried (like a bazillion, roughly) it will not give me the correct output. - The hex dumps are just complete binary files, the paterns are within float values at larges so 8? bytes?
- The patterns are not line-wrapping, as far as I am aware. I am aware of the what it changes to, and I can do the same process and compare the lists to see which match.
Perl COULD be a option, but at this point, I would assume my lack of knowledge with bash and its tools is the main culprit.
Desired output format
It's a little hard to explain the output I am getting since I really am not getting any output.
I am anticipating (and expecting) something along the lines of:
<offset>:<searched value>
Which is the pretty well standard output I would normally get with grep -URbFo <searchterm> . > <output>
What I tried:
A. Problem is, when I try to search for hex values, I get the problem of if just not searching for the hex values, so if I search for 00 I should get like a million hits, because thats always the blankspace, but instead its searching for 00 as text, so in hex, 3030. Any idea's?
B. I CAN force it through hexdump or something of the link but because its a stream it will not give me the offsets and filename that it found a match in.
C. Using grep -b
option doesnt seem to work either, I did try all the flags that seemed useful to my situation, and nothing worked.
D. Using xxd -u /usr/bin/xxd
as an example I get a output that would be useful, but I cannot use that for searching..
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 ................
Nice output, just what I want to see, but it just doesn't work for me in this situation..
E. Here are some of the things I've tried since posting this:
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.....
grep -b srchTarget file file ...
? The-b
means binary search. Reading the man page for GNU grep doesn't make me certain that it will help with your situation, but it's worth a try. ( GNU grep man page seems to say that-b
is for DOS versus Unix line endings. I had assumed from other posts here on S.O. that it would also deal with NUL (\000) chars, like in a hex dump. I don't have a way to test this right now). Good luck. – Jerkyxxd -u /usr/bin/xxd | grep 'srchTarg'
doesn't give you what you want? With srchTarg being the hex string you are looking for? Give us an example besides3030
. Also please compose a sample of output you need and paste in in using the formatting tools at the top of the edit box; Hover over{}
and you'll see 'Code Sample ..'. Good luck. – Jerkyxxd -u /usr/bin/xxd | grep 'DF'
. And if you don't like the output fromxxd -u /usr/bin/xxd | grep -H 'DF'
because of the header (like)(standard input):
. then tryxxd -u /usr/bin/xxd > /tmp/xxd.hex ; grep -H 'DF' /tmp/xxd.hex
. Good luck. – Jerky