ලිනක්ස් හි ද්විමය ගොනු සංසන්දනය කරන්නේ කෙසේද?


329

මට ද්විමය ලිපිගොනු දෙකක් සංසන්දනය කර ප්‍රතිදානය ස්වරූපයෙන් ලබා ගත යුතුය:

<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
ඔබ මූලික වශයෙන් සොයන්නේ "ද්විමය වෙනස" ය. මට හිතාගන්න පුළුවන් සමහර කැත විධාන රේඛා එක්-ලයිනර් සමඟ od...
quack quixote

2
@quack quixote: එක් ලයිනර් එකක කැත කුමක්ද? ;)
බොබී

xdelta.org ඉතා හොඳින් ක්‍රියා කරයි. සමහර විට එය දෙස බැලීම වටී.
thatjuan

ඔබට මෙම ප්‍රශ්නයට පිළිතුරු දිය නොහැකි නිසා (ඔබ පරිශීලකයෙකු නොවන බැවින්), මම ඡන්දය ප්‍රකාශ කරන්නේ වසා දැමීමට ය. මෙහි පැහැදිලිව ඉල්ලා ඇති ද්විමය වෙනසක් කිසිසේත්ම ප්‍රයෝජනවත් නොවන අතර, ඔබට ප්‍රයෝජනවත් යමක් අවශ්‍ය යැයි සිතීමට මම නැඹුරු වෙමි , ගොනුවේ ආරම්භයේ දී ඔබ එක් බයිට් එකක් ඇතුල් කළහොත් සියලු බයිට් වෙනස් යැයි සලකුණු කළ යුතුද? එය නොදැන මෙය සරලවම අපැහැදිලි ය.
ඉවාන් කැරොල්

2
AnEvanCarroll ප්‍රශ්නය මාතෘකාවෙන් බැහැර යැයි ඔබ සිතන්නේ නම් ඔබ එයට පිළිතුරු දෙන්නේ ඇයි?
ඩේවිඩ් පොස්ටිල්

Answers:


187

මෙය ඕෆ්සෙට් සහ බයිට් හෙක්ස් වලින් මුද්‍රණය කරයි:

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

නැතහොත් $1-1පළමු මුද්‍රිත ඕෆ්සෙට් ආරම්භය 0 ට ආරම්භ කිරීමට කරන්න.

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

අවාසනාවකට මෙන්, strtonum()GAWK සඳහා විශේෂිත වේ, එබැවින් awk - උදා, 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
Od රොඩ්රිගෝ: එය සහ වෙනත් විවිධ ක්‍රම මඟින් ගොනු වෙනස් දැයි පෙන්වයි. මගේ පිළිතුර සත්‍ය වශයෙන්ම වෙනස්කම් මොනවාදැයි පෙන්වීමට OP හි අවශ්‍යතාවය සපුරාලයි.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

ඇත්ත වශයෙන්! කණගාටුයි, මගේ ගැටලුව ගැන මා කොතරම් කනස්සල්ලට පත්වී ඇත්ද යත්, මම යන්තම් OP කියවා නැත. ඔබට ස්තුතියි.
රොඩ්රිගෝ

cmpපිළිතුර සමඟ ඇති වාසිය xxdනම් එය විශාල ලිපිගොනු වල විශාලත්වයේ ඇණවුම් වීමයි!
Ruslan

178

ලෙස ~ quack පෙන්වා:

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

ඊළගට

 % diff b1.hex b2.hex

හෝ

 % vimdiff b1.hex b2.hex

74
Bash හි: diff <(xxd b1) <(xxd b2)නමුත් මෙහි (හෝ ඔබගේ) ප්‍රතිදාන ආකෘතිය OP ඉල්ලූ දෙයට ආසන්නව නොමැත.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

7
එය විම්ඩිෆ් සමඟ නම්, එය ගොනු දෙක එකිනෙකට වෙනස් වන රේඛාවල බයිට් වර්ණවත් කරයි
අකිරා

ආ, ඇයි මම ඒ ගැන නොසිතුවේ? අතීතයේ දීත් මම මෙම තාක්ෂණය භාවිතා කර ඇති බව මට විශ්වාසයි.
njd

