Câu hỏi Làm cách nào để so sánh các tệp nhị phân trong Linux?


Tôi cần so sánh hai tệp nhị phân và nhận được kết quả đầu ra trong biểu mẫu

<fileoffset-hex> <file1-byte-hex> <tệp2-byte-hex>

cho mỗi byte khác nhau. Do đó, nếu file1.bin Là

  00 90 00 11

ở dạng nhị phân và file2.bin Là

  00 91 00 10

Tôi muốn có một cái gì đó như

  00000001 90 91
  00000003 11 10

Cách dễ nhất để hoàn thành mục tiêu là gì? Công cụ chuẩn? Một số công cụ của bên thứ ba?

(Chú thích: cmp -l nên được giết bằng lửa, nó sử dụng một hệ thập phân cho các offset và bát phân cho các byte.)


253
2018-03-29 15:28


gốc


về cơ bản bạn đang tìm kiếm "khác biệt nhị phân". tôi có thể tưởng tượng một số dòng lệnh xấu xí reeeally one-liner od... - quack quixote
@quack quixote: Điều gì xấu xí về một lớp lót? ;) - Bobby
xdelta.org hoạt động khá tốt. Có lẽ nó đáng để xem xét nó. - thatjuan


Các câu trả lời:


Điều này sẽ in offset và byte trong hex:

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

Hay làm $1-1 để có bản in offset đầu tiên được in ở 0.

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'

Không may, strtonum() cụ thể cho GAWK, vì vậy đối với các phiên bản khác của awk — ví dụ: mawk — bạn sẽ cần phải sử dụng hàm chuyển đổi bát phân sang thập phân. Ví dụ,

cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct,     dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'

Bị hỏng để dễ đọc:

cmp -l file1.bin file2.bin |
    mawk 'function oct2dec(oct,    dec) {
              for (i = 1; i <= length(oct); i++) {
                  dec *= 8;
                  dec += substr(oct, i, 1)
              };
              return dec
          }
          {
              printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)
          }'

143
2018-03-29 16:30



Thật không may, điều này mang lại cho tôi awk: line 2: function strtonum never defined lỗi trên Ubuntu 12.04. Triển khai AWK cụ thể có lẽ là gì? - gertvdijk
@gertvdijk: strtonum cụ thể cho GAWK. Tôi tin rằng Ubuntu trước đây đã sử dụng GAWK làm mặc định, nhưng đã chuyển sang một số điểm mawk. Trong mọi trường hợp, GAWK có thể được cài đặt và đặt thành mặc định (xem thêm man update-alternatives). Xem câu trả lời cập nhật của tôi cho giải pháp không yêu cầu strtonum. - Dennis Williamson
Tôi đã thêm vào ký tự gốc và đặt nó vào menu mc, tôi phải tăng gấp đôi dấu%: cmp -l %d/%f %D/%f | gawk '{printf "%%08X %%02X %%02X %%c %%c\n", $1-1, strtonum(0$2), strtonum(0$3), strtonum(0$2), strtonum(0$3)}' - 18446744073709551615


Như ~ quack chỉ ra:

 % xxd b1 > b1.hex
 % xxd b2 > b2.hex

Và sau đó

 % diff b1.hex b2.hex

hoặc là

 % vimdiff b1.hex b2.hex

137
2018-03-29 16:07



Trong Bash: diff <(xxd b1) <(xxd b2) nhưng định dạng đầu ra của điều này (hoặc của bạn) là hư không gần những gì OP yêu cầu. - Dennis Williamson
với vimdiff, nó sẽ tô màu các byte trong các dòng mà hai 'tệp' khác nhau - akira
Điều này làm việc tuyệt vời cho tôi (với opendiff trên OS X thay vì vimdiff) - chế độ xem mặc định xxdcung cấp các công cụ khác nhau trên đường so sánh byte-by-byte. Với hex (thô) đơn giản chỉ cần cột phù hợp với fold, diff sẽ cố gắng gấp / nhóm các công cụ ngẫu nhiên trong các tệp tôi đã so sánh. - natevw
Lệnh này không hoạt động tốt cho việc loại bỏ thêm byte, vì mọi dòng sau sẽ bị lệch và được xem là sửa đổi bởi diff. Giải pháp là đặt 1 byte trên mỗi dòng và xóa cột địa chỉ theo đề xuất của John Lawrence Aspden và tôi. - Ciro Santilli 新疆改造中心 六四事件 法轮功
Câu trả lời của bạn là hoàn hảo cho các tập tin nhỏ, nhưng không sao cho những người lớn. - peterh


Thử diff trong sự kết hợp sau của thay thế quá trình zsh / bash và colordiff trong CLI:

diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff

