লিনাক্স এক্সিকিউটযোগ্য ফাইলগুলিতে কোড রূপান্তরকরণের ধরণ


13

আমি জিজ্ঞাসা করতে চাই যে লিনাক্স এক্সিকিউটেবল ফাইলগুলি যেমন হেক্সাডেসেমাল, বাইনারি বা অন্য কোনও কিছুর জন্য কী ধরণের এনকোডিং ব্যবহৃত হয়। কিভাবে এটি রূপান্তরিত হয়? এই নির্বাহযোগ্য ফাইল থেকে মূল কোডটি ফিরে পাওয়ার কোনও উপায় আছে কি?

আমার কাছে কোডের একটি বিট রয়েছে:

ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N�    4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)

মনে করার অর্থ কি?


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

সম্ভাব্য / আংশিক সদৃশ? stackoverflow.com/questions/193896/whats-a-good-c-decompiler
arielf

উত্তর:


29

এটা বাইনারি। উত্স কোড সংকলিত হয়েছে। আপনি এটিকে এডিটরটিতে দেখতে পারেন (এর মতো একটি হেক্স সম্পাদক blessআরও শোধিত পরিবর্তন আনতে পারে) তবে আপনি কী করছেন তা সত্যই আপনার জানতে হবে। স্ট্রিং পরিবর্তনগুলি করার জন্য এটি সম্ভবত ভাল।

আর কিছু হার্ডকোর, যদি আপনি বা বাইনারি রিভার্স ইঞ্জিনিয়ার শুরু করতে পারেন সমাবেশ কোড। এটি প্রায়শই সর্বনিম্ন স্তরের মানব-পার্সেবল কম্পিউটার ভাষা হিসাবে বিবেচিত হয়।

objdump -d helloworld | less

তবে এতে প্রচুর সংকলক বাজে কথাও অন্তর্ভুক্ত থাকবে। উদাহরণস্বরূপ, আপনি জি ++ দিয়ে সর্বাধিক সহজhelloworld.cpp সংকলন করেন এবং তারপরে objdump, আপনি 226 লাইন (208 টি ছিটিয়ে) ইয়াক দিয়ে শেষ করেন। আপনি সমাবেশের মাত্র 15 লাইনগুলিতে একটি "হ্যালো ওয়ার্ল্ড" লিখতে পারেন , এটি এবং objdumpএটি সংকলন করুন তবে এটি এখনও 166 লাইনে (ফেলা) ফোটে।

আপনি যদি সমাবেশে যথেষ্ট ভাল হন তবে এটি আপনাকে কী ঘটছে তা বুঝতে যথেষ্ট অ্যাক্সেস দিতে পারে এবং এমনকি এটি পরিবর্তন করতে দেয় ... তবে আপনার মূল প্রশ্নের উত্তর দিতে:

আপনি সংকলিত কোডটি মূল উত্স কোডে ফিরে যেতে পারবেন না ।

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

সমস্যার স্কেল সম্পর্কে আপনাকে ধারণা দিতে, বিপরীত প্রকৌশল সফ্টওয়্যারটির সম্পূর্ণ ধারণাটির নিজস্ব স্ট্যাক এক্সচেঞ্জ সাইট রয়েছে


আপনি কি আমাকে বলতে পারেন যে আমি কীভাবে এটি প্রকৌশলীকে বিপরীত করব এবং উত্সটি হারিয়েছি সর্বাধিক পরিমাণ কোড
কোজে ফিরে পাব

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

1
সর্বাধিক পরিমাণের কোডটি ফিরে পাওয়ার উপায়টি হল সাম্প্রতিকতম ব্যাকআপটি পুনরুদ্ধার করা। এটিও ঘটনাক্রমে, আসল উত্স কোডের মতো কিছু বিশ্বাসযোগ্যতার সাথে ফিরে আসার একমাত্র উপায়।
একটি সিভিএন

1
মোটামুটি শেষ অনুচ্ছেদের সাথে একমত নন, কেবল একটি পার্শ্ব নোট: কিছু ডিসকম্পিলার আইএমই সঠিক কোড কাঠামোটি পুনরুদ্ধার করতে দুর্দান্ত কাজ করে (অবশ্যই আপনি মন্তব্য, ফর্ম্যাটিং, চিহ্নগুলির নাম ...) বলে রেখেছেন। আপনি যদি প্রোগ্রামটি প্রথমে না লিখে থাকেন তবে উদ্ধার হওয়া উত্স কোডটি এখনও বোধগম্য হতে পারে, তবে আমি মনে করি এটি হারিয়ে যাওয়ার উত্স কোড / একটি অজানা উত্স কোড (এর কমপক্ষে কিছু অংশ সহ) পুনরুদ্ধার করার একটি দুর্দান্ত বিকল্প think নির্দিষ্ট কোডের উপর নির্ভর করে এবং
আপনিও

