الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تشغيل البرنامج دون كتابة "main"

بدأه Ph-RevIng في 25 مارس 2010 · 3 رد · 940 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله تعالى وبركاته

الطريقة التي سنتكلم عنها لا تعني اننا لن نستدعي الدالة main بل عكس دالك سنقوم باستدعائها لكن بطريقة غير مباشرة :happy:

اولا لنرى الكود :

#include <stdio.h>

#define decode(s,t,u,m,p,e,d) m##s##u##t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
printf(" ArabTeam2000 ");

return 0;
}

طبعا استعمالنا الـDirective #define لتحقيق الخدعة ( ان صح التعبير :P )

#define decode(s,t,u,m,p,e,d) m##s##u##t

في هدا السطر نعلم المترجم بان يدمج لنا ( بالترتيب ) الحروف حسب مواقعها : الرابع ، الاول ، التالت ، التاني

الان الامر واضح فادا عملنا Decode للـ(a,n,i,m,a,t,e) ستنتج الكلمة main :P

int begin()

سيعوض begin بـmain

طريقة بسيطة يمكن استعمالها في تحقيق امور اخرى اشهرها Obfuscated Code

تم تعديل هذه المشاركة بواسطة Ph-RevIng في 25 مارس 2010 في 15:35

5
#2

فكرة عبقرية جميلة جداً

شكراً جزيلاً لك

#3

حركه حلوه .. بس مافهمتها .. ياليت تشرح بالتفصـيل .. خطوه خطوه ..

لاني مبتدئ

#4

السلام عليكم ...

+1 للموضوع الأصلي منذ زمن, و لكن للإجابة على سؤال الأخ.

اقتباس
ياليت تشرح بالتفصـيل .. خطوه خطوه ..

أول خطوة هي أن الـ Preprocessor سيقوم باستبدال begin بالتالي:

#define decode(s,t,u,m,p,e,d) m##s##u##t

int decode(a,n,i,m,a,t,e)()
{
printf(" ArabTeam2000 ");

return 0;
}

الخطوة بسيطة جداً, مجرد search/replace من قبل الـ preprocessor لا أكثر!

الخطوة الثانية هي تطبيق الماكرو المسمى decode. هذا الماكرو يستقبل سبعة معاملات و أسماها الأخ s, t, u, m, p, e, d

و لكن النقطة المهمة هي أنه استعمل المعامل: ## بين معاملات هذا الماكرو,

المعامل ## كل ما يقوم به هو عملية جمع النصين, أي ببساطة لو لدينا a و b فيسكون ناتج a##b عبارة عن ab

بعد ذلك تم استدعاء الماكرو, و ذلك بالمعاملات التالية:

decode(a,n,i,m,a,t,e)

لتفهم الذي حصل, فقط فكر كيف تعمل الدوال العادية, ماتم تمريره في الأعلى هي الـ arguments لهذا الماكرو, و ناتج هذا الماكرو هو جمع بعض الـ arguments مع بعضها البعض. الناتج بالطبع في النهاية:

int m##a##i##n()
{
printf(" ArabTeam2000 ");

return 0;
}

و من ثم يتم تحويله إلى:

int main()
{
printf(" ArabTeam2000 ");

return 0;
}

تحياتي...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 5 أبريل 2010 في 17:28

3

مواضيع مشابهة