Ở đâu:

  • -y cho bạn thấy sự khác biệt song song (tùy chọn)
  • xxd là công cụ CLI để tạo đầu ra hexdump của tệp nhị phân
  • colordiff sẽ tô màu diff đầu ra (cài đặt qua: sudo apt-get install colordiff)
  • thêm vào -W200 đến diff cho đầu ra rộng hơn

Gợi ý:

  • nếu tệp lớn, hãy thêm giới hạn (ví dụ: -l1000) cho mỗi xxd

Đầu ra mẫu:

binary file output in terminal - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff


57
2017-09-05 21:14



Lệnh có thể được đơn giản hóa thành colordiff -y <(xxd foo1.bin) <(xxd foo2.bin). - golem
Nếu bạn không có colordiff, điều này sẽ làm điều tương tự mà không có màu sắc: diff -y <(xxd foo1.bin) <(xxd foo2.bin) - Rock Lee
Nếu bạn chỉ muốn biết liệu cả hai tệp có thực sự giống nhau hay không, bạn có thể sử dụng -q hoặc là --brief chuyển đổi, sẽ chỉ hiển thị đầu ra khi các tệp khác nhau. - Stefan van den Akker
tạo một hàm xxddiff cho điều này với: xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; ) - rubo77
tuyệt quá! vẫn, diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -  sẽ làm một công việc tốt enoug - ribamar


Có một công cụ gọi là DHEX có thể thực hiện công việc và có một công cụ khác được gọi là VBinDiff.

Để có cách tiếp cận đúng dòng lệnh, hãy thử JDIFF.


48
2018-03-29 15:41



DHEX là tuyệt vời so sánh nhị phân là những gì bạn muốn làm. Cho nó hai tập tin và nó sẽ đưa bạn đến một cái nhìn so sánh, làm nổi bật sự khác biệt, với khả năng dễ dàng để di chuyển đến sự khác biệt tiếp theo. Ngoài ra nó có thể làm việc với các thiết bị đầu cuối lớn, rất hữu ích trên màn hình màn ảnh rộng. - Marcin
Tôi thích VBinDiff hơn. DHEX đang sử dụng CPU ngay cả khi chạy không tải, tôi nghĩ rằng nó đang vẽ lại mọi lúc hay gì đó. VBinDiff không hoạt động với các thiết bị đầu cuối rộng. Tuy nhiên, các địa chỉ trở nên kỳ lạ với các thiết bị đầu cuối rộng, vì bạn có nhiều hơn 16 byte mỗi hàng. - Janus Troelsen
vbindiff cho phép chúng tôi thực sự chỉnh sửa tệp, thx! - Aquarius Power
Các tệp nén @DanielBeauyat sẽ hoàn toàn khác sau khi bạn gặp byte đầu tiên khác nhau. Đầu ra không có khả năng hữu ích. - Mark Ransom
@ 1111161171159459134 jdiff là một phần của một "bộ" các chương trình để đồng bộ và vá những khác biệt được tìm thấy bởi jdiff. Tuy nhiên, như Mark Ransom đã nói, điều đó thường sẽ không khôn ngoan trên các tệp nén; ngoại lệ là các định dạng nén "đồng bộ hóa" (như được tạo ra bởi gzip --rsyncable), trong đó các khác biệt nhỏ trong các tệp không nén nên có tác động hạn chế đối với tệp nén. - hmijail


Phương thức hoạt động để bổ sung / xóa byte

diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)

Tạo một trường hợp thử nghiệm với một lần loại bỏ byte 64:

for i in `seq 128`; do printf "%02x" "$i"; done | xxd -r -p > file1
for i in `seq 128`; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2

Đầu ra:

64d63
<  40

Nếu bạn cũng muốn xem phiên bản ASCII của ký tự:

bdiff() (
  f() (
    od -An -tx1c -w1 -v "$1" | paste -d '' - -
  )
  diff <(f "$1") <(f "$2")
)

bdiff file1 file2

Đầu ra:

64d63
<   40   @

Thử nghiệm trên Ubuntu 16.04.

tôi thích od kết thúc xxd bởi vì:

  • là POSIX, xxd không phải là (đi kèm với Vim)
  • -An để xóa cột địa chỉ mà không cần awk.

Giải thích lệnh:

  • -An loại bỏ cột địa chỉ. Điều này quan trọng nếu không tất cả các dòng sẽ khác nhau sau khi thêm / xóa byte.
  • -w1 đặt một byte trên mỗi dòng, để diff có thể tiêu thụ nó. Nó là rất quan trọng để có một byte trên mỗi dòng, hoặc người nào khác mỗi dòng sau khi xóa sẽ trở thành ngoài giai đoạn và khác nhau. Thật không may, đây không phải là POSIX, nhưng có trong GNU.
  • -tx1 là biểu diễn bạn muốn, thay đổi thành bất kỳ giá trị nào có thể, miễn là bạn giữ 1 byte trên mỗi dòng.
  • -v ngăn chặn viết tắt lặp lại dấu hoa thị * có thể can thiệp vào sự khác biệt
  • paste -d '' - - tham gia mỗi hai dòng. Chúng ta cần nó vì hex và ASCII đi vào các đường liền kề riêng biệt. Được lấy từ: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
  • chúng tôi sử dụng dấu ngoặc đơn () định nghĩa bdiff thay vì {} để giới hạn phạm vi của hàm bên trong f, Xem thêm: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash

