मैं लिनक्स में बाइनरी फ़ाइलों की तुलना कैसे करूं?


303

मुझे दो बाइनरी फ़ाइलों की तुलना करने और फॉर्म में आउटपुट प्राप्त करने की आवश्यकता है:

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

हर अलग बाइट के लिए। तो अगर file1.binहै

  00 90 00 11

द्विआधारी रूप में है और file2.binहै

  00 91 00 10

मैं कुछ पाने की चाहत रखता हूं

  00000001 90 91
  00000003 11 10

क्या लिनक्स में ऐसा करने का कोई तरीका है? मैं इसके बारे में जानता हूं cmp -lलेकिन यह बाइट्स के लिए ऑफसेट और ऑक्टल के लिए एक दशमलव प्रणाली का उपयोग करता है जिससे मैं बचना चाहूंगा।


9
आप मूल रूप से "बाइनरी डिफरेंस" की तलाश कर रहे हैं। मैं कुछ reeeally बदसूरत कमांडलाइन के साथ एक लाइनर की कल्पना कर सकते हैं od...
quixote

2
@ क्वैक क्विक्सोट: एक-लाइनर के बारे में क्या बदसूरत है? ;)
बॉबी

xdelta.org काफी अच्छा काम करता है। शायद यह देखने लायक होगा।
thatjuan

क्योंकि आप इस सवाल का जवाब नहीं दे सकते हैं (जैसा कि आप एक उपयोगकर्ता नहीं हैं), मैं बंद करने के लिए मतदान कर रहा हूं। एक बाइनरी अंतर के रूप में स्पष्ट रूप से अनुरोध किया गया है कि यह सब उपयोगी नहीं है, और मुझे लगता है कि आप कुछ उपयोगी चाहते हैं, अगर आप फ़ाइल के शुरू में एक बाइट सम्मिलित करते हैं , तो सभी बाइट्स को अलग होने के रूप में चिह्नित किया जाना चाहिए? बिना यह जाने कि, यह बहुत अस्पष्ट है।
इवान कैरोल

2
@EvanCarroll अगर आपको लगता है कि यह सवाल बंद है तो आप इसका जवाब क्यों दे रहे हैं?
DavidPostill

जवाबों:


174

यह हेक्स में ऑफसेट और बाइट्स प्रिंट करेगा:

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

या $1-10 पर पहली मुद्रित ऑफसेट शुरू करने के लिए।

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

दुर्भाग्य से, strtonum()GAWK के लिए विशिष्ट है, इसलिए जाग के अन्य संस्करणों के लिए - उदाहरण के लिए, mawk- आपको एक ऑक्टल-टू-दशमलव रूपांतरण फ़ंक्शन का उपयोग करना होगा। उदाहरण के लिए,

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)}'

पठनीयता के लिए टूट गया:

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)
          }'

3
@gertvdijk: GAWK के strtonumलिए विशिष्ट है। मेरा मानना ​​है कि उबंटू पहले GAWK को डिफ़ॉल्ट के रूप में उपयोग करता था, लेकिन कुछ बिंदु पर स्विच किया गया mawk। किसी भी स्थिति में, GAWK को स्थापित किया जा सकता है और डिफ़ॉल्ट पर सेट किया जा सकता है (यह भी देखें man update-alternatives)। एक समाधान के लिए मेरे अपडेट किए गए उत्तर को देखें जिसकी आवश्यकता नहीं है strtonum
डेनिस विलियमसन

बस दोनों फाइलों के sha256sum की तुलना क्यों नहीं की?
रॉड्रिगो

1
@ रोड्रिगो: यह और विभिन्न अन्य तरीके सिर्फ यह बताएंगे कि क्या फाइलें अलग हैं। मेरा जवाब ओपी की आवश्यकता को वास्तव में दिखाने के लिए मिलता है कि अंतर क्या हैं।
डेनिस विलियमसन

बेशक! क्षमा करें, मैं मेरी समस्या से इतना चिंतित था कि मैंने मुश्किल से ओपी को पढ़ा। धन्यवाद।
रॉड्रिगो

165

जैसा कि ~ क्वैक ने बताया:

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

और तब

 % diff b1.hex b2.hex