1
මෙය මට ඉතා හොඳය ( opendiffඕඑස් එක්ස් වෙනුවට ඕඑස් එක්ස් සමඟ vimdiff) - පෙරනිමි දසුන xxdමඟින් බයිට්-බයිට් හා සසඳන විට එන්ජිම ධාවන පථයේ තබා ගනී. සරල (අමු) හෙක්ස් සමඟ තීරු-ගැළපෙන පරිදි fold, diffමා සංසන්දනය කරන ලිපිගොනු වල අහඹු දේවල් නැවීමට / කණ්ඩායම් කිරීමට උත්සාහ කරනු ඇත.
natevw

1
බයිට් එකතු කිරීම ඉවත් කිරීම සඳහා මෙම විධානය හොඳින් ක්‍රියා නොකරයි, මන්ද පහත දැක්වෙන සෑම පේළියක්ම වැරදි ලෙස සකසා වෙනස් කරන ලද ලෙස පෙනෙනු ඇත diff. විසඳුම වන්නේ ජෝන් ලොරන්ස් ඇස්ප්ඩන් සහ මා විසින් යෝජනා කරන ලද පරිදි එක් පේළියකට බයිට් 1 ක් දමා ලිපින තීරුව ඉවත් කිරීමයි .
සිරෝ සැන්ටිලි 冠状 病毒 审查 六四 事件 事件

113

diff + xxd

diffZsh / bash ක්‍රියාවලි ආදේශනයේ පහත සංයෝජනයෙන් උත්සාහ කරන්න :

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

කොහෙද:

  • -y ඔබට පැති දෙපස වෙනස්කම් පෙන්වයි (අත්‍යවශ්‍ය නොවේ).
  • xxd ද්විමය ගොනුවේ හෙක්ස්ඩම්ප් ප්‍රතිදානයක් නිර්මාණය කිරීමට CLI මෙවලම වේ.
  • එකතු -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).
golem

3
ඔබට කොලර්ඩිෆ් නොමැති නම්, මෙය වර්ණ නොමැතිව එකම දේ කරනු ඇත:diff -y <(xxd foo1.bin) <(xxd foo2.bin)
රොක් ලී

7
ලිපිගොනු දෙකම සත්‍ය වශයෙන්ම සමාන දැයි දැන ගැනීමට ඔබට අවශ්‍ය නම්, ඔබට -qහෝ --briefස්විචය භාවිතා කළ හැකිය, එය ගොනු වෙනස් වන විට පමණක් ප්‍රතිදානය පෙන්වයි.
ස්ටෙෆාන් වැන් ඩෙන් අක්කර්

2
මහා! තවමත්, diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim - හොඳ රැකියාවක් කරනු ඇත
රිබමාර්

2
මගේ ප්‍රියතම විසඳුම, මට ගොඩක් උදව් කළා! විකල්පය සමඟ --suppress-common-linesවෙනස් රේඛා පමණක් පෙන්වනු ඇත
ololobus

62

DHEX නමින් මෙවලමක් ඇත , එම කාර්යය කළ හැකි අතර VBinDiff නමින් තවත් මෙවලමක් තිබේ .

දැඩි විධාන රේඛා ප්‍රවේශයක් සඳහා, ජොජොඩිෆ් උත්සාහ කරන්න .


10
DHEX නියමයි, ද්විමය සංසන්දනය කිරීම ඔබට කිරීමට අවශ්‍ය දෙයයි. ලිපිගොනු දෙකක් පෝෂණය කරන්න, එය ඔබව සංසන්දනාත්මක දර්ශනයකට ගෙන යයි, වෙනස්කම් දක්වා ඉස්මතු කරයි, ඊළඟ වෙනසට පහසුවෙන් ගමන් කළ හැකිය. පුළුල් පර්යන්ත සමඟ ඉතා ප්‍රයෝජනවත් වන විශාල පර්යන්ත සමඟ වැඩ කිරීමට ද එයට හැකියාව ඇත.
මාකින්