1
মালিকানাধীন সফ্টওয়্যার জগতের এই সমস্ত EULA বলে যে আপনাকে করার অনুমতি নেই - বিপরীত প্রকৌশল / বিযুক্তি। এগুলিতে এটির মতো ধারা রয়েছে কারণ এটি করা সম্ভব - তবে অবশ্যই সহজ নয়! তবে @ মাইকেলKjörling যেমন বলেছেন, জিনিসগুলি ফিরিয়ে আনার একমাত্র ভাল উপায় হ'ল আপনার যত্ন নেওয়া কোনও কিছুর জন্য ব্যাকআপের একাধিক স্তর।
জো

7

আমার একটি মন্তব্যের জন্য যথেষ্ট খ্যাতি পয়েন্ট নেই তাই এটি একটি উত্তর:

না, এটি "ফিরে" রূপান্তর করা সম্ভব নয়। আপনি upx প্যাকার উল্লেখ করেছেন, আপনি কি কখনও upx এর ম্যানুয়াল পড়েছেন?

যদি আপনি উত্সটি হারিয়ে ফেলে থাকেন বা অন্য কারও কোডে অ্যাক্সেস না পেয়ে থাকেন তবে এখানে কোনও ব্যাপার না, এটি কেবল সম্ভব নয়।

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


3

এটি সম্ভবত একটি বাইনারি ফাইল (একটি ELF ফাইল) যা এখানে সুন্দরভাবে বর্ণিত হয়েছে:

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

আপনি যদি এটি কোনও সাধারণ টেক্সট সম্পাদক দিয়ে পরিবর্তন করে থাকেন এবং আপনার পরিবর্তনগুলি সংরক্ষণ করেন তবে এটি কোনও ভাল ধারণা ছিল না এবং আপনি এটি নষ্ট করে দিয়েছেন।


3

অলি যেমন ইতিমধ্যে তার উত্তরে উল্লেখ করেছেন, আপনি কার্যকর করতে পারবেন না এমন একটি আসল উত্স কোড পাবেন।

একটি উত্স কোড সংকলনের সময় (সংকলনটি এর বিস্তৃত স্বীকৃতি হিসাবে চিহ্নিত, সুতরাং সম্পূর্ণ প্রক্রিয়া যা কোনও উত্স কোডকে "কার্যকর" হিসাবে রূপান্তর করে) হিসাবে, প্রচুর তথ্য হারিয়ে যায়।

সি প্রিপ্রসেসর, একজনের জন্য নিম্নলিখিতগুলি (অন্যান্য জিনিসের মধ্যে) করবে:

  • প্রিপ্রসেসর নির্দেশিকা ( #বিবৃতি) ব্যাখ্যা, নির্বাহ এবং সরান
  • মন্তব্যগুলি সরান
  • অপ্রয়োজনীয় সাদা স্থান সরান

অন্যদিকে উত্স কোডটি সংকলনের সময় যা হারিয়ে যায়নি তা প্রযুক্তিগতভাবে সমতুল্য উত্স কোডটিতে প্রত্যাবর্তনযোগ্য।

এই কারণ:

  • বাইনারি নির্দেশাবলীর সমাবেশ নির্দেশাবলীর সাথে একটি 1: 1 জবাবদিহি রয়েছে; অ্যাসেম্বলি সোর্স কোডটি একত্রিত করা কেবলমাত্র সংবিধানের সারণির উপর ভিত্তি করে বাইনারি নির্দেশাবলীর কাছে কেবল সমাবেশ নির্দেশাবলীকে রূপান্তর করা; একটি একক বাইনারি নির্দেশ সর্বদা সনাক্তযোগ্য এবং একক সমাবেশ নির্দেশে প্রত্যাবর্তনীয় ;
  • পরিষদের নির্দেশাবলী না সি নির্দেশাবলী সহ 1 corrispondency;: একটি 1 আছে সি উত্স কোডের সংকলনটি সাধারণত মুদ্রাক্ষরনের সারণির উপর ভিত্তি করে সমাবেশের নির্দেশাবলীতে সি নির্দেশিকাগুলির কেবল রূপান্তর নয়, বাস্তবে এটি প্রায়শই বিপরীত হয়; সাধারণত সি নির্দেশকে একাধিক (সংকলকের ভিত্তিতে প্রায়শই বিভিন্ন) রূপান্তর করা হয় সমাবেশ নির্দেশাবলী; যাইহোক, একাধিক সমাবেশ নির্দেশাবলীর নিদর্শনগুলি সাধারণত একক সি নির্দেশায় সনাক্তযোগ্য এবং প্রত্যাবর্তনীয় ;

ডেকম্পিলার নামক একটি সরঞ্জাম রয়েছে যার উদ্দেশ্য একটি নির্বাহযোগ্যকে কার্যত সমমানের উত্স কোডে ফিরিয়ে আনার চেষ্টা করা; তবে ফলাফলটি সাধারণত খুব আসল উত্স কোড থেকে অনেক দূরে থাকে (এবং সাধারণত এটি অপ্রতিরোধ্যও হয়);

এই প্রোগ্রামটি বিবেচনা করুন:

#include <stdio.h>

#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered

/*

This comment and the comment above won't be recovered

*/

int main(int argc, char* argv[]) {
    printf(MESSAGE);
    return 0;
}

এটিকে একটি এক্সিকিউটেবলের মধ্যে সংকলন করে এবং এটিকে আবার উত্স কোডে ছড়িয়ে দেওয়ার মাধ্যমে আপনি সাধারণত ফিরে যাবেন এটি কম-বেশি হয় (এই নির্দিষ্ট ক্ষেত্রে আমি gcc/ বুমেরাং ব্যবহার করেছি ):

// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
    printf("Literal strings will be recovered");
    return 0;
}

