Làm cách nào tôi có thể grep một giá trị hex trong một chuỗi trong tệp nhị phân?


7

Tôi có một tệp nhị phân như thế này (mở trong Emacs chế độ hex): Làm cách nào tôi có thể grep nếu giá trị hex '22081b00081f091d2733170d123f3114' tồn tại trong tệp?

00000000: 2b08 1b00 1418 0825 0407 3830 271d 170d  +......%..80'...
00000010: 2208 1b00 081f 091d 2733 170d 123f 3114  ".......'3...?1.
00000020: 1909 1b00 0934 1f10 2503 3803 111c 3821  .....4..%.8...8!

Trong ví dụ của tôi, nó sẽ trả về một lần truy cập vì các giá trị hex mà tôi đang tìm kiếm nằm ở địa chỉ 0x10.


Điều gì xảy ra nếu bạn grep cho nó? grep 2208 1b00 081f 091d 2733 170d 123f 3114, với các không gian.
terdon

grep biết P tùy chọn, vì vậy bạn có thể sử dụng grep -aP '\x22\x08\x1b...'. Câu trả lời là từ stackoverflow.com/questions/6319878/ - Tôi đoán bạn chỉ quan tâm đến mã số, vì vậy bạn nên chuyển hướng đầu ra sang /dev/null.
ott--

Sử dụng trình soạn thảo hex. "Hex Editor Neo" là một bản miễn phí tốt cho Windows. Tôi đoán có một số cho * nix là tốt.
Daniel R Hicks

Câu trả lời:


7

Bạn có thể dùng:

xxd -p /your/file | tr -d '\n' | grep -c '22081b00081f091d2733170d123f3114'

Nó sẽ trả về 1 nếu nội dung khớp, 0 khác.

xxd -p chuyển đổi tập tin thành kết xuất hex đơn giản, tr -d '\n' xóa các dòng mới được thêm vào bởi xxdgrep -c đếm số lượng dòng phù hợp.

Bằng cách này, đầu vào được khớp với bất kỳ vị trí nào trong tệp (nếu nó ở vị trí 0x18 trong ví dụ của bạn, nó sẽ bị cắt làm hai và grep sẽ không khớp với nó nếu không sử dụng tr ). Tuy nhiên, bạn không có vị trí của nó trong tập tin.


1
Đối với các chuỗi ngắn hơn, nó có thể khớp bắt đầu từ lần thứ hai của một byte, dẫn đến kết quả dương tính giả.
Ruslan

Để tránh kết hợp trên phần bù nibble, tôi đã sử dụng sed để thêm khoảng trắng xung quanh mỗi byte: xxd -p | tr -d '\n' | sed -e 's/../\0 /g' | grep -q '12 34'
Mr. DOS

2

Với các greps sau này, bạn chắc chắn có thể thực hiện tìm kiếm chuỗi hex và hơn thế nữa. Bạn có thể làm nó với đầy đủ biểu hiện thông thường (regrec) sức mạnh, chẳng hạn như 'tìm cho tôi chuỗi hex này theo sau 1 hoặc hơn 0 và sau đó là văn bản phù hợp với điều này và biểu thức chính quy này '

grep -aPo '\x01\x00\x00\x00[0-z]+\x00\x00\x00[0-z]+' <file>

không khớp các cặp đăng nhập / vượt qua trong một tệp với kết xuất nhị phân của luồng giao thức được sử dụng để kiểm soát và truy xuất các video có định dạng DHAV trong các hệ thống IP-DVR nhất định. Đó là, phần phù hợp phải có byte với mã hex 0x01 0x00 0x00 0x00 tiếp theo là đăng nhập ASCII rồi 0x00, hai nữa 0 byte và sau đó là mật khẩu.



Bạn sẽ không cần [!-~]+ cho mật khẩu?
Scott

0

grep không thể tự làm điều này - nó hoạt động ở cấp độ cao hơn và tìm kiếm văn bản được mã hóa.

Một giải pháp sẽ là sử dụng od để chuyển đổi nhị phân thành hex và xuất ra trong ASCII mà sau đó bạn có thể chuyển thành grep để tìm kiếm chuỗi hex:

od -t x -A n <input_file> | grep <hex string>

Tuy nhiên, điều này gây ra nhiều vấn đề hơn vì nó chèn dòng mới và dấu cách để định dạng hex. Để xử lý việc bạn có thể thử sử dụng sed.


1
Tôi sẽ không nói điều đó grep không thể làm điều đó (xem câu trả lời của @ gb0tech và stackoverflow.com/questions/4180081/binary-grep-on-linux ), nhưng giải thích rằng nó hoạt động trên văn bản được mã hóa chắc chắn là đúng và hữu ích. Cũng có tác động tối thiểu đến hiệu suất nếu bạn cần chuyển đổi mọi thứ thành chuỗi hex với od trước khi gre.
Karl Richter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.