PDA

View Full Version : سوال: نحوه استفاده از تابع LdrLoadDll برای لود کردن dll ها در محیط کرنل(DDK )



feri88
چهارشنبه 04 شهریور 1388, 09:56 صبح
سلام
من دارم توی DDK یه برنامه می نویسم که قراره بعضی از dll های کرنل مود رو توش لود کنم!
یعنی دارم توی محیط NTNative کار می کنم!
ولی متاسفانه چون این محیط داکیومنت نشده است، اصلا منبع و مثالی ندارم و فقط با سعی و خطا دارم توابع رو امتحان می کنم!
من از تابع LdrLoadDll (یکی از توابع NTNative ) برای لود کردن dll ها استفاده می کنم، ولی هر dll ای به جز ntdll.dll رو که فراخونی می کنم، ارور می ده که نمی تونه پیداش کنه!
متغیر اولش مسیر اون dll هستش، ولی نمی دونم که فرمتش چه جوری باید باشه؟ چون این محیط هم کرنله، به همه چیز حساسه و یه ذره که تغییر الکی بدی، اررو میده.
می خواستم ببینم کسی تا حالا با این تابع توی DDK کار کرده و می دونه قالب آدرس DLL توی اولین آرگومان ورودی اون چی باید باشه؟

بی نهایت ممنون می شم اگه کمکم کنید!

sepehrst
شنبه 04 مهر 1388, 00:53 صبح
سلام دوست عزیز


البته مدتی از پستی که ارسال کردی گذشته و احتمالا خودت راه حل رو پیدا کردی با این حال چیزی رو که میدونم مینویسم امیدوارم مفید باشه. تایپ فارسی برام سخته برای همین سعی میکنم کوتاه بنویسم


همونطور که خودت میدونی برنامه نویسی Native با اینکه صرفا توابع ntdll از طریق به برنامه معمولی(win32) فراخانی بشن متفاوته. فقط میخواستم این نکته رو یادآوری کنم که توی یه برنامه Native مثل smss.exe نمیشه dllهای win32 را بارگذاری کرد چون Win32 Subsystem در دسترس نیست. البته اینو برای دوستانی نوشتم که با موضوع آشنایی چندانی ندارن شما که استادی.


در مورد توابع Native (توابع با پیشوند Nt) که توی پارامترهاشون نیاز به مسیر دارن از این فرمت باید استفاده کنید:

\??\DriveLetter:\Path


بعنوان مثال:

\??\c:\windows\system32


که البته توی ++C/C باین شکل نوشته میشه:

\\??\\c:\\windows\\system32


البته در مورد LdrLoadDll از این فرمت استفاده نمیشه.
تعریف تابع LdrLoadDll باین صورت هست:



NTSTATUS LdrLoadDll(PWCHAR DllSearchPath, PULONG Flags, PUNICODE_STRING ModuleFileName, PHANDLE ModuleHandle)


پارامترهای اول و دوم اختیاری هستن و میتونه صفر باشه. برای پارامتر دوم (Flags) بهتره مستقیما صفر وارد نکنی بجاش مقدار متغیر ULONG رو برابر صفر قرار بده و آدرس متغیر رو به تابع بده.
شما در پارامتر سوم میتونی مسیر کامل dll را به تابع بدی با فرمت *UNICODE_STRING که میتونی از تابع RtlInitUnicodeString استفاده کنی.

اگر نخواستی که مسیر کامل dll را بدی باید از پارامتر اول استفاده کنی. پارامتر اول شامل مجموعه ایی از مسیرهاست که LdrLoadDll توی اون مسیرها به ترتیبی که وارد شدن دنبال dll میگرده.
مثلا

L"c:\\;c:\\windows\\system32;c:\\windows"

نکته: پارامتر اول، رشته unicode از نوع wchar هست نه از نوع UNIUCODE_STRING


من این مطبو من دوباره ادیت کردم چون هم ناقص بود هم یه اشتباهاتی داشت,از دوستانی که احیانا قبل از ادیت این پاسخ رو خوندن عذرخواهی میکنم.