7
මම කැමතියි VBinDiff. උදාසීනව සිටියදී පවා DHEX CPU භාවිතා කරයි, මම සිතන්නේ එය සෑම විටම හෝ යමක් නැවත ඇඳීමකි. VBinDiff පුළුල් පර්යන්ත සමඟ ක්‍රියා නොකරයි. ඔබට පේළියකට බයිට් 16 කට වඩා ඇති බැවින් ලිපින කෙසේ වෙතත් පුළුල් පර්යන්ත සමඟ අමුතු වේ.
ජැනස් ට්‍රොල්සන්

2
vbindiff අපට ඇත්ත වශයෙන්ම ගොනුව සංස්කරණය කිරීමට ඉඩ දෙයි, thx!
ඇක්වාරියස් පවර්

2
An ඩැනියෙල් බියුආට් සම්පීඩිත ලිපිගොනු පළමු වෙනස් බයිට් එක හමු වූ පසු සම්පූර්ණයෙන්ම වෙනස් වේ. ප්‍රතිදානය ප්‍රයෝජනවත් නොවනු ඇත.
මාර්ක් රැන්සම්

2
11 1111161171159459134 jdiff යනු jdiff විසින් සොයාගත් වෙනස්කම් සමමුහුර්ත කිරීම හා සමනය කිරීම සඳහා වූ වැඩසටහන් සමූහයක කොටසකි. එහෙත්, මාර්ක් රැන්සම් පැවසූ පරිදි, සම්පීඩිත ලිපිගොනු සම්බන්ධයෙන් එය සාමාන්‍යයෙන් wise ානවන්ත නොවේ. ව්‍යතිරේකය යනු "සමමුහුර්ත කළ හැකි" සම්පීඩිත ආකෘති (gzip --rsyncable විසින් නිපදවන ලද), සම්පීඩිත ලිපිගොනු වල කුඩා වෙනස්කම් සම්පීඩිත ගොනුවට සීමිත බලපෑමක් ඇති කළ යුතුය.
hmijail ශෝකයෙන් ඉල්ලා අස්වූවන්

28

බයිට් එකතු කිරීම / මකා දැමීම සඳහා ක්‍රියා කරන ක්‍රමය

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නොවේ (Vim සමඟ පැමිණේ)
  • සතුව -Anතොරව ලිපිනය තීරුව ඉවත් කිරීමට awk.

විධාන පැහැදිලි කිරීම:

  • -Anලිපින තීරුව ඉවත් කරයි. බයිට් එකතු කිරීම / ඉවත් කිරීමෙන් පසු සියලු රේඛා වෙනස් වේ.
  • -w1එක් පේළියකට එක් බයිට් එකක් දමයි, එවිට වෙනස එය පරිභෝජනය කරයි. එක් පේළියකට එක් බයිට් එකක් තිබීම ඉතා වැදගත් වේ, නැතිනම් මකාදැමීමෙන් පසු සෑම පේළියක්ම අදියරෙන් බැහැර වී වෙනස් වේ. අවාසනාවට, මෙය POSIX නොවේ, නමුත් GNU හි පවතී.
  • -tx1 යනු ඔබට අවශ්‍ය නිරූපණය වන අතර, ඔබ එක් පේළියකට බයිට් 1 ක් තබා ගන්නා තාක් දුරට හැකි ඕනෑම අගයකට වෙනස් කරන්න.
  • -vතට්ටය පෑදීම තරු ලකුණ නැවත නැවත පලාෙත් ෙකටි නාමය *වන වෙනස සමග බාධා ඇති වෙයි කරන
  • paste -d '' - -සෑම පේළි දෙකකටම සම්බන්ධ වේ. අපට එය අවශ්‍ය වන්නේ හෙක්ස් සහ ASCII වෙනම යාබද රේඛාවලට යන බැවිනි. ලබාගත්: /programming/8987257/concatenating-every-other-line-with-the-next
  • අභ්‍යන්තර ශ්‍රිතයේ විෂය පථය සීමා ()කිරීම bdiffවෙනුවට නිර්වචනය කිරීම {}සඳහා අපි වරහන් භාවිතා කරමු f, මෙයද බලන්න: /programming/8426077/how-to-define-a-function-inside-another-function-in-bash

