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


35

मैं जानबूझकर एक फ़ाइल को नुकसान पहुंचाना चाहता हूं ताकि दावों का परीक्षण किया जा सके कि btrfs खुद को ठीक कर सकते हैं । आलेख फाइल सिस्टम को बंद करने के बारे में बात करता है, एक तस्वीर को "बिटिंग" करके एक बिट को नुकसान पहुंचाता है और फिर इसे रिमूव करता है। पुराने filesystems में यह सिर्फ भ्रष्ट हो जाएगा, लेकिन यह btrfs में खुद को ठीक करने वाला है। सिद्धांत रूप में, यह समझ में आता है लेकिन मैं वास्तव में इसका परीक्षण करना चाहता हूं।

समस्या यह है कि लेख यह नहीं समझाता है कि उसमें से किसी को कैसे करना है।
मैं एक फ़ाइल सिस्टम के एक बहुत विशिष्ट भाग में एक बिट को बदलने के बारे में कैसे जाऊंगा?

मुझे यह भी इंगित करना चाहिए कि यह एक ऑफ़लाइन फाइल सिस्टम पर किया जाना चाहिए ताकि btrfs मेरे लेखन को जानबूझकर न देखें।

संपादित करें: जबकि सवाल (और चर्चा) btrfs के बारे में बहुत कुछ बात करता है, मैं यह जानना चाहूंगा कि क्या इस तरह के भ्रष्टाचार को लागू करने के लिए फाइल सिस्टम स्वतंत्र तरीके हैं (ताकि इसकी तुलना विभिन्न RAID प्रकार / नियंत्रकों / आदि से की जा सके)।


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

क्या यह एक परीक्षण फाइलसिस्टम है (यानी, आप सामग्री के बारे में परवाह नहीं करते हैं, या बैकअप से बहाल करने के साथ पूरी तरह से ठीक हैं। इसके अलावा, क्या आप एक एकल ड्राइव पर एक एकल btrfs विभाजन का उपयोग कर रहे हैं, या एक RAID सरणी के ऊपर एक भी विभाजन है। , या कुछ अन्य विन्यास?
डार्थ एंड्रॉइड

1
यदि btrfs सही ioctls का समर्थन करता है (यदि यह सुनिश्चित नहीं होता है), तो आप यह filefrag -vपता लगाने के लिए उपयोग कर सकते हैं कि कोई फ़ाइल कहाँ स्थित है।
derobert

3
@ क्या मुझे संदेह है कि आपको वोटों के जवाब में और उत्तर के संदर्भ में, U & L पर अधिक रुचि रखने वाले दर्शक मिलेंगे। प्लस, यह

1
एक ब्रह्मांडीय किरण को सही स्थान पर गोली मारो।
smcg

जवाबों:


20

मैं एक विशेषज्ञ नहीं हूं, लेकिन btrfs-progsपैकेज में वास्तव में ऐसा करने के लिए विशेष रूप से एक उपकरण शामिल है, हालांकि आपको स्रोत से निर्माण करना पड़ सकता है। किसी भी स्थिति में, एक बार जब आप स्थापित या निर्मित हो जाते हैं btrfs-progs, तो आपको उस टूल का उपयोग करने में सक्षम होना चाहिए btrfs-corrupt-block, जिसका उपयोग btrfs डेवलपर्स द्वारा फाइलसिस्टम का परीक्षण करने के लिए किया जाता है।

अब, जैसे मैंने कहा, मेरे पास btrfs के साथ खेलने के लिए बहुत समय नहीं है, इसलिए मुझे इस उपकरण के सटीक उपयोग का पता नहीं है। लेकिन इसके साथ, आपको एक ऑफ़लाइन फ़ाइल सिस्टम को भ्रष्ट करने में सक्षम होना चाहिए, जो तब तय हो जाएगा जब दूषित फ़ाइल को पढ़ा जाता है (यह मानते हुए कि आपने RAID या कुछ और सेट किया है ताकि उपयोग करने के लिए एक और प्रतिलिपि हो)।


2
बहुत बढ़िया मिल गया! यह मानते हुए कि btrfs-corrupt-blockवास्तव में वास्तविक परीक्षण के लिए लिखा गया है और btrfs डेवलपर्स द्वारा "ट्रिक" नहीं, यह बिल बिलकुल सही होना चाहिए।
१०:४६

@allquixotic अगर आप btrfs के बारे में अधिक जानना चाहते हैं, तो linux.conf.au 2012 से बहुत अच्छी बात है । जैसा कि मैंने कहा, btrfs-corrupt-blockडेवलपर्स द्वारा उपयोग किया जाता है, इसलिए यह बहुत उपयोगी नहीं होगा अगर यह एक चाल है :)
strugee

