وعليكم السلام
يبدو انه لديك مفهوم خاطئ عن الهندسة العكسية وارجاع السورس كود لبرنامج ما.
دعني اوضح أولاً حياة البرنامج التنفيذي، انظر هنا:
كما موضح اعلاه، فالخطوة الاولى عندما تبرمج برنامج بلغة سي++ فانت ستكتب السورس كود اما في محرر (مثل ++notepad) او بيئة تطوير (مثل Visual Studio او Xcode) وستحفظ الملف، الملف سيحفظ بصيغة CPP
كما في اعلاه (على سبيل المثال Test.cpp)
الـPreprocessor هي مرحلة تسبق عملية الترجمة compile إذا تتم معالجة مسبقة للسورس كود قبل تمريره إلى المترجم compiler وكمثال بسيط عندما يكون هناك أمر توجيهي include فإنه يتم البحث عن المكتبة أو الملف المحدد ويتم تضمينه في الملف المصدري. إذ أن مهام المعالجة المسبقة preprocessor لا تتعلق بتنفيذ الكود وترجمته وإنما في بعض الإجرائيات الغير تنفيذية وإنما التوجيهية directive كما سنرى لاحقاً كالبحث عن الكلمات الرمزية المعرفة واستبدالها بالتعريفات الخاصة بها.
الـCompiler سيأخذ السورس كود ويحولة الى لغة الاسمبلي
الـAssembler سيحول اكواد الاسمبلي الى object code (ملف ينتهي بصيغة o. على لينكس و OBJ .على ويندوز)
الـ Linker سيأخذ الـ object code ويربط معها الـ library ويحولها لملف تنفيذي (البرنامج النهائي الذي نشغله)
------------
الان نأتي الى البرنامج Test.exe والذي هو حالياً بلغة الالة (اللغة التي يفهمها المعالج وهي متكونة من 1 و 0 ) اذا اردنا ان نقوم بالهندسة العكسية له عن طريق منقح مثل ollydbg او disassembler مثل ida pro
فكل عملها هو مجرد تحويل لغة الاله ( او عكسها بمعنى ادق) الى لغة الاسمبلي. يوجد برامج تحول لغة الاسمبلي الى لغة سي مزيفة او ما يسمى بـ Pseudocode ولكنه ليس الكود الحقيقي الذي كتبة المبرمج.
بأختصار بمجرد تحول البرنامج الى لغة الاله فمن المستحيل الحصول على السورس كود الخاص به، ذهب، اختفى من الوجود ولن يعود موجودا داخل البرنامج واقصى ما يمكنك عملة هو الحصول على كود اسمبلي للبرنامج او كود Pseudocode.
-----------
لمن لم توضح له الفكرة
هذا كود سي++
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!";
return 0;
}
سيحوله الـCompiler الى كود اسمبلي
_main PROC
push ebp
mov ebp, esp
push OFFSET $SG28103
push OFFSET std::basic_ostream<char,std::char_traits<char> > std::cout ; std::cout
call std::basic_ostream<char,std::char_traits<char> > & std::operator<<<std::char_traits<char> >(std::basic_ostream<char,std::char_traits<char> > &,char const *) ; std::operator<<<std::char_traits<char> >
add esp, 8
xor eax, eax
pop ebp
ret 0
_main ENDP
فهذا كل ما موجود وكود سي++ في الاعلى اختفى بدون رجعه