সংকলনের পরে আমরা কেন বাইনারি ফাইলের বিষয়বস্তু বুঝতে পারি না?


10

আমি যতদূর জানি, প্রতিটি প্রোগ্রামে প্রসেসরের রেজিস্টারগুলিতে কাজ করার জন্য কিছু নির্দিষ্ট ডেটা ভেরিয়েবল (ফ্লোট, ইনট, চর ...) সহ প্রসেসরের নির্দেশাবলীর একটি প্যাক থাকে ।

সুতরাং, প্রথম জিনিসটি যা আমি এটি সম্পর্কে ভেবেছিলাম (অনেক দিন আগে) তা হ'ল আপনি যদি জানেন যে একটি x86 এর ASCII মান %¨#$¨#(কেবল একটি এলোমেলো উদাহরণ) এর স্ট্যাক পয়েন্টার রেজিস্টারের ঠিকানা (কেবল উদাহরণ দিয়ে দেওয়া) হিসাবে ব্যাখ্যা করা যেতে পারে প্রসেসর। যদি এটি সত্য হয়, প্রতিবার বাইনারি ফাইলের বিষয়বস্তু পড়ার সময় আপনি যখন এই "অপঠনযোগ্য" মানটি খুঁজে পান, আপনি ব্যাখ্যা করতে পারেন যে স্ট্যাক পয়েন্টার রেজিস্টারটি কিছু ডেটা ভেরিয়েবল পরিচালনা করতে ব্যবহৃত হচ্ছে।

দুর্ভাগ্যক্রমে এটি ঘটে না। নীচে, ping.exeউইন্ডোজ থেকে প্রোগ্রামটির বিষয়বস্তুর উদাহরণ রয়েছে যা দিয়ে খোলা হয়েছে notepad.exe:

এমএস নোটপ্যাডে দেখা হিসাবে পিং.এক্সি

এটি একটি বাইনারি ফাইল এবং এর ডেটা আমাদের মানবদের জন্য বোধগম্য (এটি মেশিনগুলির জন্য বোধগম্য)) তারা অ্যাসেম্বলি কোড (মেশিন ভাষার সর্বনিম্ন স্তর।) জানলেও কারও কাছে এটির কোনও অর্থবোধ করে না )

সুতরাং, আমি যদি সমস্ত কিছু সঠিকভাবে বুঝতে পারি তবে কেউ ব্যাখ্যা করতে পারে

  1. কেন বাইনারি কোড অ্যাসেম্বলি কোডটিতে এতটা দূরে, একই জিনিস থেকে ফিরে আসতে পারে না?
  2. যদি কেউ অ্যাসেম্বলি কোড বুঝতে পারে তবে এই কোডটি "পঠনযোগ্য" এর ফলে সংকলিত বাইনারি কেন আর নয়?

12
আপনি পারবেন, আপনার কেবল একটি বিচ্ছিন্নকারী প্রয়োজন ।
ডেভিড শোয়ার্জ

তাহলে আমি কোনও .exe ফাইলকে ডিসএসেম্বলি করতে পারি ??? আমি কেবল জানতাম যে এটি পরিচালিত কোডের সাথে কাজ করে ...
ডায়োগো

13
আপনি যে কোনও এক্সিকিউটেবলকে বিযুক্ত করতে পারেন। আপনি বিচ্ছিন্ন আউটপুটটি বোঝাতে পারেন কিনা তা অন্য গল্প।
ডেভিড শোয়ার্টজ

5
সংকলন বা সমাবেশ প্রচুর পরিমাণে মানব-তাত্পর্যপূর্ণ তথ্য যেমন ভেরিয়েবলের নাম, শাখার লেবেল ইত্যাদিকে সরিয়ে দেয়, ত্রুটিযুক্তভাবে নির্দেশিকা স্ট্রিম পান তবে আপনার এখনও অনেক কিছু বের করার দরকার আছে।
এমপিজ 0

উত্তর:


12

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

আপনি এর মতো MOV AL,SPবা অনুরূপ কোনও কিছুর অপকোড খুঁজে বের করতে পারেন এবং তারপরে এটি অনুসন্ধান করতে পারেন। x86 এর প্রচুর নির্দেশনা রয়েছে যা স্ট্যাক পয়েন্টারটিতে কাজ করে।

কিন্তু দয়া করে দয়া করে নোটপ্যাড ব্যবহার প্রস্থান তাহলে এর পরিবর্তে একটি হেক্স সম্পাদক ব্যবহার করুন। আমি HxD সুপারিশ করব, যদিও আরও অনেক আছে।

এবং @ ডেভিড শোয়ার্জ ঠিক আছে। একটি বিচ্ছিন্নকারী একটি ফাইলের মাধ্যমে পুনরাবৃত্তি করবে এবং ওপকোডগুলি পঠনযোগ্য পাঠ্যে অনুবাদ করবে। আপনি যা করতে চান তা সম্পূর্ণ সম্ভব।

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


1
আইডিএ সবচেয়ে সাধারণ পিই বিতরণকারীগুলির মধ্যে একটি। লিনাক্স এবং ম্যাক ফাইলগুলির সাথেও কাজ করে। সংস্করণ 5.0 এখনও ফ্রিওয়্যার হিসাবে উপলভ্য
স্কট চেম্বারলাইন