මෙයද බලන්න:


14

කෙටි පිළිතුර

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

ද්විමය ලිපිගොනු සංසන්දනය කිරීම සඳහා හෙක්ස්ඩම්ප් සහ පෙළ වෙනස භාවිතා කරන විට, විශේෂයෙන් xxd, බයිට් එකතු කිරීම සහ ඉවත් කිරීම ආමන්ත්‍රණය කිරීමේදී මාරුවීම් බවට පත්වන අතර එය දැකීමට අපහසු වේ. මෙම ක්‍රමය xxd ට පවසන්නේ ලිපින ප්‍රතිදානය නොකරන ලෙසත්, එක් පේළියකට එක් බයිට් එකක් පමණක් ප්‍රතිදානය කරන ලෙසත්ය. එමඟින් පෙන්වන්නේ කුමන බයිට් වෙනස් කළේද, එකතු කළේද, ඉවත් කළේද යන්නයි. වඩාත් “සාමාන්‍ය” හෙක්ස්ඩම්ප් (ප්‍රතිදානය xxd first.bin) තුළ බයිට් වල රසවත් අනුපිළිවෙල සෙවීමෙන් ඔබට පසුව ලිපින සොයාගත හැකිය .


(ඇත්ත වශයෙන්ම, diffඒ වෙනුවට යමෙකු භාවිතා කළ හැකිය vimdiff.)
වාස්නොවිකොව්

12

ද්විමය ලිපිගොනු පෙළ ආකෘතියට දැමීම සඳහා හෙක්ස්ඩම්ප් සහ වෙනස බැලීම සඳහා kdiff3 නිර්දේශ කරමි.

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

2
මෙතන පවා bash දී kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)ගොනු නිර්මාණය කිරීම සඳහා කිසිදු අවශ්යතාවක් සමඟ myfile1.hexහා myfile2.hex.
හස්තූර්

6

මෙම hexdiffඔබ සොයන දේ හරියටම කරන්න සැලසුම් කරන ලද වැඩසටහන.

භාවිතය:

hexdiff file1 file2

එය ගොනු දෙකේ හෙක්ස් (සහ 7-බිට් ASCII) එකකට වඩා ඉහළින් ප්‍රදර්ශනය කරයි. man hexdiffගොනුවේ සැරිසැරීමට විධාන දෙස බලන්න , එවිට සරල එකක් qඉවත්ව යනු ඇත.


4
නමුත් එය සංසන්දනය කරන කොටස දෙස බලන විට එය ඉතා නරක වැඩකි. ඔබ ගොනුවකට බයිට් කිහිපයක් ඇතුල් කළහොත්, එය පසුව සියලු බයිට් වෙනස්වීම් ලෙස සලකුණු කරනු ඇත
මර්මෙල්

උබුන්ටු 16.4
rubo77

1
Ur මුර්මෙල් මම එකඟ වන අතරම, මෙහි අසනු ලබන්නේ එය නොවේද?
ඉවාන් කැරොල්

An ඉවාන් කැරොල් ඇත්ත, ඒ නිසා මම අදහස් දැක්වීමක් (පමණක්) කළ අතර එය පහත් කොට සැලකුවේ නැත
මර්මෙල්

මමත් මික්ට ඡන්දය දුන්නේ නැහැ, නමුත් මම ඔබ සමඟ එකඟ වී මෙහි පිළිතුරු දුන්නා superuser.com/a/1373977/11116 මෙම නරක ප්‍රශ්නය ප්‍රතිසංස්කරණය කිරීමට හෝ වසා දැමීමට ඉඩ ඇති බව පෙනෙන නිසා.
ඉවාන් කැරොල්

4

එය ප්‍රශ්නයට තදින් පිළිතුරු නොදෙන නමුත් වෙනස් ද්විමය සඳහා මම මෙය භාවිතා කරමි:

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