या

 % vimdiff b1.hex b2.hex

70
बैश में: diff <(xxd b1) <(xxd b2)लेकिन यह (या तुम्हारा) का आउटपुट प्रारूप कहीं नहीं है जो ओपी ने पूछा है।
डेनिस विलियमसन

6
vimdiff के साथ यह है, यह उन पंक्तियों में बाइट को रंग देगा जहां दो 'फाइलें' अलग हैं
akira

Aww, मैंने ऐसा क्यों नहीं सोचा? और मुझे यकीन है कि मैंने इस तकनीक का इस्तेमाल अतीत में भी किया है।
njd

1
यह मेरे लिए बहुत अच्छा काम किया ( opendiffओएस एक्स के बजाय vimdiff) के साथ - डिफ़ॉल्ट दृश्य xxdबाइट-बाय-बाइट की तुलना में ट्रैक पर अलग इंजन रखता है। सादे (कच्चे) हेक्स के साथ बस कॉलम-फिट के साथ fold, diffउन फ़ाइलों में यादृच्छिक सामान को मोड़ने / समूह करने की कोशिश करूँगा , जिनकी मैं तुलना कर रहा था।
natevw

1
यह कमांड बाइट को हटाने के लिए अच्छी तरह से काम नहीं करता है, क्योंकि इसके बाद आने वाली हर लाइन को गलत तरीके से और संशोधित रूप में देखा जाएगा diff। समाधान प्रति पंक्ति 1 बाइट डालना है और जॉन लॉरेंस एस्पेन और मेरे द्वारा प्रस्तावित पते के कॉलम को हटाना है
सिरो सेंटिल्ली 38 i i i ''

97

diff + xxd

diffZsh / bash प्रक्रिया प्रतिस्थापन के निम्नलिखित संयोजन में प्रयास करें :

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

कहाँ पे:

  • -y आपको अगल-बगल (वैकल्पिक) अंतर दिखाता है।
  • xxd बाइनरी फ़ाइल के हेक्सडंप आउटपुट बनाने के लिए सीएलआई उपकरण है।
  • जोड़े -W200को diffव्यापक उत्पादन के लिए (प्रति पंक्ति 200 के अक्षर)।
  • रंगों के लिए, colordiffनीचे दिखाए अनुसार उपयोग करें।

colordiff + xxd

यदि आप colordiff, यह diffआउटपुट को रंगीन कर सकते हैं , जैसे:

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

अन्यथा के माध्यम से स्थापित: sudo apt-get install colordiff

नमूना उत्पादन:

टर्मिनल में बाइनरी फ़ाइल आउटपुट - diff -y <(xxd foo1.bin) <(xxd foo2.bin) |  colordiff

vimdiff + xxd

आप भी उपयोग कर सकते हैं vimdiff, जैसे

vimdiff <(xxd foo1.bin) <(xxd foo2.bin)

संकेत:

  • यदि फ़ाइलें बहुत बड़ी हैं, तो -l1000प्रत्येक के लिए सीमा (जैसे ) जोड़ेंxxd

11
कमांड को सरल बनाया जा सकता है colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
गोलेम १

3
यदि आपके पास कोर्डिफ़ नहीं है, तो यह रंगों के बिना एक ही काम करेगा:diff -y <(xxd foo1.bin) <(xxd foo2.bin)
रॉक ली

5
यदि आप केवल यह जानना चाहते हैं कि क्या दोनों फाइलें वास्तव में समान हैं, तो आप -qया --briefस्विच का उपयोग कर सकते हैं , जो कि फाइलों के अलग होने पर केवल आउटपुट दिखाएगा।
स्टेफन वैन डेन अककर

1
xxddiffइसके साथ एक फंक्शन बनाएं :xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
rubo77

2
महान! फिर भी, diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim - एक अच्छा काम करेंगे
रिगमार

56

डीएचईएक्स नामक एक उपकरण है जो काम कर सकता है, और एक अन्य उपकरण है जिसे वीबीडिफ कहा जाता है ।

कड़ाई से कमांड-लाइन दृष्टिकोण के लिए, जोजोडिफ का प्रयास करें


