मैं कच्चे 16-बिट x86 मशीन कोड को कैसे अलग करूं?


91

मैं एमबीआर (पहले 512 बाइट्स) को एक बूट करने योग्य x86 डिस्क से अलग करना चाहता हूं जो मेरे पास है। मैंने एमबीआर का उपयोग करके एक फ़ाइल की प्रतिलिपि बनाई है

dd if=/dev/my-device of=mbr bs=512 count=1

लिनक्स उपयोगिता के लिए कोई सुझाव जो फ़ाइल को अलग कर सकता है mbr?

जवाबों:


109

आप objdump का उपयोग कर सकते हैं। इस लेख के अनुसार वाक्य रचना है:

objdump -D -b binary -mi386 -Maddr16,data16 mbr

क्या आप बता सकते हैं कि आपके द्वारा निर्दिष्ट विकल्प क्या हैं?
Hawken

11
या --targetइसके बजाय -b-D"सभी वर्गों की सामग्री को अलग करना" है; -b bfdnameया --target=bfdnameनिर्दिष्ट ऑब्जेक्ट-कोड प्रारूप के रूप में पढ़ने को बाध्य करेगा (हमारे मामले में योगिनी नहीं बल्कि कच्चा बाइनरी); -m machineउपयोग करने के लिए आर्किटेक्चर निर्दिष्ट करेगा (हमारी फ़ाइल में आर्क जानकारी के साथ कोई हेडर नहीं है)। -M optionsdisassembler के विकल्प हैं; addr16,data16"डिफ़ॉल्ट पता आकार और ऑपरेंड आकार निर्दिष्ट करने के लिए उपयोग किया जाता है" (सार्वभौमिक x86 डिस्कस इंजन में i8086 में से एक के रूप में कोड का इलाज करें)
osgx

29

उदाहरण के लिए GNU टूल को objdump कहा जाता है :

objdump -D -b binary -m i8086 <file>

आप आर्किटेक्चर और सिंटैक्स के लिए अलग-अलग विकल्प भी सेट कर सकते हैं। उदाहरण के लिए, -m i386या -Mintel,x86-64i8086एक पुरानी वास्तुकला है और आधुनिक कोड के लिए इसका उपयोग करने से अप्रत्याशित परिणाम मिल सकते हैं। इसके अलावा, निर्दिष्ट x86-64करना -Mआजकल एक अच्छा विचार हो सकता है क्योंकि कई मशीनें 64-बिट हैं। डिफ़ॉल्ट एटी एंड टी शैली के बजाय सिंटैक्स को इंटेल-शैली में बदलने के intelलिए पास करना -M, जिसे आप चाहते हैं या नहीं कर सकते हैं।
जीडीपी 2

24

मुझे ndisasmइस उद्देश्य के लिए पसंद है । यह NASM एसेंबलर के साथ आता है, जो स्वतंत्र और खुला स्रोत है और अधिकांश लिनक्स डिस्ट्रो के पैकेज रिपॉजिटरी में शामिल है।


मुझे यह उत्तर बेहतर लगा। उपयोग करने के लिए आसान है, और मैं ओएस एक्स पर nasm स्थापित कर सकता है - objdump वहाँ नहीं था, और मैं इसे स्रोत से नहीं बनाना चाहता।

22
ndisasm -b16 -o7c00h -a -s7c3eh mbr

स्पष्टीकरण - ndisasm manpage से

  • -b= 16-, 32- या 64-बिट मोड निर्दिष्ट करता है। डिफ़ॉल्ट 16-बिट मोड है।
  • -o= फ़ाइल के लिए नोटिअल लोड एड्रेस निर्दिष्ट करता है। यह विकल्प ndisasm का कारण बनता है कि यह उन पतों को छोड़ देता है जो बाएं हाथ के मार्जिन को सूचीबद्ध करता है, और पीसी-सापेक्ष जंपर्स और कॉल के दाएं पतों को सही करता है।
  • -a = स्वचालित (या बुद्धिमान) सिंक मोड को सक्षम करता है, जिसमें ndisasm यह अनुमान लगाने का प्रयास करेगा कि तुल्यकालन कहां किया जाना चाहिए, रिश्तेदार कूद के लक्ष्य पतों की जांच करने के माध्यम से और इसे disassembles कहता है।
  • -s= मैन्युअल रूप से एक सिंक्रनाइज़ेशन पता निर्दिष्ट करता है, जैसे कि ndisasm किसी भी मशीन निर्देश को आउटपुट नहीं करेगा जो पते के दोनों तरफ बाइट्स को सम्मिलित करता है। इसलिए उस पते पर शुरू होने वाला निर्देश सही ढंग से डिसाइड किया जाएगा।
  • mbr = फ़ाइल को डिसाइड किया जाना है।

यह सरल ndisasm के विपरीत क्या करता है? क्या आप विकल्पों की व्याख्या कर सकते हैं
हैकेन

