RetDec Imortek · v2.0.21

এমন একটি ডিকম্পাইলার যা ফিরিয়ে আনে অ্যালগরিদম, শুধু কোড নয়

প্রতিষ্ঠানগুলিকে প্রায়ই এমন সফটওয়্যার বুঝতে হয় যার সোর্স কোড তাদের কাছে নেই: পুরনো কোনো ব্যবস্থা, বাইরে থেকে কেনা কোনো অংশ, কিংবা এসে পৌঁছেছে অথচ সন্দেহজনক ঠেকছে এমন কিছু। মেশিন কোডকে আবার পড়ার মতো ধাপে ফিরিয়ে আনে এমন সরঞ্জাম আগে থেকেই আছে। RetDec Imortek আরও এক ধাপ এগিয়ে ওই ধাপগুলির নাম বলতে চায় — এই অংশটি অ্যাডভান্সড এনক্রিপশন স্ট্যান্ডার্ড (AES), এই অংশটি একটি সর্ট, এই অংশটি পাঠানোর জন্য ডেটা গোছানোর কায়দা।

ভাষাC++
সংস্করণv2.0.21
মূল প্রকল্পRetDec v5.0
স্টার2
সর্বশেষ পুশসম্প্রতি
RetDec ফর্ক করা হলো কেন

মূল RetDec v5.0 ২০২২ সাল থেকে নিষ্ক্রিয়। সত্যিকারের প্রশস্ত সামনের অংশ আছে এমন হাতে গোনা উন্মুক্ত ডিকম্পাইলারের একটি এটি — আর সেই প্রশস্ততা বাঁচিয়ে রাখার মতো।

যোগ হয়েছেশব্দার্থ-স্তরে লাইব্রেরি পুনরুদ্ধার
যোগ হয়েছেQt 6 ইন্টারফেস
যোগ হয়েছেঐচ্ছিক অফলাইন নিউরাল পরিশোধন
যোগ হয়েছেঅ্যালগরিদম, সমান্তরালতা ও সিরিয়ালাইজেশন শনাক্তকরণ
সহজ কথায়

এটি কী, এক মিনিটে

সমস্যা

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

সমাধান

এটি কম্পাইল করা ফাইলটি খুলে ফেলে তা থেকে আবার C গড়ে: পরীক্ষা-সংগ্রহের ২১৬টি বাইনারিই বিল্ডযোগ্য C হয়ে ফেরে। তারপর এটি মানের পিছনে ছোটে — কোন ক্রিপ্টোগ্রাফি, কোন সর্ট, কোন থ্রেডিং, কোন ফাইল ফরম্যাট — আর কতবার তা কাজে লাগে তা জানায়, যেখানে প্রায় লাগেই না সেই অবস্থাটিসহ।

কাদের জন্য

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

অ্যালগরিদমের নাম বলাই কঠিন অংশ, আর তার দুটি সংখ্যাই এখানে আছে। যে বাইনারি এখনও নিজের লেবেল বয়ে বেড়ায়, তাতে শনাক্তকারী সেগুলির সঙ্গে একমত হয়; লেবেল ছেঁটে ফেললে সে প্রায় আন্দাজের সমান। এই পাতার বাকিটা প্রকৌশল: কী যোগ হলো, কীভাবে মাপা হলো, আর কোথায় এটি ভেঙে পড়ে।
সবচেয়ে নিচের ধাপটি, সত্যি সত্যি

আসল ডিকোডারটাই, WebAssembly-তে কম্পাইল করা

এর উপরের সবটাই বিমূর্তনের মইয়ের ভিতর দিয়ে স্ক্রিপ্ট করা একটা হাঁটা। এটিই প্রথম ধাপ যা সত্যি সত্যি চলছে: Capstone — নেটিভ RetDec বিল্ড যে ডিসঅ্যাসেম্বলারের সঙ্গে লিংক করে সেই একই — আপনার পেস্ট করা বাইট ডিকোড করছে।

capstone — WebAssembly

৭৯১ কিলোবাইট (KB), কারণ সত্যিকারের একটি x86 ডিকোডার গোটা নির্দেশ-সেট বয়ে নেয় — প্রতিটি এনকোডিং, প্রিফিক্স ও এক্সটেনশন। জিনিসটার সৎ মাপ এটাই।