পূর্বাভাস হিসাবে:

  • প্রাক প্রসেসরের নির্দেশাবলী অনুপস্থিত
  • মন্তব্যগুলি নিখোঁজ রয়েছে (বাদে // address: 0x80483fb, যা ডিকম্পেলার দ্বারা যুক্ত করা হয়েছে)
  • অপ্রয়োজনীয় শ্বেত স্পেস অনুপস্থিত (নতুন লাইন এবং ট্যাবুলেশনগুলি বাদ দিয়ে, যা ডিকম্পাইলার দ্বারা যুক্ত করা হয়েছে)

এটিও বেশ ভাল ফলাফল; কোডটিতে ইনলাইন সমাবেশ নির্দেশাবলী পাওয়া বিরল নয়:

asm("assembly_instruction");
__asm__("assembly_instruction");

নীচের লাইনটি (অন্যান্য উত্তরগুলিতে ইতিমধ্যে দেখানো হয়েছে): আপনি কার্যকরযোগ্য * এর খুব মূল উত্সটি পেতে পারেন না

* কিন্তু, এক্সিকিউটেবল এবং আপনার ভাগ্য উপর নির্ভর করে, আপনি পারে একটি decompiler ব্যবহার করে কিছু পেতে সক্ষম হবেন।


2

আপনি সংকলিত প্রোগ্রামগুলির বিষয়ে কথা বললে এক্সিকিউটেবলগুলি সাধারণত বাইনারি হয়। আপনি ব্যবহার করে আরও তথ্য পেতে পারেন file path/to/executable। আপনি হেক্সাডেসিমালে উদাহরণস্বরূপ বাইনারি এক্সিকিউটেবলগুলি প্রদর্শন করতে পারেন hexdump -C path/to/executable | less(যা ভাল তা আপনারই করবে)। আপনি যদি "এটিকে তার মূল রূপে ফিরিয়ে আনতে চান" তবে আপনাকে এই পোস্টটি দেখতে একটি উপযুক্ত ডিসকম্পেলার ব্যবহার করতে হবে , উদাহরণস্বরূপ , যদিও এটি আপনাকে বেশ অপঠনযোগ্য কোড দিতে পারে তবে এটি মূলটি সংকলিত হয়নি। এটি যদি সংকলিত বাইনারি না হয় তবে এটি একরকম এক্সিকিউটেবল স্ক্রিপ্ট হবে, যা কোনও পাঠ্য সম্পাদককে সহজেই পঠনযোগ্য। আপনি এখানে আমাদের যা দেখিয়েছেন সম্ভবত এটি সম্পাদিত কার্যকর comp ইএলএফ এর অর্থ "এক্সিকিউটেবল এবং লিঙ্কিং ফর্ম্যাট" যা লিনাক্স / ইউনিক্স সিস্টেমে একটি সাধারণ বাইনারি ফর্ম্যাট। সেখানে 'strings path/to/executable, আপনার যদি এটি প্রয়োজন হয়।


আমি এটি upx প্যাকার দিয়ে ইঞ্জিনিয়ারের বিপরীত করার চেষ্টা করেছি কিন্তু কার্যকর হয়নি এবং আপনার প্রস্তাবিত পোস্টের সাথেও। অন্য কোনও উপায় আছে কিনা দয়া করে আমাকে বলুন।
redchief

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