8
DHEX कमाल है बायनेरिज़ की तुलना करना जो आप करना चाहते हैं। इसे दो फ़ाइलों को खिलाएं और यह आपको एक तुलनात्मक दृष्टिकोण पर ले जाता है, मतभेदों पर प्रकाश डाला, अगले अंतर पर जाने की आसान क्षमता के साथ। इसके अलावा यह बड़े टर्मिनलों के साथ काम करने में सक्षम है, जो वाइडस्क्रीन मॉनिटर पर बहुत उपयोगी है।
मार्सिन

7
मुझे VBinDiff पसंद है। DHEX सीपीयू का उपयोग तब भी कर रहा है, जब मुझे लगता है कि यह हर समय या कुछ और काम कर रहा है। VBinDiff हालांकि विस्तृत टर्मिनलों के साथ काम नहीं करता है। लेकिन पते व्यापक टर्मिनलों के साथ वैसे भी अजीब हो जाते हैं, क्योंकि आपके पास प्रति पंक्ति 16 से अधिक बाइट्स हैं।
Janus Troelsen

1
vbindiff हमें वास्तव में फ़ाइल को संपादित करने देता है, thx!
कुंभ राशि

2
@DanielBeauyat संपीड़ित फ़ाइलें आपके द्वारा पहले अलग बाइट का सामना करने के बाद पूरी तरह से अलग होंगी। आउटपुट उपयोगी होने की संभावना नहीं है।
मार्क रैनसम

2
@ 1111161171159459134 jdiff, jdiff द्वारा पाए गए अंतरों को समन्वयित करने और पैच करने के लिए कार्यक्रमों के "सूट" का हिस्सा है। लेकिन, जैसा कि मार्क रैनसम ने कहा, कि आम तौर पर संपीड़ित फ़ाइलों पर बुद्धिमान नहीं होगा; अपवाद "तुल्यकालिक" संकुचित प्रारूप है (जैसे कि gzip --rsyncable द्वारा निर्मित), जिसमें असम्पीडित फ़ाइलों में छोटे अंतर का संपीड़ित फ़ाइल पर सीमित प्रभाव होना चाहिए।
हमीजेल

27

विधि जो बाइट को जोड़ने / हटाने के लिए काम करती है

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

बाइट 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

आउटपुट:

64d63
<  40

यदि आप चरित्र का ASCII संस्करण भी देखना चाहते हैं:

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

bdiff file1 file2

आउटपुट:

64d63
<   40   @

उबंटू 16.04 पर परीक्षण किया गया।

मैं पसंद odकरता हूँ xxdक्योंकि:

  • यह POSIX है , xxdनहीं है (विम के साथ आता है)
  • के -Anबिना पता स्तंभ को निकालना है awk

कमांड स्पष्टीकरण:

  • -Anपता स्तंभ निकालता है। यह महत्वपूर्ण है अन्यथा बाइट जोड़ / हटाने के बाद सभी लाइनें अलग-अलग होंगी।
  • -w1प्रति पंक्ति एक बाइट डालता है, ताकि यह अलग-अलग उपभोग कर सके। प्रति पंक्ति एक बाइट का होना महत्वपूर्ण है, या फिर हर लाइन एक विलोपन के बाद चरण और अलग हो जाएगी। दुर्भाग्य से, यह POSIX नहीं है, लेकिन GNU में मौजूद है।
  • -tx1 वह प्रतिनिधित्व है जो आप चाहते हैं, जब तक आप प्रति पंक्ति 1 बाइट रखते हैं, तब तक किसी भी संभव मान में बदल सकते हैं।
  • -vतारांकन पुनरावृत्ति संक्षिप्त नाम को रोकता है *जो अंतर के साथ हस्तक्षेप कर सकता है
  • paste -d '' - -हर दो लाइनों में मिलती है। हमें इसकी आवश्यकता है क्योंकि हेक्स और एएससीआईआई अलग-अलग आसन्न लाइनों में जाते हैं। से लिया गया: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
  • हम आंतरिक फ़ंक्शन के दायरे को सीमित ()करने के bdiffबजाय परिभाषित करने के {}लिए कोष्ठक का उपयोग करते हैं f, यह भी देखें: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash

यह सभी देखें:


13