ডিকোডার
—
নির্দেশ
—
এটি ডিকোডার, ডিকম্পাইলার নয়। উপরের ধাপগুলি — LLVM মধ্যবর্তী উপস্থাপনায় (IR) তোলা, নিয়ন্ত্রণ-প্রবাহ গুছিয়ে আনা, অ্যালগরিদমের নাম বলা — LLVM-এর কাজ, আর LLVM কোনো মাপেই একটি ওয়েব পাতায় আঁটে না। অন্য কিছু বলা এই সাইটের সবচেয়ে সহজ মিথ্যা হতো।
Capstone 5, Emscripten দিয়ে বিল্ড করা, কেবল x86। নেটিভ বিল্ড একই লাইব্রেরি লিংক করে এখান থেকে: deps/capstone.
সামনের অংশ

নেটিভ, বাইটকোড ও নতুন ফরম্যাট

আউটপুট ফরম্যাটের উপর নির্ভর করে, কারণ সবকিছুই C-তে ডিকম্পাইল হয় বলে ভান করলে কারও লাভ নেই। সামনের অংশ নেটিভ বাইনারি নেয় নির্বাহযোগ্য ও লিংকযোগ্য ফরম্যাটে (ELF), পোর্টেবল এক্সিকিউটেবলে (PE) আর Mach-O-তে; বাইটকোড নেয়, যার মধ্যে আছে জাভা ভার্চুয়াল মেশিনের (JVM) ক্লাস ফাইল, ডালভিক এক্সিকিউটেবল (DEX) ও কমন ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (CIL); আর নেয় নতুন লক্ষ্য, যেমন CUDA-র প্যারালাল থ্রেড এক্সিকিউশন (PTX)।

নেটিভ

ELF · PE · Mach-O

C ছদ্মকোড তৈরি করে, সঙ্গে সেই শব্দার্থ-স্তরটি, যার জন্যই এই ফর্ক।

বাইটকোড

Python · Lua · JVM · DEX · CIL

Python আর Lua বাইটকোড নিজেদের ভাষাতেই ফিরে আসে; ম্যানেজড কোডের পথগুলি Java-ঘরানা বা C#-ঘরানার আউটপুট দেয়।

নতুন

WebAssembly · CUDA PTX

WebAssembly রূপান্তরিত হয় WebAssembly টেক্সট ফরম্যাটে (WAT)। PTX-কে পরে জোড়া কিছু নয়, প্রথম শ্রেণির ইনপুট হিসেবেই ধরা হয়।

ইন্টারঅ্যাক্টিভ

একটি ফাংশনকে বিমূর্তনের মই বেয়ে উঠতে দেখুন

একটি বাইনারি ফাংশন বেছে নিন আর সেটিকে পাইপলাইনের ভিতর দিয়ে ধাপে ধাপে চালান: কাঁচা বাইট, ডিসঅ্যাসেম্বলি, তোলা IR, C ছদ্মকোড, আর শেষে শব্দার্থের রায় — নামসহ অ্যালগরিদম, সঙ্গে যে প্রমাণ তাকে শনাক্ত করেছে।

বিমূর্তনের পাঁচটি ধাপ: কাঁচা বাইট, ডিসঅ্যাসেম্বলি, তোলা IR, C ছদ্মকোড, আর নামসহ অ্যালগরিদম তার স্পেসিফিকেশন-সূত্রসহ
পুরো চিত্রটি দেখতে স্ক্রল করুন →
শেষ ধাপটাই পণ্য। তার উপরের সবটাই অন্য ডিকম্পাইলাররা এমনিতেই আপনাকে দেয়।

retdec — স্পেসিফিকেশন নিষ্কাশন


          

শব্দার্থের রায়

এখনও উদ্ধার হয়নি
ধাপে ধাপে শব্দার্থের পর্যায় পর্যন্ত যান।

প্রমাণ

আত্মবিশ্বাস
—
ধরন
নাম ছাড়া

সিম্বল ছেঁটে ফেললে উদ্ধার কেবল গঠন থেকেই করতে হয় — ধ্রুবক, রাউন্ডের সংখ্যা, নিয়ন্ত্রণ-প্রবাহের আকার। ওটাই কঠিন পরিস্থিতি, আর মাপা F1 ০.০৫৬ ওটাকেই বোঝায়।