3
@allquixotic यह खुले स्रोत की सुंदरता है: आप btrfs के स्रोत कोड को देख सकते हैं और इसे देख सकते हैं! यकीन है, यह एक आसान काम नहीं होगा, लेकिन अगर आप वास्तव में चाहते हैं, तो आप ऐसा कर सकते हैं।
बकुरीउ

@ बकुरीउ मुझे पूरी जानकारी है। मैंने कभी भी गंभीरता से संदेह नहीं किया कि btrfs-corrupt-blockयह एक गंभीर परीक्षा नहीं है, क्योंकि यह स्रोत पर किसी को पोक करने से बहुत जल्दी पता चलेगा, और ओरेकल के खिलाफ नकारात्मक पीआर के रूप में उपयोग किया जाता है (कम से कम, साथ ही किसी अन्य btrfs डेवलपर्स / योगदानकर्ता)। यह सिर्फ एक ऑफ-द-कफ टिप्पणी थी।
allquixotic

मुझे आश्चर्य है कि अगर ओपी (@ ओली) एक ब्लॉक (यानी, फाइलसिस्टम संरचना) या एक फाइल को भ्रष्ट करना चाहता है (यानी, एक फ़ाइल की सामग्री ??) ... और मेरा मानना ​​है कि स्व-उपचार के btrfs दावे के बारे में है पूर्व, उत्तरार्द्ध नहीं? [एक फाइलसिस्टम को कैसे पता चलेगा कि एक फाइल में कौन सा बिट फ़्लिप किया गया था? सीआरसी के कुछ प्रकार?] यह उत्तर शायद सही में है, हालांकि, +1। [लेकिन यह "सिंगल बिट" से अधिक बदल सकता है? या "कहीं भी" होने वाले यादृच्छिक बिट की तुलना में अधिक आसानी से चंगा किया जा सकता है?]
ओलिवियर दुलाक

16
  1. /dev/sda11 मिलियन सेफ़ सेक्टर ऑफ़सेट (केवल एक उदाहरण) के साथ ब्लॉक डिवाइस (जैसे ) पर एकल सेक्टर का मान प्राप्त करें :

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    यह मनमाना चुना गया 1M * 512 बाइट्स ऑफ़सेट केवल यह सुनिश्चित करने के लिए है कि आप फ़ाइल सिस्टम के मेटाडेटा भाग से बाहर हैं और वास्तव में उस सेक्टर पर हैं जिसमें डेटा है।

  2. हेक्स संपादक के साथ सामग्री को बदलकर कच्चे क्षेत्र के डेटा को संपादित करें। उदाहरण के लिए देखें लिनक्स के लिए एक अच्छे हेक्स संपादक की आवश्यकता है

  3. सेक्टर को वापस ड्राइव पर रखें ifऔर ofउल्टे तर्क दें:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

2
यह उसे तब तक परखने में मदद नहीं करेगा जब तक कि 1-मिलियनवां ब्लॉक वास्तव में एक फाइल का हिस्सा न हो। वह कैसे देख सकता है कि एक विशेष फ़ाइल किस ब्लॉक पर शुरू होती है?
डारथ Android