1
> আপনি যদি ভুল ঠিকানায় শুরু করেন, ... ভুল ব্যাখ্যা করা যেতে পারে। যে কারণে সমস্ত ঘটনা %¨#$¨#অগত্যা স্ট্যাক-পয়েন্টারটির একটি উল্লেখ হতে পারে না; এটি কেবল দুটি ভিন্ন কমান্ডের মাঝামাঝি হতে পারে : _3p%¨#এবং $¨#b5F( _3p   %¨#$¨#   b5F)।
Synetech

11

সুতরাং, যদি আমি সবকিছু সঠিকভাবে বুঝতে পারি

বেশ না।

এটি একটি বাইনারি ফাইল এবং এর ডেটা আমাদের মানুষের জন্য বোধগম্য

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

অন্যদের দ্বারা ইতিমধ্যে উল্লিখিত হিসাবে, বাইনারি ফাইলগুলি, যার মধ্যে সংখ্যা রয়েছে, একটি হেক্স ডাম্প প্রোগ্রাম বা হেক্স সম্পাদক দ্বারা দেখা উচিত এবং পাঠ্য দর্শকের দ্বারা নয়।

পিং.এক্সই প্রোগ্রামের সামগ্রীর উদাহরণ রয়েছে

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

আপনি যে "প্রোগ্রাম ফাইল" এর কথা ভাবছেন সম্ভবত তাকে বাইনারি ইমেজ ফাইল বা প্রোগ্রাম মেমোরির ডাম্প বলা হয়। এই জাতীয় ফাইলটিতে কেবলমাত্র মেশিন কোড এবং ডেটা থাকবে, ঠিকানার জন্য কার্যকরভাবে নির্ধারিত সমস্ত ঠিকানার উল্লেখ রয়েছে।

এমনকি যদি তারা সংসদীয় কোড জানে (মেশিন ভাষার সর্বনিম্ন স্তর))

সমাবেশ ভাষা মেশিন ভাষার মতো নয় । টিপিক্যাল (উচ্চ-স্তরের ভাষার কম্পিউটারগুলি বাদ দিতে) সিপিইউ মেশিন কোডকে ইনপুট হিসাবে গ্রহণ করে, একবারে একটি নির্দেশ। অপারেশনগুলি হয় নিবন্ধভুক্ত বা সংখ্যাযুক্ত মেমরি ঠিকানা। অ্যাসেম্বলি ভাষা হ'ল একটি উচ্চ-স্তরের ভাষা যা নির্দেশের অবস্থান এবং ভেরিয়েবলগুলির জন্য প্রতীকী লেবেল ব্যবহার করতে পারে , পাশাপাশি সংখ্যাসূচক অপ-কোডগুলি স্মৃতিবিদ্যার সাথে প্রতিস্থাপন করতে পারে। অ্যাসেম্বলি ভাষা প্রোগ্রামটি বাস্তবায়িত হওয়ার আগে মেশিনের ভাষা / কোডে রূপান্তর করতে হয় (সাধারণত এসেম্বলার, লিঙ্কার এবং লোডার নামে পরিচিত ইউটিলিটিগুলি)।

বিপরীত অপারেশন, বিচ্ছিন্নতা, কিছু সাফল্য এবং প্রতীকী তথ্য হারাতে প্রোগ্রাম ফাইলগুলিতে সঞ্চালিত হতে পারে। কোড এবং ডেটা অবস্থানগুলি ম্যানুয়ালি সনাক্ত করা দরকার বলে মেমোরি ডাম্প বা প্রোগ্রামের চিত্র ফাইলটি ছিন্ন করা আরও পরীক্ষা ও ত্রুটি is

বিটিডব্লিউতে এমন ব্যক্তি রয়েছে যা (সংখ্যাসূচক) মেশিন কোডটি পড়তে এবং কোড করতে পারে। এক ডজন মেমরি অ্যাড্রেস মোড সহ 32-বিট সিআইএসসি প্রসেসরের চেয়ে 8-বিট সিপিইউ বা মাইক্রোকন্ট্রোলারে অবশ্যই এটি অনেক সহজ।


2

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

সুতরাং একটি পাঠ্য সম্পাদকে একটি বাইনারি ফাইল খোলার ফলে সমমানের ASCII অক্ষর পাওয়া যাবে যা বাইনারি ডেটার মূল বিন্যাসটির কোনও পাঠ্য সম্পাদক দ্বারা পার্স করার মতো কোনও ধারণা রাখে না। যেমন উল্লিখিত হয়েছে, খাঁটি বাইনারি বিন্যাসে সামগ্রীগুলি দেখতে হেক্স সম্পাদক এবং কারও কারও কাছে বাইনারি বৈশিষ্ট্য রয়েছে।

আপনি ভুল যে বাইনারি ফাইলের বিষয়বস্তু বোঝা যায় না। যদিও তারা কঠোর হবে এবং আধুনিক কম্পিউটার আর্কিটেকচারে একমাত্র বাইনারি থেকে সিএসইউ দ্বারা কার্যকর (বা অনুকরণীয় / ভার্চুয়াল সিপিইউ) ইত্যাদির জন্য স্বীকৃত সঠিক নির্দেশাবলীর পক্ষে বাইনারি থেকে পৃথক করা খুব কঠিন , এটি করা যেতে পারে।

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

আরেকটি বিষয় লক্ষণীয় যে নিম্নতম স্তরে, যদিও সম্পর্কিত

বাইনারি সাধারণত এটির সাথে 1: 1 হয়, সুতরাং এটির জন্য নম্বর সিস্টেমটি ব্যবহার করা এটি যথেষ্ট অর্থবোধ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.