එය ලිපිගොනු දෙකම හෙක්ස් සහ ASCII අගයන් ලෙස මුද්‍රණය කරයි , එක් පේළියකට එක් බයිට් එකක් වන අතර පසුව ඒවා දෘශ්‍යමය ලෙස දැක්වීමට Vim හි වෙනස පහසුකම භාවිතා කරයි.


1

Vim-gui-common පැකේජයට ඇතුළත් කර ඇති gvimdiff මෙවලම ඔබට භාවිතා කළ හැකිය

sudo apt-get update

sudo apt-get install vim-gui-common

පහත දැක්වෙන විධානයන් භාවිතයෙන් ඔබට හෙක්ස් ගොනු 2 ක් සංසන්දනය කළ හැකිය:

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

තා. උදව්වක් බලාපොරොත්තු වෙනවා!


1

ෆර්ම්වෙයාර් විශ්ලේෂණ මෙවලම 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

එසේ කරන විට OP ගේ උදාහරණයේ binwalk -W file1.bin file2.bin:

binwalk -W file1.bin file2.bin


0

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

DHEX යනු තවත් හෙක්ස් සංස්කාරකයකට වඩා වැඩි ය: එයට වෙනස් මාදිලියක් ඇතුළත් වන අතර එය ද්විමය ලිපිගොනු දෙකක් පහසුවෙන් හා පහසුවෙන් සංසන්දනය කිරීමට භාවිතා කළ හැකිය. එය ncurses මත පදනම් වී ඇති අතර එය තේමාව කර ගත හැකි බැවින්, එය ඕනෑම පද්ධති සහ අවස්ථා ගණනාවක ධාවනය කළ හැකිය. සෙවුම් ල logs ු-සටහන් භාවිතා කිරීමත් සමඟ, විවිධ ලිපිගොනු වල වෙනස්වීම් පහසුවෙන් සොයාගත හැකිය.


සුපර් යූසර් වෙත සාදරයෙන් පිළිගනිමු! මෙම මෘදුකාංගය OP හි ගැටලුව විසඳිය හැකි බව පෙනුනද, පිරිසිදු වෙළඳ දැන්වීම Stack Exchange ජාලය කෙරෙහි දැඩි ලෙස කෝපයට පත් වේ. ඔබ මෙම මෘදුකාංග සංස්කාරකයට අනුබද්ධ නම් කරුණාකර මෙම කරුණ හෙළි කරන්න. ඔබේ ලිපිය වාණිජමය ලෙස අඩු වන පරිදි නැවත ලිවීමට උත්සාහ කරන්න. ඔබට ස්තුතියි.
නේතන්.එලිෂා ෂිරෙයිනි

මම කිසිම ආකාරයකින් ඩෙක්ස් සමඟ සම්බන්ධ නොවෙමි. අවම පශ්චාත් දිග සීමාවක් ඇති නිසා මම කතුවරයාගේ විස්තරය ලිපියට පිටපත් කළෙමි
වින්සන්ට් වේගා


0

ද්විමය ගොනුව වෙනස් කිරීම සඳහා මම සරල පිටපතක් ලිවුවෙමි, එය පළමු වෙනස් කැබැල්ල (බයිට් 40) මුද්‍රණය කර ඕෆ්සෙට් කරයි:
https://gist.github.com/guyskk/98621a9785bd88cf2b4e804978950122

$ bindiff file1 file2
8880> 442408E868330300488D05825337004889042448C744240802000000E84F330300E88A2A0300488B
                      ^^^^^^^^^ ^^
      442408E868330300E59388E59388004889042448C744240802000000E84F330300E88A2A0300488B

0

පහත දැක්වෙන්නේ බයිට් වෙනස්වීම් පමණක් නොව බයිට් එකතු කිරීම් / මකාදැමීම් ද සැලකිල්ලට ගනිමින් ද්විමය වෙනසක් සිදු කරන වර්ණ බින්ඩිෆ් ය. (මෙහි යෝජනා කර ඇති බොහෝ විසඳුම් හසුරුවන්නේ බයිට් වෙනස් වීම් පමණි) එය GitHub වෙතින් ද ලබා ගත හැකිය .

එය වර්ණ සමඟ ප්‍රති side ල පෙන්වයි, මෙය විශ්ලේෂණයට බෙහෙවින් පහසුකම් සපයයි.