সত্যিকারের উদ্ধার-পর্যায়গুলির একটি স্ক্রিপ্ট করা প্রদর্শনী, এই পাতার জন্য লেখা। ডিকম্পাইলারটি নিজে C++-এ লেখা এবং অফলাইনে চলে।
এটি যা উদ্ধার করে

ছয় ঘরানার গঠন

রানটাইম

স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরির (STL) কনটেইনার আর C++ রানটাইম গঠন — একটি std::vector কনটেইনারের আকার আবার ফুটে উঠছে বরাদ্দের ধরন থেকে।

ক্রিপ্টোগ্রাফি

AES, সিকিউর হ্যাশ অ্যালগরিদম (SHA) পরিবার, ChaCha20, Rivest–Shamir–Adleman (RSA) আর উপবৃত্তীয় বক্ররেখার আদি-উপাদান, ধ্রুবক ও রাউন্ডের গঠন দেখে চেনা।

সর্টিং ও অনুসন্ধান

ইনট্রোসর্ট, মার্জ সর্ট, বাইনারি অনুসন্ধান — সঙ্গে সেই গভীরতা-সীমার সুইচ, যেটা ইনট্রোসর্টকে ধরিয়ে দেয়।

গ্রাফ

গ্রাফ অ্যালগরিদম, সঙ্গে প্রস্থ-প্রথম অনুসন্ধান (BFS) ও গভীরতা-প্রথম অনুসন্ধানের (DFS) পরিভ্রমণ-ধরন।

সমান্তরালতা

std::thread, pthreads, OpenMP, থ্রেডিং বিল্ডিং ব্লকস (TBB) আর কাঁচা অ্যাটমিক।

সিরিয়ালাইজেশন

Protobuf, FlatBuffers, MessagePack, JavaScript অবজেক্ট নোটেশন (JSON) আর এক্সটেনসিবল মার্কআপ ল্যাঙ্গুয়েজের (XML) ফ্রেমিং।

মাপা হয়েছে

২১৬টি বাইনারি, আর যে সংখ্যাটা গায়ে লাগে

পরীক্ষা-সংগ্রহের ২১৬টি ELF বাইনারিই বিল্ডযোগ্য C তৈরি করে, ব্যবহার করে --buildable, যা পূর্বনির্ধারিতভাবেই চালু থাকে। অ্যালগরিদম উদ্ধারের গল্পটা আলাদা, আর সেটা জানানোর সৎ উপায় হলো দুটি সংখ্যাই পাশাপাশি রাখা।

মাপকাঠিফলশর্ত
বিল্ডযোগ্য C আউটপুট216 / 216--buildable, পূর্বনির্ধারিতভাবে চালু
অ্যালগরিদম উদ্ধারের F10.056নাম ছাড়া, ৯৫% আস্থা ব্যবধান ০.০৩৪–০.০৮৩
অ্যালগরিদম উদ্ধারের F11.000নাম সহ, সিম্বলযুক্ত বাইনারি
পূর্বনির্ধারিত .c আবার কম্পাইল হয়নাএই ফর্কেও নয়, মূল RetDec-এও নয়
ওই দুটি F1 সংখ্যা একসঙ্গে পড়ুন। সিম্বল থাকলে ১.০০০ মানে শনাক্তকারী সিম্বল টেবিলের সঙ্গে একমত। সিম্বল ছাড়া ০.০৫৬ মানে, ছেঁটে ফেলা বাইনারিতে গঠন থেকে উদ্ধার আজকের দিনে প্রায় আন্দাজের সমান। শুধু প্রথমটা বললে সেটা হতো বিপণন; শুধু দ্বিতীয়টা বললে চাপা পড়ে যেত যে, হাতে কিছু থাকলে পাইপলাইনটা কাজ করে।
নিউরাল পরিশোধন

ঐচ্ছিক, অফলাইন, আর গেটে বাঁধা

