আমি কাঁচা 16-বিট x86 মেশিন কোডটি কীভাবে বিচ্ছিন্ন করব?


91

আমি আমার যে বুটযোগ্য x86 ডিস্কের এমবিআর (প্রথম 512 বাইট) বিচ্ছিন্ন করতে চাই। আমি এমবিআর ব্যবহার করে একটি ফাইলে অনুলিপি করেছি

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

লিনাক্স ইউটিলিটির জন্য কোনও পরামর্শ যা ফাইলটি বিচ্ছিন্ন করতে পারে mbr?

উত্তর:


109

আপনি অবজডাম্প ব্যবহার করতে পারেন। এই নিবন্ধ অনুযায়ী বাক্য গঠনটি হ'ল:

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

আপনি বর্ণিত বিকল্পগুলি কি ব্যাখ্যা করতে পারেন?
হক্কেন

11
বা --targetপরিবর্তে -b-D"সমস্ত বিভাগের বিষয়বস্তু পৃথক করা"; -b bfdnameবা --target=bfdnameনির্দিষ্ট অবজেক্ট-কোড ফর্ম্যাট হিসাবে পড়তে বাধ্য করবে (আমাদের ক্ষেত্রে অলফ নয় তবে কাঁচা বাইনারি); -m machineব্যবহারের জন্য আর্কিটেকচারটি নির্দিষ্ট করে দেবে (আমাদের ফাইলে আর্চের তথ্য সহ কোনও শিরোনাম নেই)। -M optionsবিচ্ছিন্নকরণের বিকল্পগুলি; addr16,data16"ডিফল্ট ঠিকানা আকার এবং অপারেন্ড আকার নির্দিষ্ট করতে" (সর্বজনীন x86 বিচ্ছিন্ন ইঞ্জিনে কোড i8086 হিসাবে বিবেচনা করুন)
osgx

30

জিএনইউ সরঞ্জামটিকে অ্যাজডাম্প বলা হয় , উদাহরণস্বরূপ:

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

আপনি আর্কিটেকচার এবং সিনট্যাক্সের জন্য বিভিন্ন বিকল্পও সেট করতে পারেন। উদাহরণস্বরূপ, -m i386বা -Mintel,x86-64i8086একটি পুরানো স্থাপত্য এবং এটি আধুনিক কোডের জন্য ব্যবহার করা অপ্রত্যাশিত ফলাফল পেতে পারে। তদ্ব্যতীত, উল্লেখ x86-64করার -Mএকটা ভাল ধারণা আজকাল হতে পারে থেকে বহু মেশিন 64-বিট আছে। পাসিং intelকরতে -Mপরিবর্তনগুলি ইন্টেল-শৈলী পরিবর্তে ডিফল্ট যেমন AT & T শৈলী, যা আপনি বা নাও করতে পারে পারে সিনট্যাক্স।
জিডিপি

24

আমি ndisasmএই উদ্দেশ্যে পছন্দ করি । এটি এনএএসএম এসেম্বলারের সাথে আসে, যা নিখরচায় ও মুক্ত উত্স এবং বেশিরভাগ লিনাক্স ডিস্ট্রোজের প্যাকেজ সংগ্রহস্থলের অন্তর্ভুক্ত।


আমি এই উত্তরটি আরও ভাল পছন্দ করি। ব্যবহার করা সহজ, এবং আমি ওএস এক্স-এ নাসম ইনস্টল করতে পারি - অজডাম্প ছিল না, এবং উত্স থেকে এটি তৈরি করতে চাই না।

23
ndisasm -b16 -o7c00h -a -s7c3eh mbr

ব্যাখ্যা - ndisasm ম্যানপেজ থেকে

  • -b= 16-, 32- বা 64-বিট মোড নির্দিষ্ট করে। ডিফল্টটি 16-বিট মোড।
  • -o= ফাইলের জন্য কল্পিত লোড ঠিকানা নির্দিষ্ট করে। এই বিকল্পটি এনডিআইসেমকে ডানদিকে বাম হাতের মার্জিনের নীচে দেওয়া ঠিকানাগুলি এবং পিসি-আপেক্ষিক জাম্প এবং কলগুলির লক্ষ্য ঠিকানাগুলি পেতে ডেকে আনে।
  • -a = স্বয়ংক্রিয় (বা বুদ্ধিমান) সিঙ্ক মোড সক্ষম করে, যেখানে আপেক্ষিক জাম্পগুলির টার্গেট ঠিকানাগুলি পরীক্ষা করে এবং এটিকে ডিসএসেমেবলস হিসাবে কল করে এনডিস্মম কোথায় সিঙ্ক্রোনাইজেশন করা উচিত তা অনুমান করার চেষ্টা করবে।
  • -s= ম্যানুয়ালি একটি সিঙ্ক্রোনাইজেশন ঠিকানা নির্দিষ্ট করে, যেমন ndisasm কোনও মেশিনের নির্দেশকে আউটপুট দেয় না যা ঠিকানার উভয় পক্ষের বাইটকে অন্তর্ভুক্ত করে। সুতরাং যে ঠিকানাটি সেই ঠিকানায় শুরু হয় তা সঠিকভাবে বিযুক্ত করা হবে।
  • mbr = ফাইলটি বিযুক্ত করা হবে।

এটি সাধারণ এনডিসাসমের বিপরীতে কি করে? আপনি কী বিকল্পগুলি ব্যাখ্যা করতে পারেন
হক্কেন

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.
জানুস ট্রোলসন