colorbindiff ප්‍රතිදාන සැණරුව

එය භාවිතා කිරීමට:

perl colorbindiff.pl FILE1 FILE2

පිටපත:

#!/usr/bin/perl
#########################################################################
#
# VBINDIFF.PL : A side-by-side visual diff for binary files.
#               Consult usage subroutine below for help.
#
# Copyright (C) 2020 Jerome Lelasseux jl@jjazzlab.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#########################################################################

use warnings;
use strict;
use Term::ANSIColor qw(colorstrip colored);
use Getopt::Long qw(GetOptions);
use File::Temp qw(tempfile);
use constant BLANK => "..";
use constant BUFSIZE =>  64 * 1024;  # 64kB

sub usage
{
    print "USAGE: $0 [OPTIONS] FILE1 FILE2\n";
    print "Show a side-by-side binary comparison of FILE1 and FILE2. Show byte modifications but also additions and deletions, whatever the number of changed bytes. Rely on the 'diff' external command such as found on Linux or Cygwin. The algorithm is not suited for large and very different files.\n";  
    print "Author: Jerome Lelasseux \@2021\n";
    print "OPTIONS: \n";
    print " --cols=N       : display N columns of bytes.diff Default is 16.\n";
    print " --no-color     : don't colorize output. Needed if you view the output in an editor.\n";
    print " --no-marker    : don't use the change markers (+ for addition, - for deletion, * for modified).\n";
    print " --no-ascii     : don't show the ascii columns.\n";
    print " --only-changes : only display lines with changes.\n";
    exit;
}