পরিশোধন চলে llama.cpp দিয়ে, GGUF মডেল ব্যবহার করে, পুরোপুরি অফলাইনে, কেবল তখনই যখন RETDEC_NEURAL_REFINE=1 থাকে আর একটি মডেলের পথ দেওয়া হয়। এটি পূর্বনির্ধারিতভাবে বন্ধ, আর এটি কখনও ভিত্তি-আউটপুটের জায়গা নেয় না।

  • কম্পাইল গেট। পরিশোধিত আউটপুটকে পেরোতে হয় gcc -fsyntax-only গেট, তবেই সেটি গ্রহণ করা হয়।
  • গঠনগত যাচাই। পরিশোধনটিকে তবু তোলা গঠনের সঙ্গে মিলতে হবে।
  • নির্ধারণবাদী ভিত্তিটি অটুট রাখা হয়। পরিশোধন ছাড়া ডিকম্পাইলারের আউটপুটই নিরীক্ষাযোগ্য নিদর্শন হিসেবে থেকে যায়। কোনো ফল নিয়ে যুক্তি দিতে হলে আপনি সেটিকেই সামনে রাখবেন।
  • কোনো নেটওয়ার্ক নেই। স্থানীয় GGUF ইনফারেন্স। আপনার বাইনারির কিছুই মেশিন ছেড়ে যায় না।
$ export RETDEC_NEURAL_REFINE=1
$ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf
$ retdec-decompiler --buildable ./target.elf
কাদের জন্য

সোর্স কোড হারিয়ে গেলে একটি প্রোগ্রাম কী করে তা বের করে

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

01

ম্যালওয়্যার খুলে দেখা নিরাপত্তা দল

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

02

পুরনো সফটওয়্যার আছে অথচ সোর্স কোড নেই এমন কোম্পানি

সিস্টেমটা এখনও ব্যবসা চালাচ্ছে, আর যে লিখেছিল সে বছর কয়েক আগেই চলে গেছে। এটি সেটি কী করে তার একটি বিবরণ উদ্ধার করে, আর কেউ নিরাপদে নতুন করে বানানো বা বদলানোর আগে ঠিক সেটাই দরকার।

03

কেউ নথিভুক্ত করেনি এমন ফাইল ফরম্যাটে আটকে থাকা যে কেউ

পুরনো নথি, এমন একটা যন্ত্র যেটা কেবল নিজের সফটওয়্যারের সঙ্গেই কথা বলে, প্রতিযোগীর রপ্তানি করা ফাইল। এটি গঠনটা বের করে দেয়, যাতে আপনার নিজের সফটওয়্যার সেটি পড়তে পারে।

নিজের অবস্থাটা এখানে চিনতে পারছেন? এটি এখনই বেটা পরীক্ষার জন্য খোলা, আর যাদের জন্য এটি বানানো তাদের মতামতই একে সত্যিই বদলায়। বেটা টেস্টার হোন →
ইন্টারফেস

Qt 6 গ্রাফিকাল ইউজার ইন্টারফেস (GUI), কিংবা GUI-ই নয়

C, অ্যাসেম্বলি, IR আর নিয়ন্ত্রণ-প্রবাহের গ্রাফ জুড়ে মিলিয়ে রাখা কোড-দৃশ্য, সঙ্গে ফাংশন ভ্রমণ, স্ট্রিং পরিদর্শন, একটি বাইনারি ব্রাউজার ও একটি সহায়ক প্যানেল। হেডলেস মোড প্রতিটি GUI নির্ভরতা বাদ দেয়, ফলে একই বিল্ড কন্টিনিউয়াস ইন্টিগ্রেশনেও (CI) চলে।

দ্বৈত লাইসেন্স

ওপেন সোর্স ব্যবহারের জন্য GNU Affero জেনারেল পাবলিক লাইসেন্স (AGPL-3.0+), কিংবা মালিকানাধীন স্থাপনার জন্য একটি বাণিজ্যিক লাইসেন্স। কপিরাইট Odin Loch, Imortek নামে ব্যবসারত, ২০২৫–২০২৬।

v2.0.21-এ পাঠানোর মতো। CI গেটগুলি উৎপাদন-পর্যায়ের পরিপক্বতার মান নয়, উন্নয়নের অবস্থাই তুলে ধরে — প্রকল্প নিজেই তা বলেছে, এটি অনুমান নয়।