আমি আমার যে বুটযোগ্য x86 ডিস্কের এমবিআর (প্রথম 512 বাইট) বিচ্ছিন্ন করতে চাই। আমি এমবিআর ব্যবহার করে একটি ফাইলে অনুলিপি করেছি
dd if=/dev/my-device of=mbr bs=512 count=1
লিনাক্স ইউটিলিটির জন্য কোনও পরামর্শ যা ফাইলটি বিচ্ছিন্ন করতে পারে mbr
?
উত্তর:
আপনি অবজডাম্প ব্যবহার করতে পারেন। এই নিবন্ধ অনুযায়ী বাক্য গঠনটি হ'ল:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
পরিবর্তে -b
। -D
"সমস্ত বিভাগের বিষয়বস্তু পৃথক করা"; -b bfdname
বা --target=bfdname
নির্দিষ্ট অবজেক্ট-কোড ফর্ম্যাট হিসাবে পড়তে বাধ্য করবে (আমাদের ক্ষেত্রে অলফ নয় তবে কাঁচা বাইনারি); -m machine
ব্যবহারের জন্য আর্কিটেকচারটি নির্দিষ্ট করে দেবে (আমাদের ফাইলে আর্চের তথ্য সহ কোনও শিরোনাম নেই)। -M options
বিচ্ছিন্নকরণের বিকল্পগুলি; addr16,data16
"ডিফল্ট ঠিকানা আকার এবং অপারেন্ড আকার নির্দিষ্ট করতে" (সর্বজনীন x86 বিচ্ছিন্ন ইঞ্জিনে কোড i8086 হিসাবে বিবেচনা করুন)
জিএনইউ সরঞ্জামটিকে অ্যাজডাম্প বলা হয় , উদাহরণস্বরূপ:
objdump -D -b binary -m i8086 <file>
-m i386
বা -Mintel,x86-64
। i8086
একটি পুরানো স্থাপত্য এবং এটি আধুনিক কোডের জন্য ব্যবহার করা অপ্রত্যাশিত ফলাফল পেতে পারে। তদ্ব্যতীত, উল্লেখ x86-64
করার -M
একটা ভাল ধারণা আজকাল হতে পারে থেকে বহু মেশিন 64-বিট আছে। পাসিং intel
করতে -M
পরিবর্তনগুলি ইন্টেল-শৈলী পরিবর্তে ডিফল্ট যেমন AT & T শৈলী, যা আপনি বা নাও করতে পারে পারে সিনট্যাক্স।
আমি ndisasm
এই উদ্দেশ্যে পছন্দ করি । এটি এনএএসএম এসেম্বলারের সাথে আসে, যা নিখরচায় ও মুক্ত উত্স এবং বেশিরভাগ লিনাক্স ডিস্ট্রোজের প্যাকেজ সংগ্রহস্থলের অন্তর্ভুক্ত।
ndisasm -b16 -o7c00h -a -s7c3eh mbr
ব্যাখ্যা - ndisasm ম্যানপেজ থেকে
-b
= 16-, 32- বা 64-বিট মোড নির্দিষ্ট করে। ডিফল্টটি 16-বিট মোড।-o
= ফাইলের জন্য কল্পিত লোড ঠিকানা নির্দিষ্ট করে। এই বিকল্পটি এনডিআইসেমকে ডানদিকে বাম হাতের মার্জিনের নীচে দেওয়া ঠিকানাগুলি এবং পিসি-আপেক্ষিক জাম্প এবং কলগুলির লক্ষ্য ঠিকানাগুলি পেতে ডেকে আনে।-a
= স্বয়ংক্রিয় (বা বুদ্ধিমান) সিঙ্ক মোড সক্ষম করে, যেখানে আপেক্ষিক জাম্পগুলির টার্গেট ঠিকানাগুলি পরীক্ষা করে এবং এটিকে ডিসএসেমেবলস হিসাবে কল করে এনডিস্মম কোথায় সিঙ্ক্রোনাইজেশন করা উচিত তা অনুমান করার চেষ্টা করবে।-s
= ম্যানুয়ালি একটি সিঙ্ক্রোনাইজেশন ঠিকানা নির্দিষ্ট করে, যেমন ndisasm কোনও মেশিনের নির্দেশকে আউটপুট দেয় না যা ঠিকানার উভয় পক্ষের বাইটকে অন্তর্ভুক্ত করে। সুতরাং যে ঠিকানাটি সেই ঠিকানায় শুরু হয় তা সঠিকভাবে বিযুক্ত করা হবে।mbr
= ফাইলটি বিযুক্ত করা হবে।-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.
স্টার ব্লু এবং হলভডাল উভয়েরই ক্যানোনিকাল উত্তরের অংশ রয়েছে। আপনি যদি কাঁচা আই 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 মধ্যে উপস্থিত জন্য প্রাসঙ্গিক।
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, যেহেতু আমি সাধারণত সি সোর্সটিকে ভাল এসএমকে সংকলনের জন্য টুইঙ্ক করার চেষ্টা করি।