# Command line arguments
my $maxCols=16;
my $noColor=0;
my $noMarker=0;
my $noAscii=0;
my $noCommon=0;
GetOptions(
    'cols=i' => \$maxCols,
    'no-ascii' => \$noAscii,
    'no-color' => \$noColor,
    'no-marker' => \$noMarker,
    'only-changes' => \$noCommon    
) or usage();
usage() unless ($#ARGV == 1);
my ($file1, $file2) = (@ARGV);


# Convert input files into hex lists
my $fileHex1 = createHexListFile($file1);
my $fileHex2 = createHexListFile($file2);


# Process diff -y output to get an easy-to-read side-by-side view
my $colIndex=0;
my $oldPtr=0;
my $newPtr=0;
my $oldLineBuffer = sprintf("0x%04X ", 0);
my $newLineBuffer = sprintf("0x%04X ", 0);
my $oldCharBuffer;
my $newCharBuffer;
my $isDeleting=0; 
my $isAdding=0; 
my $isUnchangedLine=1;
open(my $fh, '-|', qq(diff -y $fileHex1 $fileHex2)) or die $!;  
while (<$fh>)     
{
    # Parse line by line the output of the 'diff -y' on the 2 hex list files. 
    # We expect: 
    # "xx      | yy" for a modified byte
    # "        > yy" for an added byte
    # "xx      <"    for a deleted byte
    # "xx        xx" for identicial bytes

    my ($oldByte, $newByte);
    my ($oldChar, $newChar);
   if (/\|/)
   {
        # changed
        if ($isDeleting || $isAdding)
        {
            printLine($colIndex);
        }
        $isAdding=0;        
        $isDeleting=0; 
        $isUnchangedLine=0;

        /([a-fA-F0-9]+)([^a-fA-F0-9]+)([a-fA-F0-9]+)/;
        $oldByte=formatByte($1, 3);
        $oldChar=toPrintableChar($1,3);     
        $newByte=formatByte($3, 3);
        $newChar=toPrintableChar($3,3);
        $oldPtr++;
        $newPtr++;
   } elsif (/</)
   {
        # deleted in new
        if ($isAdding)
        {
            printLine($colIndex);
        }
        $isAdding=0;        
        $isDeleting=1;      
        $isUnchangedLine=0;     

        /([a-fA-F0-9]+)/;
        $oldByte=formatByte($1, 2);
        $oldChar=toPrintableChar($1, 2);        
        $newByte=formatByte(BLANK, 2);
        $newChar=colorize(".", 2);      
        $oldPtr++;
   } elsif (/>/)
   {
        # added in new
        if ($isDeleting)
        {
            printLine($colIndex);
        }           
        $isAdding=1;        
        $isDeleting=0;  
        $isUnchangedLine=0;     

        /([a-fA-F0-9]+)/;
        $oldByte=formatByte(BLANK, 1);
        $oldChar=colorize(".", 1);              
        $newByte=formatByte($1, 1);         
        $newChar=toPrintableChar($1, 1);        
        $newPtr++;      
   }      
   else
   {
        # unchanged
        if ($isDeleting || $isAdding)
        {
            printLine($colIndex);
        }               
        $isDeleting=0; 
        $isAdding=0; 

        /([a-fA-F0-9]+)([^a-fA-F0-9]+)([a-fA-F0-9]+)/;
        $oldByte=formatByte($1, 0);
        $oldChar=toPrintableChar($1, 0);        
        $newByte=formatByte($3, 0); 
        $newChar=toPrintableChar($3, 0);        
        $oldPtr++;              
        $newPtr++;      
   }       

   # Append the bytes to the old and new buffers
    $oldLineBuffer .= $oldByte;   
    $oldCharBuffer .= $oldChar;
    $newLineBuffer .= $newByte;
    $newCharBuffer .= $newChar;
    $colIndex++;
    if ($colIndex == $maxCols)
    {
        printLine();
    } 
}

printLine($colIndex);   # Possible remaining line


#================================================================
# subroutines
#================================================================

# $1 a string representing a data byte
# $2 0=unchanged, 1=added, 2=deleted, 3=changed
# return the formatted string (color/maker)
sub formatByte
{
    my ($byte, $type) = @_;
    my $res;
    if (!$noMarker)
    {
        if ($type == 0 || $byte eq BLANK)   { $res = "  " . $byte; }    # unchanged or blank
        elsif ($type == 1)  { $res = " +" . $byte; }    # added
        elsif ($type == 2)  { $res = " -" . $byte; }    # deleted
        elsif ($type == 3)  { $res = " *" . $byte; }    # changed
        else  { die "Error"; }
    } else
    {
        $res = " " . $byte;
    }
    $res = colorize($res, $type);
    return $res;
}

# $1 a string 
# $2 0=unchanged, 1=added, 2=deleted, 3=changed
# return the colorized string according to $2
sub colorize
{
    my ($res, $type) = @_;
    if (!$noColor)
    {       
        if ($type == 0)     {  }        # unchanged
        elsif ($type == 1)  { $res = colored($res, 'bright_green'); }       # added
        elsif ($type == 2)  { $res = colored($res, 'bright_red'); }         # deleted
        elsif ($type == 3)  { $res = colored($res, 'bright_cyan'); }        # changed
        else   { die "Error"; } 
    }
    return $res;
}

# Print the buffered line
sub printLine
{
    if (length($oldLineBuffer) <=10)
    {
        return;     # no data to display
    }

    if (!$isUnchangedLine)
    {
        # Colorize and add a marker to the address of each line if some bytes are changed/added/deleted 
        my $prefix = substr($oldLineBuffer, 0, 6) . ($noMarker ? " " : "*");
        $prefix = colored($prefix, 'magenta') unless $noColor;
        $oldLineBuffer =~ s/^......./$prefix/;
        $prefix = substr($newLineBuffer, 0, 6) . ($noMarker ? " " : "*");
        $prefix = colored($prefix, 'magenta') unless $noColor;
        $newLineBuffer =~ s/^......./$prefix/;      
    }

    my $oldCBuf = $noAscii ? "" : $oldCharBuffer;
    my $newCBuf = $noAscii ? "" : $newCharBuffer;
    my $spacerChars = $noAscii ? "" : (" " x ($maxCols - $colIndex));           
    my $spacerData = ($noMarker ? "   " : "    ") x ($maxCols - $colIndex); 
    if (!($noCommon && $isUnchangedLine))
    {   
        print "${oldLineBuffer}${spacerData} ${oldCBuf}${spacerChars}  ${newLineBuffer}${spacerData} ${newCBuf}\n";    
    }

    # reset buffers and counters
    $oldLineBuffer = sprintf("0x%04X ", $oldPtr);
    $newLineBuffer = sprintf("0x%04X ", $newPtr);
    $oldCharBuffer = "";
    $newCharBuffer = "";
    $colIndex=0;
    $isUnchangedLine=1;     
}

# Convert a hex byte string into a printable char, or '.'.
# $1 = hex str such as A0
# $2 0=unchanged, 1=added, 2=deleted, 3=changed
# return the corresponding char, possibly colorized
sub toPrintableChar
{
    my ($hexByte, $type) = @_;
    my $char = chr(hex($hexByte));
    $char =  ($char =~ /[[:print:]]/) ? $char : ".";
    return colorize($char, $type);
}

# Convert file $1 into a text file with 1 hex byte per line.
# $1=input file name
# return the output file name
sub createHexListFile
{
    my ($inFileName) = @_;
    my $buffer; 
    my $in_fh;
    open($in_fh,  "<:raw", $inFileName) || die "$0: cannot open $inFileName for reading: $!";   
    my ($out_fh, $filename) = tempfile();

    while (my $nbReadBytes = read($in_fh, $buffer, BUFSIZE)) 
    {
        my @hexBytes = unpack("H2" x $nbReadBytes, $buffer);
        foreach my $hexByte (@hexBytes)
        {   
            print $out_fh "$hexByte\n" || die "couldn't write to $out_fh: $!";  
        }
    }
    close($in_fh);
    return $filename;
}

-1

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

බින්ඩිෆ් යනු මෑතකදී විවෘත කරන ලද ද්විමය ලිපිගොනු සංසන්දනය කිරීම සඳහා විශිෂ්ට UI මෙවලමකි.


3
අත්තනෝමතික ද්විමය ලිපිගොනු වල එය භාවිතා කළ හැකිද? එම පිටුව හෙක්ස් රේස් අයිඩීඒ ප්‍රෝ විසින් විසුරුවා හරින ලද ක්‍රියාත්මක කළ හැකි ඒවා සංසන්දනය කිරීම සඳහා පමණක් ප්‍රයෝජනවත් බව පෙනේ.
eswald

-2

ලිනක්ස් හි විවෘත මූලාශ්‍ර නිෂ්පාදනයක් වෙත යාම (සහ අනෙක් සියල්ල) රේඩරේ යනු radiff2මෙම අරමුණු සඳහා පැහැදිලිවම සපයයි . මම මෙය වසා දැමීමට ඡන්දය දුන්නේ ඔබ සහ අනෙක් අය එකම ප්‍රශ්නය ඇති නිසා ඔබ අසන ප්‍රශ්නයේදීය

සෑම වෙනස් බයිට් සඳහාම

එය උමතුවකි. මන්ද විමසූ පරිදි, ඔබ ගොනුවේ පළමු බයිටයේ එක් බයිට් එකක් ඇතුල් කළහොත්, පසුව එන සෑම බයිටයක්ම වෙනස් බව ඔබට පෙනී යනු ඇත, එම නිසා වෙනස එක් බයිට් එකක සත්‍ය වෙනසක් සඳහා මුළු ගොනුවම පුනරාවර්තනය වේ.

තරමක් ප්‍රායෝගිකයි radiff -O. මෙම -O"සඳහා" සියලු සමග diffing දෝ කේතය වෙනුවට බයිට් පමණක් ස්ථාවර opcode බයිට් ""

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

IDA Pro මෙන්ම, රේඩාර් යනු ද්විමය විශ්ලේෂණය සඳහා මූලික මෙවලමක් වන අතර, ඔබට ඩෙල්ටා සමඟ වෙනස් බව පෙන්විය හැකිය -d, නැතහොත් හෙක්ස් වෙනුවට විසුරුවා හරින ලද බයිට් පෙන්විය -Dහැකිය.

ඔබ මේ ආකාරයේ ප්‍රශ්න අසන්නේ නම්, පරීක්ෂා කරන්න

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.