3
ऐसा इसलिए है ताकि लगभग वहाँ। यदि आप फ़ाइल की सटीक स्थिति पर dd कमांड को लॉक कर सकते हैं, तो यह संभवत: इसके लिए सबसे अच्छा तरीका है।
ओली

@ ओली, मुझे पता है कि फाइलसिस्टम के एक्स्ट्रीम परिवार के लिए कैसे करना है, लेकिन मेरे पास btrfs के साथ उतना अनुभव नहीं है। मुझे देखने दो कि क्या मुझे कोई रास्ता मिल सकता है।
gertvdijk

2
@ ओली: आपके पास बस एक लूप हो सकता है, डीडी आउटपाउटिंग ब्लॉक द्वारा ब्लॉक (यानी, ऊपर की तरह, लेकिन "स्किप = एन", एन 1. दोपहर में।) जब तक आप उस फ़ाइल से एक पंक्ति को पकड़ नहीं सकते जिसे आप संपादित करना चाहते हैं। [एक लाइन उत्पन्न करने की कोशिश करें जो कहीं और नहीं होगी ... उदाहरण के लिए इसे पासवर्ड जनरेटर से लें, और लंबे समय तक?]। फिर आप उस विशेष ब्लॉक को संपादित करते हैं। रीमाउंट, परीक्षण यदि परिवर्तन वापस कर दिया गया था (जो मुझे संदेह है, तो शीर्ष उत्तर में मेरी टिप्पणी देखें ... फ़ाइल डेटा (= सामग्री) और फ़ाइल सिस्टम संरचना के बीच एक भ्रम ही प्रतीत होता है (= कैसे फ़ाइलें और उनकी सामग्री का आयोजन किया जाता है) )?)
ओलिवियर दुलक

16

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

आशीर्वाद में जेपीईजी खोलने के बाद, मैंने जेपीईजी के "मांस" में अच्छी तरह से प्राप्त करने के लिए पृष्ठ को कुछ समय नीचे मारा, और फिर केवल पचास बाइट्स के डेटा के बारे में प्रकाश डाला, और इसे एक पाठ संपादक में कॉपी किया और चिपकाया मामला, gEdit)। इससे मुझे कुछ खोजना पड़ा।

अब मैंने VM पर JPEG को प्रत्येक ऐरे में सेव किया। सरणियों के पीछे भंडारण .qcow2 फ़ाइलों की एक श्रृंखला थी। एक बार जब मैंने जेपीईजी को सरणियों में सहेजा, तो मैं प्रत्येक सरणी से जुड़ी .qcow2 फ़ाइलों को ब्लेस में लोड कर सकता हूं, और उन्हें खोज सकता हूं - वे बहुत बड़ी नहीं थीं, जेपीईजी और कुछ मेटाडेटा - कुछ भी नहीं, जो कि पचास बाइट पैटर्न के लिए हैं मैंने JPEG पर प्रकाश डाला और कॉपी किया। वोइला, मेरे पास ब्लॉक करने के लिए भ्रष्ट था! इस बिंदु पर, मैं बस JPEG के अलग-अलग बाइट्स को मैन्युअल रूप से संपादित कर सकता हूं जैसा कि आशीर्वाद का उपयोग करके VM की वर्चुअल डिस्क पर संग्रहीत है - और, महत्वपूर्ण रूप से, प्रत्येक सरणी पर ठीक उसी तरह से करें

एकमात्र शिकन यह है कि लेख में परीक्षण किए गए RAID5 सरणी के मामले में, मुझे यह सुनिश्चित करना था कि मैं स्ट्राइप में डेटा की वास्तविक प्रतिलिपि संपादित करता हूं, और स्ट्रिप के लिए समानता नहीं है - यह एक छोटी छवि थी अन्यथा खाली सरणी, इसलिए स्ट्राइप में FOLLOWING ब्लॉक में कोई डेटा नहीं था, जिससे समानता ब्लॉक में डेटा ब्लॉक से डेटा अनलेल्ड हो जाता है। अगर मैं गलती से डेटा ब्लॉक के बजाय समता ब्लॉक को संपादित कर देता, तो छवि अपरिवर्तित दिखाई देती।