Xem thêm:


25
2018-04-04 20:31





Câu trả lời ngắn

vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)

Khi sử dụng hexdumps và văn bản khác để so sánh các tệp nhị phân, đặc biệt là xxd, việc bổ sung và loại bỏ các byte trở thành thay đổi trong việc giải quyết có thể gây khó khăn cho việc xem. Phương thức này cho biết xxd không xuất ra địa chỉ và chỉ xuất ra một byte trên mỗi dòng, từ đó cho biết chính xác byte nào đã được thay đổi, thêm vào hoặc loại bỏ. Bạn có thể tìm thấy các địa chỉ này sau bằng cách tìm kiếm chuỗi các byte thú vị trong một hexdump "bình thường" hơn (đầu ra của xxd first.bin).


12
2018-04-22 12:10



(Tất nhiên, người ta có thể sử dụng diff thay vì vimdiff.) - VasyaNovikov


Tôi muốn giới thiệu hexdump để bán các tệp nhị phân sang định dạng văn bản và kdiff3 để xem khác.

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex

10
2018-06-12 07:46



Ngay cả ở đây trong bash kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin) không cần tạo tệp myfile1.hex và myfile2.hex. - Hastur


Các hexdiff là một chương trình được thiết kế để thực hiện chính xác những gì bạn đang tìm kiếm.

Sử dụng:

hexdiff file1 file2

Nó hiển thị hex (và 7-bit ASCII) của hai tập tin ở trên kia, với bất kỳ sự khác biệt nào được đánh dấu. Nhìn vào man hexdiff để các lệnh di chuyển trong tệp và đơn giản q sẽ bỏ thuốc lá.


4
2017-10-07 04:11



Nhưng nó có một công việc khá tệ khi nói đến phần so sánh. Nếu bạn chèn một số byte vào một tệp, nó sẽ đánh dấu tất cả các byte sau đó là các thay đổi - Murmel
và hexdiff không có sẵn thông qua apt-get trên Ubuntu 16.4 - rubo77


Nó có thể không trả lời đúng câu hỏi, nhưng tôi sử dụng nó cho các nhị phân khác:

gvim -d <(xxd -c 1 ~/file1.bin | awk '{print $2, $3}') <(xxd -c 1 ~/file2.bin | awk '{print $2, $3}')

Nó in cả hai tập tin ra dưới dạng hex và ASCII các giá trị, một byte trên mỗi dòng, và sau đó sử dụng cơ sở diff của Vim để hiển thị chúng một cách trực quan.


3
2017-09-07 15:47





https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html

BinDiff là một công cụ giao diện người dùng tuyệt vời để so sánh các tệp nhị phân đã được mở nguồn gần đây.


0
2018-03-23 20:18



Nó có thể được sử dụng trên các tệp nhị phân tùy ý không? Trang đó dường như chỉ ra rằng nó chỉ hữu ích để so sánh các tập tin thực thi đã được tháo rời bởi Hex-Rays IDA Pro. - eswald


dhex http://www.dettus.net/dhex/

DHEX không chỉ là một trình soạn thảo hex khác: Nó bao gồm một chế độ khác, có thể được sử dụng để so sánh dễ dàng và thuận tiện hai tệp nhị phân. Kể từ khi nó được dựa trên ncurses và là themeable, nó có thể chạy trên bất kỳ số lượng các hệ thống và kịch bản. Với việc sử dụng nhật ký tìm kiếm, có thể theo dõi các thay đổi trong các lần lặp lại các tệp khác nhau một cách dễ dàng.


0
2017-08-18 11:25



Chào mừng bạn đến với SuperUser! Mặc dù phần mềm này trông giống như nó có thể giải quyết vấn đề của OP, quảng cáo thuần túy được tán thành mạnh mẽ trên mạng Stack Exchange. Nếu bạn được liên kết với trình soạn thảo của phần mềm này, vui lòng tiết lộ thông tin này. Và cố gắng viết lại bài đăng của bạn để nó trông giống như quảng cáo. Cảm ơn bạn. - Nathan.Eilisha Shiraini
Tôi không liên kết với dhex bằng bất kỳ cách nào. Tôi đã sao chép mô tả của tác giả vào bài đăng vì có giới hạn độ dài bài đăng tối thiểu - Vincent Vega
Đã được đề cập tại: superuser.com/a/125390/128124 - Ciro Santilli 新疆改造中心 六四事件 法轮功