संक्षिप्त जवाब

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

बाइनरी फ़ाइलों की तुलना करने के लिए हेक्सडंप्स और टेक्स्ट का उपयोग करते समय, विशेष रूप से xxd, बाइट्स के जोड़ और हटाने को संबोधित करने में बदलाव हो जाते हैं, जो देखने में मुश्किल हो सकता है। यह विधि xxd को पतों को आउटपुट नहीं करने के लिए और प्रति पंक्ति केवल एक बाइट को आउटपुट करने के लिए कहती है, जो वास्तव में दिखाता है कि बाइट्स बदले गए, जोड़े गए, या निकाले गए। आप अधिक "सामान्य" हेक्सडंप (आउटपुट xxd first.bin) के बाइट्स के दिलचस्प दृश्यों की खोज करके बाद में पते पा सकते हैं ।


(बेशक, एक के diffबजाय उपयोग कर सकते हैं vimdiff।)
VasyaNovikov

11

मैं द्विआधारी फ़ाइलों को पाठ प्रारूप और kdiff3 को अलग-अलग देखने के लिए डंप करने के लिए हेक्सडंप की सिफारिश करूंगा।

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

2
यहां तक कि यहां बैश में kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)फ़ाइलों को बनाने की आवश्यकता के साथ myfile1.hexऔर myfile2.hex
हस्तुर

5

यह hexdiffएक ऐसा कार्यक्रम है जिसे आप वही खोज रहे हैं जो आप देख रहे हैं।

उपयोग:

hexdiff file1 file2

यह किसी भी अंतर को उजागर करने के साथ एक के ऊपर एक दो फाइलों के हेक्स (और 7-बिट एएससीआईआई) को प्रदर्शित करता है। को देखो man hexdiffआदेशों फाइल में चारों ओर ले जाने के लिए, और एक सरल qबंद हो जाएगा।


4
लेकिन जब यह तुलनात्मक भाग की बात आती है तो यह बहुत बुरा काम करता है। यदि आप एक फाइल में कुछ बाइट्स
डालते हैं

और हेक्सडिफ उबंटू 16.4
rubo77

1
@ सहमति देते समय, क्या मैं यहाँ नहीं पूछा जा रहा है?
इवान कैरोल

@EvanCarroll सच है, और इसलिए मैंने एक टिप्पणी छोड़ दी (केवल) और
डाउनवोट

मैंने भी मिक को वोट नहीं दिया, लेकिन मैं आपसे सहमत हूं और यहां जवाब दिया superuser.com/a/1373977/11116 क्योंकि यह संभावना है कि इस बुरे प्रश्न में सुधार या बंद हो जाएगा।
इवान कैरोल

3

यह सवाल का सख्ती से जवाब नहीं दे सकता है, लेकिन मैं इसे अलग-अलग बायनेरिज़ के लिए उपयोग करता हूं:

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

यह दोनों फाइलों को हेक्स और एएससीआईआई मानों के रूप में प्रिंट करता है, प्रति पंक्ति एक बाइट, और फिर उन्हें विज़ुअली रेंडर करने के लिए विम की सुविधा का उपयोग करता है।


0

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

डीएचईएक्स एक और हेक्स संपादक की तुलना में अधिक है: इसमें एक अलग मोड शामिल है, जिसका उपयोग आसानी से और आसानी से दो बाइनरी फ़ाइलों की तुलना करने के लिए किया जा सकता है। चूंकि यह ncurses पर आधारित है और यह उपयोग करने योग्य है, इसलिए यह किसी भी सिस्टम और परिदृश्य पर चल सकता है। खोज लॉग के उपयोग के साथ, आसानी से फ़ाइलों के विभिन्न पुनरावृत्तियों में परिवर्तनों को ट्रैक करना संभव है।


SuperUser में आपका स्वागत है! यद्यपि यह सॉफ़्टवेयर ऐसा दिखता है कि यह ओपी की समस्या को हल कर सकता है, लेकिन शुद्ध विज्ञापन स्टैक एक्सचेंज नेटवर्क पर दृढ़ता से डूब जाता है। यदि आप इस सॉफ़्टवेयर के संपादक से संबद्ध हैं, तो कृपया इस तथ्य का खुलासा करें। और अपने पोस्ट को फिर से लिखने की कोशिश करें ताकि यह एक वाणिज्यिक की तरह कम दिखे। धन्यवाद।
नाथन.इलिशा शिरनी