एक अंतिम नोट - आपको ऐसा करने के लिए आभासी मशीनों की आवश्यकता नहीं है - आप नंगे धातु के साथ उसी तरह से काम कर सकते हैं; यह सिर्फ बट में एक दर्द का अधिक होगा क्योंकि आपको अच्छी छोटी .qcow2 फ़ाइलों के बजाय पूरे कच्चे ड्राइव के साथ काम करने की आवश्यकता होगी, और आपको या तो ड्राइव को खींचना होगा और उन्हें एक अलग मशीन में डालना होगा, या उनके साथ खिलवाड़ करने के लिए एक लाइव (या केवल वैकल्पिक) वातावरण में बूट करें। (मैंने ZFS के डेटा हीलिंग का ठीक उसी तरह से परीक्षण किया, लेकिन असली-नंगी धातु मशीनों पर, 7-ish साल पहले जब मुझे पहली बार अगली-जीन फाइल सिस्टम में दिलचस्पी थी।)

उम्मीद है की यह मदद करेगा!


4

आप एक छोटे से कार्यक्रम की कोशिश कर सकते हैं जो खुली हुई फ़ाइल पर प्रदर्शन करेगा ।FIBMAP ioctl(2)

त्वरित वेब खोज के द्वारा, मुझे यह ब्लॉग पोस्ट http://smackerelofopinion.blogspot.tw/2009/06/fibmap-ioctl-file-system-block-number.html यह करने के लिए विस्तार से मिल गया - यह आपको एक लिंक भी देगा। एक नमूना कार्यक्रम के लिए जिसे आप स्वयं संकलित और चला सकते हैं।

$ git clone git://kernel.ubuntu.com/cking/debug-code
$ cd debug-code/block-mapper-fibmap
$ make
$ sudo ./fibmap /path/to/your/image-file.jpg

यह ठीक उसी तरह है hdparm --fibmap(@falconer द्वारा उल्लिखित) लागू किया गया है।

ब्लॉक संख्याओं को खोजने के बाद आप ddफ़ाइल को संशोधित करने के लिए gongfu को नियोजित कर सकते हैं , जैसे @gertvdijk ने स्केच किया। या हो सकता है कि आप बस fibmap.cऊपर दिए गए प्रोग्राम को संशोधित कर सकें , आपके लिए बिट फ्लिप करने के लिए, फाइल सिस्टम लेयर को बायपास करते हुए सीधे डिवाइस फाइल पर लिखें (प्रोग्राम के लिए तीन पैरामीटर: 1. फाइल का पथ, 2. फाइल के साथ डिवाइस फाइल प्रणाली, 3. ऑफसेट और बिट आप संशोधित करना चाहते हैं)।

( अस्वीकरण: मैंने परीक्षण नहीं किया है और यह गारंटी नहीं दे सकता कि यह FIBMAP ioctl(2)लूपबैक डिवाइस या btrfs फ़ाइल सिस्टम में एक फ़ाइल के लिए काम करेगा, लेकिन मैं दृढ़ता से इसकी अपेक्षा करता हूं। मैं अनुमान लगा रहा हूं कि फ़ाइल पर hdparmप्रदर्शन करने से पहले डिवाइस प्रकार की जांच करेगा ioctl(2)और इसलिए है। नाकाम रहने के।)


3
sudo hdparm --fibmap /PATH/TO/FILE

आपको LBA देगा जहाँ फ़ाइल स्थित है। इसके बाद आप @gertvdijk के उत्तर का उपयोग कर सकते हैं।


दुर्भाग्य से यह काम नहीं करता है। यह एक बाहर थूकना 0,39: device not found in /devयह या तो है क्योंकि यह btrfs है या (अधिक होने की संभावना) क्योंकि मैं लूपबैक आयोजित फाइलों पर यह उपयोग कर रहा हूँ है। मैं कोशिश करूँगा और इसे "उचित" वीएम के साथ करूँगा।
ओली

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