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

كيف يمكن الوصول الى ملفات DLL

مغلق
بدأه hacker_eg في 18 يناير 2005 · 2 رد · 643 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أريد السؤال عن كيفية أستخدام ملفات dll عن طريق الاسمبلى فى عمل مهمة ما

أقصد اننى أريد عمل برنامج يعرض صور من ال webcam عن طريق الدخول على ملفات التشغيل (Drviers) الخاصه بال webcam وأستخدامها فى البرنامج

شكرا

#2

السلام عليكم,

للتعامل مع ملفات DLL الأمر ليس صعبا كما قد نتصوره . فنفترض أن ملف DLL التالي Sample.dll يصدر لنا دالة

 DWORD Func(Param1,Param2)

نفترض أن كل البارامترات هي من نوع DWORD فلكي نستعمل هذه الدالة التي هي في ملف DLL ستكون الطريقة كما يلي .

نحمل ملف DLL .

نبحث عن عنوان الدالة التي نريدها.

ندفع البارامترات على الستاك

نستدعي عنوان الدالة.

نفرأ البارامتر المرجوع في الرجستر EAX .

بعد الإنتهاء من DLL نفرغها من الذاكرة.

وبالكود سيكون على الشكل التالي :

.data

TheDll DB "Path\Sample.dll",0

Path هو المسار الموجود فيه DLL وقد نستغني عن هذا إذا كانت موجودة في نفس مسار البرنامج أو في مسار السيستم

TheFunc DB "Func",0

handle DW ?

.code

invoke LoadLibrary,addr TheDll

mov eax,handle

invoke GetProcAddress,handle,addr TheFunc

هنا سيكون عندنا عنوان الدالة في الرجستر EAX

Push Param2

Push Param1

call eax هنا يتم استدعاء الدالة Func

بعد هذا سيكون عندنا ما ترجعه الدالة في الرجستر EAX .

بعد ما ننتهي من DLL نفرغها من الذاكرة :

invoke FreeLibrary,handle

هذا بالنسبة لملفات DLL أما فيما يخص الدرايفرات فهناك طريقة أخرى ولهذا الغرض نستعمل الدالة

BOOL DeviceIoControl(
  HANDLE hDevice,              // handle to device of interest
  DWORD dwIoControlCode,       // control code of operation to perform
  LPVOID lpInBuffer,           // pointer to buffer to supply input data
  DWORD nInBufferSize,         // size, in bytes, of input buffer
  LPVOID lpOutBuffer,          // pointer to buffer to receive output data
  DWORD nOutBufferSize,        // size, in bytes, of output buffer
  LPDWORD lpBytesReturned,     // pointer to variable to receive byte count
  LPOVERLAPPED lpOverlapped    // pointer to structure for asynchronous operation
);

هذا بعد تحميل الدرايفر المقصود كما نحمل ملف عادي بواسطة CreateFile وهنا يجب الكثير من الحذر لأن أي خطء بسيط قد نوقف به تشغيل النظام مما سيتوجب إعادة تشغيل الكمبيوتر.ولهذا يجب معرفة ما نريد استدعاؤه داخل الدرايفر كما يجب معرفة ما يطلبه منا من معطيات وكذلك ما وكيف سيعطينا معطياته.

إلى اللقاء.

#3

شكرا على الرد وسوف أجرب هذه الطرق

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

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