मैं किसी भी तरह से dhex से संबद्ध नहीं हूं। मैंने लेखक के विवरण को पोस्ट में कॉपी किया क्योंकि पोस्ट की न्यूनतम लंबाई सीमा है
विन्सेंट वेगा

: पहले ही उल्लेख किया superuser.com/a/125390/128124
सिरो Santilli新疆改造中心法轮功六四事件

0

आप gvimdiff टूल का उपयोग कर सकते हैं जो vim-gui-common पैकेज में शामिल है

sudo apt-get update

sudo apt-get install विम-गुई-आम

तब आप निम्न आदेशों का उपयोग करके 2 हेक्स फ़ाइलों की तुलना कर सकते हैं:

ubuntu> gvimdiff <hex-file1> <hex-file2>

थ के सभी। आशा है कि मदद!


0

फर्मवेयर विश्लेषण टूल में binwalkइसके -W/ --hexdumpकमांड लाइन विकल्प के माध्यम से एक विशेषता के रूप में भी है जो विकल्प प्रदान करता है जैसे कि केवल अलग-अलग बाइट्स दिखाने के लिए:

    -W, --hexdump                Perform a hexdump / diff of a file or files
    -G, --green                  Only show lines containing bytes that are the same among all files
    -i, --red                    Only show lines containing bytes that are different among all files
    -U, --blue                   Only show lines containing bytes that are different among some files
    -w, --terse                  Diff all files, but only display a hex dump of the first file

करते समय ओपी के उदाहरण में binwalk -W file1.bin file2.bin:

binwalk -W file1.bin file2.bin


-1

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

बिनडिफ़ बाइनरी फ़ाइलों की तुलना करने के लिए एक महान यूआई उपकरण है जो हाल ही में खुली हुई है।


3
क्या इसका उपयोग मनमाना बाइनरी फ़ाइलों पर किया जा सकता है, हालांकि? उस पृष्ठ से यह प्रतीत होता है कि यह केवल निष्पादन योग्यताओं की तुलना करने के लिए उपयोगी है जो हेक्स-रेज आईडीए प्रो द्वारा डिसाइड किया गया है।
22

-2

लिनक्स पर ओपन सोर्स प्रोडक्ट (और बाकी सब) रेडारे है जो radiff2इस उद्देश्य के लिए स्पष्ट रूप से प्रदान करता है । मैंने इसे बंद करने के लिए मतदान किया क्योंकि आपके और अन्य लोगों का एक ही सवाल है, आपके द्वारा पूछे गए प्रश्न में

हर अलग बाइट के लिए

हालांकि यह पागल है। जैसा कि पूछा गया है, यदि आप फ़ाइल में पहले बाइट में एक बाइट सम्मिलित करते हैं, तो आप पाएंगे कि प्रत्येक बाद की बाइट अलग थी और इसलिए एक बाइट के वास्तविक अंतर के लिए यह अंतर पूरी फ़ाइल को दोहराएगा।

थोड़ा अधिक व्यावहारिक है radiff -O। के -Oलिए "" क्या कोड निर्धारित ब्युटी ओपोड बाइट्स के बजाय सभी बाइट्स के साथ अलग है ""

0x000000a4 0c01 => 3802 0x000000a4
0x000000a8 1401 => 3802 0x000000a8
0x000000ac 06 => 05 0x000000ac
0x000000b4 02 => 01 0x000000b4
0x000000b8 4c05 => 0020 0x000000b8
0x000000bc 4c95 => 00a0 0x000000bc
0x000000c0 4c95 => 00a0 0x000000c0

आईडीए प्रो की तरह, रेडारे द्विआधारी विश्लेषण के लिए एक उपकरण प्राथमिक है, आप डेल्टा -dको अलग-अलग दिखा सकते हैं , या हेक्स के बजाय असंतुष्ट बाइट्स दिखा सकते हैं -D

यदि आप इस प्रकार के प्रश्न पूछ रहे हैं, तो देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.