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

كيف استدعي دوال ال API الغير معرفة في البرنامج

مغلق
بدأه حيدر يوسف في 15 يناير 2006 · 6 رد · 1,230 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اذا كان عندي برنامج بسيط يقوم بعرض MessageBox فقط وينهي البرنامج

كيف اضيف له بعض الدوال خاصة

LoadLibrary و GetProcAdd وهي غير موجودة في البرنامج

السؤال الثاني

الدوال الموجودة في الملف التنفيذي لها عناوين موجودة ايضا في الملف فهل عناوين دوال الAPI ثابتة في الذاكرة لكل جهاز مثل عناوين المقاطعات في نظام DOS؟

مع الشكر الجزيل

#2

راجع /index.ph...topic=68966&hl=

/index.ph...topic=56525&hl=

بالنسبة للسؤال الثاني, عناوين دوال الـ API تتغير تبعا للنظام وليست ثابتة لذلك يتم استخدام GetProcAddress للحصول على عنوان الدالة.... اعتقد ان الاخ chik منذ زمن كتب برنامج لا ادري ان كان موجودا في المنتدى .. فيه يظهر كيفية استدعاء الدالة بالعنوان المطلق لها... لم اعد اذكر التفاصيل للاسف.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

الاخ العزيز شكرا جزيلا على الرد

يبقى عندي سؤال : هل يمكن استدعاء احد الدوال في run time اقصد قد يكون موقع احد الدوال في مكان ما في الذاكرة؟

انا لاحظت بان اول عنوان في المكدس هو لدالة قمت ب pop للقيمة واستدعيتها فقامت بانهاء البرنامج ولا ادري هل كلامي دقيق ام لا؟

على العموم شكرا للرد

#4
اقتباس
هل يمكن استدعاء احد الدوال في run time اقصد قد يكون موقع احد الدوال في مكان ما في الذاكرة؟

اعتقد يمكن ذلك لكنك تحتاج الى الوصول الى العنوان المطلق للدوال الذي يطلب الدالة مباشرة من الذاكرة. اعتقد ان الاخ chik كتب برنامجا من قبل مع مثال.. لم اعد اذكر اين يمكنك ايجاده.. يوضح في المثال كيفية الوصول الى هذه العناوين... ستحتاج الى البحث والتنقيب في مواضيع الاخ chik وفقه الله السابقة من خلال ملفه الشخصي.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

الاخ العزيز

يمكن معرفة تفاصيل الملف kernel32.dll بواسطة تحميله باستخدام PElord ومعرفة ImageBase ومن ثم من export table يمكن معرفة RVA لاي دالة وبذلك يمكن استدعاء اي دالة مباشرة لان المكتبة kernel32 دائما يتم تحميلها في نفس المكان في الذاكرة وقد قمت بتنفيذ ذلك وتم بسهولة كذلك موضوع اضافة section جديدة للبرنامج فهو موضوع بسيط اذا توفرالفراغ المناسب للاضافة ولكن الشئ العجيب لماذا المصادر تقوم بتلك العملية المرهقة لاضافة دالة API جديدة ؟؟.

اما التحدي الجديدهوكيف يمكن عملhook لاي دالة عن طريق تغير ال RVA الخاص بها وجعله يوشرعلى الكود الخاص بالبرنامج الذي نكتبه ومن ثم الرجوع الى الكود الحقيقي.

الشكرالجزيل لتواصلك معي

#6
اقتباس
لان المكتبة kernel32 دائما يتم تحميلها في نفس المكان في الذاكرة وقد قمت بتنفيذ ذلك وتم بسهولة

هذا الامر يختلف على مختلف الانظمة.. بالتالي برنامجك لن يعمل على نظام مختلف.

اما مسالة الـ hook راجع هنا http://www.codebreakers-journal.com/viewar...layout=abstract

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

السلام عليكم

لمعرفة مكان وجود مكتبة kernel32 في برنامج ما هناك عدة طرق مثل استعمال SEH وهو Structured Exception Handler او PEB وهو Process Environnement Block وتقنيات اخرى .

مثلا بالنسبة ل PEB يمكن العثور على عنوانه وهو يكون موجود في fs:[30h] ومن ثم يمكن العثور علي عنوان المكتبة بقراءة بعض عناوين الذاكرة ابتداءا من بداية هذا البلوك واظن العناوين 8c و 34 وهنا اعتذر لانني لا اتذكر الارقام جيدا ولانني لم استعمل الطريقة من وقت طويل. على العموم الطريقة مثل ذه وساحاول مراجعة وراقي من جديد وساعطيك العناوين الدقيقة.

لعمل هوك ل API هنا ايضا يمكن استعمال عدة تقنيات كان نغير مباشرة العناوين في المكتبة نفسها ولكن هذه لا نستعملها الا ناذرا او نغير العناوين في فقرة import او بطرق اخرى مثل استعمال WriteProcessMemory او مثيلاتها .

الى اللقاء.

هذا الموضوع مغلق.

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