4
क्या आप बता सकते हैं कि उन विकल्पों का मतलब और क्या है? एक उत्तर को समझना केवल एक प्राप्त करने से बेहतर है।
स्लेज

-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode. -o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right. -s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
Janus Troelsen

15

starblue और hlovdal दोनों विहित जवाब के कुछ हिस्सों की है। यदि आप कच्चे i8086 कोड को अलग करना चाहते हैं, तो आप आमतौर पर इंटेल सिंटैक्स चाहते हैं, एटी एंड टी सिंटैक्स भी नहीं, इसलिए उपयोग करें:

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

यदि आपका कोड ELF (या a.out (या (E) COFF)) है, तो आप संक्षिप्त रूप का उपयोग कर सकते हैं:

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

32-बिट या 64-बिट कोड के लिए, को छोड़ दें ,8086; ELF हेडर में पहले से ही यह जानकारी शामिल है।

ndisasm, जैसा कि जेम्स्लिन द्वारा सुझाया गया है , यह भी एक अच्छा विकल्प है, लेकिन objdumpआमतौर पर यह ओएस के साथ आता है और यह जीएनयू बिनुटिल्स (जीसीसी द्वारा समर्थित लोगों का सुपरसेट) द्वारा समर्थित सभी आर्किटेक्चर से निपट सकता है, और इसका उत्पादन आमतौर पर जीएनयू as(ndisasm's) में खिलाया जा सकता है खिलाया जानाnasm हालांकि,) ।

पीटर कॉर्डेस का सुझाव है कि " एग्नर फॉग का ऑग्जनोव बहुत अच्छा है। यह शाखा लक्ष्य पर लेबल लगाता है, जिससे यह पता लगाना बहुत आसान हो जाता है कि कोड क्या करता है। यह NASM, YASM, MASM या AT & T (GNU) सिंटैक्स में जा सकता है। "

मल्टीमीडिया माइक के बारे में पहले से ही पता चला है --adjust-vma; ndisasmबराबर है -oविकल्प।

जुदा करना, कहना, sh4कोड (मैंने परीक्षण के लिए डेबियन से एक बाइनरी का उपयोग किया), जीएनयू बिनुटिल्स के साथ इसका उपयोग करें (लगभग सभी अन्य डिस्सेम्बलर एक मंच तक सीमित हैं, जैसे कि x86 के साथ ndisasmऔर objconv):

objdump -D -b binary -m sh -EL x

-mमशीन है, और -ELलिटल एन्डियन (के लिए इसका मतलब sh4ebउपयोग -EBके बजाय) है, जो आर्किटेक्चर है कि या तो endianness में मौजूद के लिए प्रासंगिक है।


2
एग्नर फॉग का ऑग्जनोव बहुत अच्छा है। यह शाखा के लक्ष्यों पर लेबल लगाता है , जिससे यह पता लगाना बहुत आसान हो जाता है कि कोड क्या करता है। यह NASM, YASM, MASM, या AT & T (GNU) सिंटैक्स में जा सकता है।
पीटर कॉर्ड्स

इसने मेरे लिए जीएनयू / लिनक्स पर बॉक्स के ठीक बाहर निर्माण किया। लेकिन हाँ, यह GN86 बिनुतिल के विपरीत केवल x86 / x86-64 है। हालांकि, इसमें बहुत सारे अच्छे x86- विशिष्ट संकेत हैं जो इसे टिप्पणियों के रूप में जोड़ता है, जैसे कि जब एक ऑपरेंड-आकार के उपसर्ग एक इंटेल सीपीयू के डिकोडर्स में एक एलसीपी-स्टाल का कारण बन सकता है। हर तरह से, अपने उत्तर में इसका उल्लेख करें। टिप्पणियों के प्रमुख उद्देश्यों में से एक पोस्टर को उनके उत्तर को बेहतर बनाने में मदद करना है, न कि केवल कुछ के रूप में जिसे बाद में दर्शकों को पढ़ने की आवश्यकता है।
पीटर कॉर्ड्स

1
@PeterCordes हां, मेरे पास मुख्य OS के रूप में MirBSD है;)
mirabilos

@PeterCordes लेकिन ऐसा लगता है कि यह कच्चे बायनेरिज़ को अलग नहीं कर सकता, क्या यह कर सकता है? मुझे कम से कम ELF फाइलें बनानी पड़ीं, ताकि वे इसमें निर्देशों का एक गुच्छा खिला सकें, लेकिन शायद मैं कुछ विकल्प से चूक गया?
रुस्लान

1
@ रोलन: आईडीके, दिलचस्प सवाल। मैं आमतौर पर बस objdump का उपयोग करता हूं, या अगर मुझे शाखा लेबल चाहिए gcc -O3 -masm=intel -fverbose-asm -S -o- | less, क्योंकि मैं आमतौर पर अच्छे स्रोत के लिए सी स्रोत को ट्विक करने की कोशिश कर रहा हूं।
पीटर कॉर्डेस

9

इस आदेश का प्रयास करें:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.