15

স্টার ব্লু এবং হলভডাল উভয়েরই ক্যানোনিকাল উত্তরের অংশ রয়েছে। আপনি যদি কাঁচা আই 86৮86 কোড বিচ্ছিন্ন করতে চান তবে আপনি সাধারণত এটিএন্ডটি সিনট্যাক্স নয়, ইন্টেল সিনট্যাক্সও চান, তাই ব্যবহার করুন:

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; ইএলএফ শিরোনাম ইতিমধ্যে এই তথ্য অন্তর্ভুক্ত।

ndisasmজেমসলিনের পরামর্শ অনুসারে , এটিও একটি ভাল পছন্দ, তবে objdumpসাধারণত ওএসের সাথে আসে এবং এটি জিএনইউ বাইনুটিলস (জিসিসি সমর্থিত asসুপারস্টেট ) দ্বারা সমর্থিত সমস্ত আর্কিটেকচারের সাথে মোকাবিলা করতে পারে, এবং এর আউটপুটটি সাধারণত জিএনইউতে খাওয়ানো যায় (এনডিএসসমের ক্যান সাধারণত) অবশ্যই খাওয়ানো হবে nasm)।

পিটার কর্ডস পরামর্শ দিয়েছেন যে " অ্যাগনার ফগের অ্যাজকোনভিটি খুব সুন্দর। এটি শাখা লক্ষ্যগুলিতে লেবেল রাখে, কোড কী করে তা নির্ধারণের জন্য অনেক সহজ করে তোলে। এটি এনএএসএম, ওয়াইএএসএম, এমএএসএম, বা এটিএন্ডটি (জিএনইউ) সিনট্যাক্সে বিচ্ছিন্ন হতে পারে। "

মাল্টিমিডিয়া মাইক ইতিমধ্যে এর সম্পর্কে জানতে পেরেছিল--adjust-vma ; ndisasmসমতূল্য -oবিকল্প।

বিচ্ছিন্ন করতে, বলুন, sh4কোড (আমি টেবিলে দেবিয়ান থেকে একটি বাইনারি ব্যবহার করেছি), এটি জিএনইউ বাইনুটিলেস দিয়ে ব্যবহার করুন (অন্যান্য সমস্ত বিচ্ছিন্নকরণগুলি একটি প্ল্যাটফর্মের মধ্যে সীমাবদ্ধ, যেমন x86 এর সাথে ndisasmএবং objconv):

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

-mমেশিন, এবং -ELলিটল endian (অর্থ sh4ebব্যবহার -EBপরিবর্তে), যা আর্কিটেকচারের যে হয় endianness মধ্যে উপস্থিত জন্য প্রাসঙ্গিক।


4
অ্যাগনার ফগের অ্যাজকনভটি খুব সুন্দর। এটি শাখা লক্ষ্যগুলিতে লেবেল রাখে , কোড কী করে তা নির্ধারণের জন্য অনেক সহজ করে তোলে। এটি এনএএসএম, ওয়াইএএসএম, এমএএসএম, বা এটিএন্ডটি (জিএনইউ) সিনট্যাক্সে বিচ্ছিন্ন হতে পারে।
পিটার কর্ডস

এটি আমার জন্য জিএনইউ / লিনাক্সের বাক্সের ঠিক বাইরে তৈরি করেছে। তবে হ্যাঁ, এটি কেবলমাত্র জিএনইউ বাইন্টিলসের বিপরীতে, x86 / x86-64। যাইহোক, এতে অনেকগুলি দুর্দান্ত x86- নির্দিষ্ট ইঙ্গিত রয়েছে যা এটি মন্তব্য হিসাবে যুক্ত করে, যেমন যখন কোনও অপেরেন্ড-আকারের উপসর্গটি কোনও ইন্টেল সিপিইউয়ের ডিকোডারগুলিতে একটি এলসিপি-স্টল তৈরি করতে পারে। যাইহোক, আপনার উত্তরে এটি উল্লেখ করুন। মন্তব্যের একটি প্রধান উদ্দেশ্য হ'ল পোস্টারটি তাদের উত্তরটি উন্নত করতে সহায়তা করে, কেবল দর্শকদেরও এটি পড়া দরকার as
পিটার কর্ডেস

4
@ পিটারকর্ডস হ্যাঁ ঠিক আছে আমার কাছে প্রধান ওএস হিসাবে মিরবিএসডি রয়েছে;)
মীরাবিলোস

@ পিটারকর্ডস তবে মনে হচ্ছে এটি কাঁচা বাইনারিগুলি বিচ্ছিন্ন করতে পারে না, তাই না? এর মধ্যে বেশ কয়েকটি নির্দেশের একগুচ্ছ খাওয়ানোর জন্য আমাকে ন্যূনতম ইএলএফ ফাইল তৈরি করতে হয়েছিল, তবে সম্ভবত আমি কিছু বিকল্প মিস করেছি?
রুসলান

4
@ রুসলান: আইডিকে, মজার প্রশ্ন। আমি সাধারণত কেবল অ্যাজডাম্প ব্যবহার করি, বা যদি আমি শাখার লেবেলগুলি চাই gcc -O3 -masm=intel -fverbose-asm -S -o- | less, যেহেতু আমি সাধারণত সি সোর্সটিকে ভাল এসএমকে সংকলনের জন্য টুইঙ্ক করার চেষ্টা করি।
পিটার

9

এই আদেশটি ব্যবহার করে দেখুন:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.