অলি যেমন ইতিমধ্যে তার উত্তরে উল্লেখ করেছেন, আপনি কার্যকর করতে পারবেন না এমন একটি আসল উত্স কোড পাবেন।
একটি উত্স কোড সংকলনের সময় (সংকলনটি এর বিস্তৃত স্বীকৃতি হিসাবে চিহ্নিত, সুতরাং সম্পূর্ণ প্রক্রিয়া যা কোনও উত্স কোডকে "কার্যকর" হিসাবে রূপান্তর করে) হিসাবে, প্রচুর তথ্য হারিয়ে যায়।
সি প্রিপ্রসেসর, একজনের জন্য নিম্নলিখিতগুলি (অন্যান্য জিনিসের মধ্যে) করবে:
- প্রিপ্রসেসর নির্দেশিকা (
#
বিবৃতি) ব্যাখ্যা, নির্বাহ এবং সরান
- মন্তব্যগুলি সরান
- অপ্রয়োজনীয় সাদা স্থান সরান
অন্যদিকে উত্স কোডটি সংকলনের সময় যা হারিয়ে যায়নি তা প্রযুক্তিগতভাবে সমতুল্য উত্স কোডটিতে প্রত্যাবর্তনযোগ্য।
এই কারণ:
- বাইনারি নির্দেশাবলীর সমাবেশ নির্দেশাবলীর সাথে একটি 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 ব্যবহার করে কিছু পেতে সক্ষম হবেন।
strings
কোনও নির্দিষ্ট বাইনারি প্রোগ্রামটি কী বা কী তা সনাক্ত করতে ফিল্টার প্রোগ্রামটি খুব কার্যকর হতে পারে কারণ এটি একটি নির্দিষ্ট দৈর্ঘ্যের চেয়ে বেশি থাকা সমস্ত এম্বেডযুক্ত পাঠ্য স্ট্রিং প্রিন্ট করবে বাইনারি ফাইল এবং কোনও প্রোগ্রামের বার্তাগুলি দেখে মাঝে মাঝে আপনাকে এটি কী এবং কী হয় তা সম্পর্কে অনেক কিছু জানায়।