मैं बाइनरी फ़ाइल में स्ट्रिंग में हेक्स मान कैसे प्राप्त कर सकता हूं?


7

मेरे पास इस तरह की एक द्विआधारी फ़ाइल है ( Emacs hex मोड में खोलें ): यदि फ़ाइल में '22081b00081f091d2733170d123f3114' हैक्स मानों को कैसे प्राप्त करूं?

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!

मेरे उदाहरण में, यह एक हिट वापस करना चाहिए क्योंकि मैं जिस हेक्स मान की तलाश कर रहा हूं वह पते 0x10 में है।


अगर आप इसके grepलिए क्या करते हैं तो क्या होगा ? grep 2208 1b00 081f 091d 2733 170d 123f 3114रिक्त स्थान के साथ।
टेराडॉन

grepPविकल्प जानता है , इसलिए आप उपयोग कर सकते हैं grep -aP '\x22\x08\x1b...'। इसका जवाब stackoverflow.com/questions/6319878/… से है - मुझे लगता है कि आप केवल रेटकोड में रुचि रखते हैं, इसलिए आपको आउटपुट को रीडायरेक्ट करना चाहिए /dev/null
ott--

एक हेक्स संपादक का उपयोग करें। "हेक्स एडिटर नियो" विंडोज के लिए एक अच्छा मुफ्त है। मुझे लगता है कि वहाँ के रूप में अच्छी तरह से * निक्स के लिए कुछ कर रहे हैं।
डेनियल आर हिक्स

जवाबों:


8

आप उपयोग कर सकते हैं:

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

यदि सामग्री मेल खाती है, तो यह 1 वापस आ जाएगी।

xxd -pफ़ाइल को सादे हेक्स डंप में कनवर्ट करता tr -d '\n'है xxd, द्वारा जोड़े गए नए लिंक को हटाता है , और grep -cमिलान की गई लाइनों की संख्या को गिनता है।

इस तरह से, इनपुट का मिलान उस स्थिति में किया जाता है जो फ़ाइल में उसकी स्थिति है (यदि यह आपके उदाहरण में 0x18 की स्थिति में था, तो इसे दो में काट दिया जाएगा और grep ने इसे उपयोग किए बिना मिलान नहीं किया होगा tr)। फिर भी, आपके पास फ़ाइल में इसकी स्थिति नहीं है।


1
छोटे तार के लिए यह एक बाइट के दूसरे कुतरने से शुरू हो सकता है, जिसके परिणामस्वरूप एक झूठी सकारात्मक हो सकती है।
रुस्लान

एक निकम्मा ऑफसेट पर मेल खाने से बचने के लिए, मैंने प्रत्येक बाइट के आसपास व्हॉट्सएप को जोड़ने के लिए sed का उपयोग किया:xxd -p | tr -d '\n' | sed -e 's/../\0 /g' | grep -q '12 34'
श्री डॉस

2

बाद के क्रेप्स के साथ, आप निश्चित रूप से हेक्स स्ट्रिंग खोजों और बहुत कुछ कर सकते हैं। आप इसे पूर्ण नियमित अभिव्यक्ति (regexp) शक्ति के साथ कर सकते हैं , जैसे कि 'मुझे इस hex अनुक्रम को खोजें 1या 0उसके बाद और फिर इसके बाद पाठ और इस regexp का मिलान करें'

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

कुछ IP-DVR प्रणालियों में DHAV- स्वरूपित वीडियो के नियंत्रण और पुनर्प्राप्ति के लिए उपयोग किए जाने वाले प्रोटोकॉल स्ट्रीम के बाइनरी डंप के साथ एक फ़ाइल में लॉगिन / पास जोड़े से मेल खाता है। अर्थात्, मिलान वाले टुकड़े में हेक्स कोड के साथ बाइट्स होते हैं और उसके 0x01 0x00 0x00 0x00बाद ASCII लॉगिन 0x00, दो और 0बाइट्स और फिर पासवर्ड होता है।


देख stackoverflow.com/a/17168777/1797006 रूप में अच्छी तरह
कार्ल रिक्टर

क्या आपको [!-~]+पासवर्ड की आवश्यकता नहीं होगी ?
स्कॉट

0

grep अपने दम पर ऐसा नहीं कर सकते - यह उच्च स्तर पर संचालित होता है और एन्कोडेड पाठ की खोज करता है।

एक समाधान odबाइनरी को हेक्स में परिवर्तित करने के लिए उपयोग करना होगा और एएससीआईआई में आउटपुट करना होगा जिसे आप हेक्स स्ट्रिंग की खोज करने के लिए जीआरपी में पाइप कर सकते हैं:

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

हालाँकि, यह आगे की समस्याओं का कारण बनता है क्योंकि यह हेक्स को प्रारूपित करने के लिए नई रूपरेखाएँ और स्थान सम्मिलित करता है। जिसे संभालने के लिए आप प्रयोग कर सकते हैं sed


1
मैं यह नहीं कहूंगा कि grep यह नहीं किया जा सकता (देखें @ gb0tech का जवाब और stackoverflow.com/questions/4180081/binary-grep-on-linux ), लेकिन यह एन्कोडेड टेक्स्ट पर काम करने वाला अन्वेषण निश्चित रूप से सही और उपयोगी है। प्रदर्शन पर कम से कम प्रभाव पड़ता है अगर आपको हर चीज को odहेराफेरी से पहले बदलने की आवश्यकता होती है।
कार्ल रिक्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.