मैं निष्पादन योग्य बाइनरी में स्ट्रिंग्स को कब संपादित कर सकता हूं?


11

मेरे पास एक निष्पादन योग्य बाइनरी है; चलो इसे बुलाओ a.out। मैं देख सकता हूं कि बाइनरी में तार शामिल हैं

$ strings a.out
...
/usr/share/foo
....

मुझे स्ट्रिंग /usr/share/fooको बदलने की आवश्यकता है /usr/share/bar। क्या मैं स्ट्रिंग को बदल सकता हूँ sed?

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

यह देखने में सुरक्षित चीज़ लगती है। क्या यह भी काम करेगा जब तार समान लंबाई नहीं होंगे?

जवाबों:


17

मुझे नहीं पता कि क्या आपका संस्करण sedबाइनरी-क्लीन होगा या अगर यह सोचता है कि इसके इनपुट में वास्तव में लंबी लाइनें हैं, लेकिन उन मुद्दों पर रोक लगाएगा, तो स्ट्रिंग को इन-एडिट करके काम करना चाहिए। यह देखने के लिए कि क्या यह करता है, पुराने और नए संस्करणों की तुलना करें cmp -l। यह आपको बताना चाहिए कि दो फाइलों के बीच केवल तीन अंतर उन 3 बाइट्स हैं या नहीं।

संकलित निष्पादन योग्य में तारों को संपादित करना वास्तव में काम करेगा यदि तार एक ही लंबाई के हैं, लेकिन यह लगभग हमेशा भी काम करेगा यदि आप स्ट्रिंग को छोटा कर रहे हैं, जिस तरह से स्ट्रिंग सी में काम करते हैं, तो NULटर्मिनेटर के बाद सब कुछ। गिनती नहीं है, इसलिए यदि आप NULपुराने की स्थिति से पहले एक नया टर्मिनेटर लिखते हैं, तो आप प्रभावी रूप से स्ट्रिंग को छोटा कर देंगे।

सामान्य तौर पर, कोई तरीका नहीं है जिससे आप इस हैक का उपयोग करके एक स्ट्रिंग को लंबा कर सकते हैं।


स्ट्रिंग को छोटा करने के बारे में क्या पसंद है sed -i 's@longstring@foo@' a.out? यह पूरे बाइनरी को 7 बाइट्स से छोटा कर देगा, क्या यह बाइनरी को भ्रष्ट नहीं करेगा?
मार्टिन वेग्टर

हां, यह बाइनरी को भ्रष्ट करेगा। यही कारण है कि आपको स्ट्रिंग को सटीक समान लंबाई में से एक में अनुवाद करना होगा, लेकिन NULपहले की स्थिति में एक टर्मिनेटर सेट करें जैसा कि मैंने समझाया (हालांकि शायद बहुत संक्षेप में)। परेशानी यह है कि आपके पास NULकमांड लाइन पर बाइट नहीं हो सकती है, इसलिए आपको अपने sedप्रोग्राम को एक फ़ाइल में रखना होगा और इसके साथ संदर्भ देना होगा -f। दूसरी ओर, करने के लिए सुरक्षित चीज एक उपकरण का उपयोग करना होगा sedजो बाइनरी डेटा के साथ काम करने के लिए डिज़ाइन किया गया है जिसके बजाय पाठ डेटा के साथ काम करने के लिए डिज़ाइन किया गया है।
सेलडा

2
अच्छा उत्तर। sed बहुत सारी चीजें कर सकते हैं, लेकिन, सामान्य तौर पर, यही द्विआधारी संपादकों के लिए आविष्कार किया गया था। वे एक बड़ी बाइनरी फ़ाइल के भीतर नेविगेट करते समय उपयोग करने के लिए चुनौतीपूर्ण हो सकते हैं, लेकिन वे आपको बाइट द्वारा चीजों को बदलने देंगे। hexeditजब मुझे बाइनरी फ़ाइल की जांच करनी होगी या बदलना होगा, तो मैं उपयोग करता हूं। strings -t x file | lessसंपादक में कूदने से पहले आप (प्रिंट करने योग्य) तार के ऑफसेट का पता लगाने के लिए उपयोग कर सकते हैं ।
जो

मान लीजिए कि मेरे सी प्रोग्राम में एक स्ट्रिंग है: "मेरा नाम श्री रोबोट था" और मैं चाहता हूं कि '' के साथ 'है' है ', तो पैडिंग \0को सावधानी से करना होगा, क्योंकि यदि प्रतिस्थापन ऐसा करता है: "मेरा नाम is \ 0 Mr Robot ", फिर स्ट्रिंग के साथ ऑपरेशन करते समय, '\ 0' वर्ण समस्याएं पैदा करेगा क्योंकि लंबाई अनायास ही कम हो जाएगी।
नेहल जे वानी

@NehalJWani नहीं, उस स्थिति में आपको एक स्ट्रिंग द्वारा बाइट के आगे के बाकी हिस्सों को शिफ्ट करना होगा ताकि आपका नया, अतिरिक्त, समाप्ति समाप्त NULहो जाए, जो मौजूदा से सटे हुए है NUL
Celada
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.