محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

ِDLL چیست؟ API چیست؟ بررسی مفاهیم DLL و API

در این مطلب اول میخوایم به بررسی نحوه کامپایل شدن یه برنامه بپردازیم بعد بریم سراغ مفاهیم api و dll

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

فرایند کامپایل یک برنامه :

در مقاله اول من نحوه تبدیل کد از زبان سطح بالا به زبان سطح پایینو توضیح دادم ولی اینجا میخوام فرایند کامپایل رو توضیح بدم ،به صورت خیلی ساده در زبان های کامپایلی مثل c اگر ما یه برنامه بنویسیم ، کد های ما اسمشون میشه source code ، بعد وقتی ما توسط کامپایلر gcc این کد رو کامپایل میکنیم ، این کد اول میشه کد به زبان اسمبلی ، بعد توسط امسبلر میشه یه فایل شئ یا Object file و اگر توی کدامون از کتابخونه ای استفاده کرده باشیم ، اون ها هم داخل کد ما میان و library و oject file جفتی باهم توسط linker متصل میشن و یه فایل اجرایی .exe به ما تحویل میدن

ِDLL چیست؟ API چیست؟ بررسی مفاهیم DLL و API

نکته: در مرحله ای که linker میخواد فایل object رو بچسبونه به library ، ممکنه چند تا فایل object و چند تا library داشته باشیم !

قبلش یه نکته ریز بگم :

PE فایل چیه؟ یه راهیه که برنامه به سیستم عامل بگه برای اجرا به چه چیز های نیاز داره ، مثل مقدار حافظه ای که نیاز داره ، مجوز های دسترسی حافظه ، برنامه رو کجای حافظه ذخیره کنه ، چه توابع و کتابخونه هایی نیازه و.. و سیستم عامل سعی میکنه نیاز هارو برآورده کنه ، چرا سعی ؟ چون بعضی اوقت کامل نمیتونه نیاز هارو برآورده کنه 

برنامه های امروزی برای اجرا شدن نیاز به کتابخونه های زیادی دارن و برنامه نویس نمیاد همه کد هایی ک نیاز داره رو از صفر بنویسه ( نمیاد چرخ رو دوباره اختراع کنه)

وارد جزئیات نمیشم ولی همین قدر کافیه بدونید  ، بعد توضیح dll یکم دیگه بیشتر در این باره صحبت میکینم :

تفات بین Static Link Library و Dynamic Link Library چیست ؟

در دنیای برنامه نویسی ما چیزی به نام تابع داریم که کد هایی توی اون ریخته میشه که به وفور ما به اون ها نیاز داریم و با توابع ماکارمون خیلی سریع میشه و نیاز نیست هرچیو از 0 کد بزنیم ، حالا این توابع بعضی اوقات انقدر مفید و پراستفاده هستن که ما در کتابخانه یا library ازشون استفاده میکنیم (در زبان های دیگه ماژول هم بهش گفته میشه) و وقتی ما میگیم کتابخونه مثلا math یعنی یه کتابخونه ای که توابعی داره که همش ریاضیه و اعمال ریاضی مثل مشتق ، لوگاریتم و... رو فقط با گرفتن یه عدد انجام میده و ما دیگه نیاز نیست بشینیم کد اینارو بنویسیم

وقتی ما داریم یه برنامه رو مینویسیم و کامپایلر میخواد اونو به فایل اجرایی تبدیل کنه ، میاد و با استفاده از linker یه سری کتابخونه هارو به اون کد ما لینک میکنه که در تصویر بالا ما دیدم ، ولی

SLL : اگر کتابخونه ها داخل کد برنامه کپی بشن و باهم کامپایل بشن و یه فایل بشن به اون حالت میگن SLL ، یعنی کتاب خونه و توابعش همگی داخل برنامه هستن و باهم کامپایل شدن (مثلا شما یه برنامه نویسی که با استفاده از OpenSSL میاد و رمز میکنه و وقتی برنامه کامپایل میکنه این بدافزارو ، کل توابع OpenSSL داخلش میاد ، یا مثلا وقتی شما یه برنامه به زبان سی مینویسید و میخواید توش از تابع ()strcpy استفاده کنید ، میایید و کتابخونه string.h رو وارد میکنید و linker موقع ساخت فایل اجرایی این کتابخونه رو با کد شما ادغام میکنه و برنامه شما ، شامل دو قسمت کد+کتابخونه میشه فایل اجرایی

ِDLL چیست؟ API چیست؟ بررسی مفاهیم DLL و API


DLL : اما اگر کتابخونه ها جدا بارگزاری بشن جریان فرق میکنه، این کتابخونه ها فایل جدایی هستن برای خودشون و بقل برنامه ذخیره میشن و چندین پردازش میتونن به اونا دسترسی داشته باشن ، این کتابخونه ها در حافظه فیزیکی باز میشن برای پردازش ها که لودشون کنن داخل حافظه مجازی خودشون و از اون کتابخونه ها استفاده کنن

DLL ها درواقع PE فایل هستن و توابعی که برنامه میخواد استفاده کنه از داخل این کتابخونه ها ، ذخیره میشه در جایی به اسم IMPORT/EXPORT Table (یه بخشیه از PE فایل) ، وقتی ما برنامه ای رو باز میکنیم ، ویندوز به صورت خودکار تمام کتابخانه هارو در حافظه مجازی برای اون برنامه لود میکنه و میره و تمامی توابع و دستوراتی که اون برنامه از داخل این کتابخانه ها نیاز داره رو سرچ میکنه از داخل کتابخانه ها و اسمشونو بهمراه آدرسشون ذخیره میکنه بقل برنامه درون حافظه مجازی تا هروقت برنامه نیاز داشت به این توابع فقط بخواد آدرسشونو بخونه و بره بهشون دسترسی بگیره

کتابخونه ها میتونن در اول برنامه لود بشن یا حتی در وسط اجرا ، کتابخونه ها توسط دوتا دستور توسط ویندوز لود میشن :

  • LoadLibraryA(<DLL name>)
  • GetProcAddress(<DLL Address>,<API name>)

وقتی دستور اول توسط ویندوز به درخواست برنامه اجرا میشه ، کتابخونه در حافظه لود میشه ، و اسم و آدرس برنامه در حافظه قرار میگیره و دستور دوم وقتی اجرا میشه ، برنامه آدرسی که از دستور اول گرفته رو میده بعلاوه نام تابعی که میخواد از درون اون کتابخونه استفاده کنه و بعد فرایند پاس دادن پارامتر طی میشه و...

ِDLL چیست؟ API چیست؟ بررسی مفاهیم DLL و API

API یا Application Programming Interface چیست ؟

این مفهوم رو ما در دنیای وب داریم و در دنیای سیستم و کلاینت هم داریم ، پس این دوتارو باهم قاطی نکنید ، برای ساده سازی و درک این موضوع من یک مثال بزنم : شما میرید رستوران ، برای دریافت غذا به گارسون سفارش میدیم و غذارو از اون تحویل میگیرید ، در اینجا گارسون نقش واسط یا api رو داره ، برنامه هم به وسیله api میاد و dll رو لود میکنه

به وسیله این api ها میشه توابع رو از داخل کتابخونه ها صدا زد یا یک برنامه دیگه رو صدا زد و اونرو اجرا کرد( چه به وسیله نام و چه به وسیله عددشون) ، وقتی ویندوز میخواد یه تابعی رو صدا بزنه میاد و توسط دستورات داخلی خودش میره داخل PE فایل های DLL و از Import/Export table نام و ادرس اون توابع رو پیدا میکنه و اون هارو صدا میزنه ، یعنی لودشون میکنه

ِDLL چیست؟ API چیست؟ بررسی مفاهیم DLL و API

DLL های متداول ویندوز :

در اینجا اسم یه سری از این کتابخونه های ویندوز رو میگیم و یه سری از کاربرداشونو ، و شما باید این هارو بشناسید چون بدافزار ها اغلب از این ها استفاده میکنن و بر روی این ها مانور میدهند :

  • ntdll.dll : این کتابخونه برای ساخت و اجرای برنامه در ویندوز بسیار حیاتیه و تقریبا تمامی دستورات ویندوزو تو خودش داره و این کتاب خونه چون خیلی پیچیده و بزرگه نمیشه مستقیما بهش دسترسی داشت (توی کتاب Secrets of reverse engineering از بدافزاری صحبت میکنه که نویسندش با کلی تحقیق از توابع این کتابخونه سردرآورده و بدافزارشو طوری گسترش داده که با توابعی از این کتابخونه کار بکنه که تجزیه و تحلیلش تقریبا غیر ممکن باشه)
  • kernel32.dll : مثل کتابخونه بالاییه و توابع فراخوانی و وارد کردن رو تو خودش داره ، توابع خوندن و نوشتن فایل ، و دستور LoadLibrary و GetProcAddress توی همین کتابخونه هستن

این دو کتابخونه که در بالا ذکر شده ، در تمامی برنامه هایی که برای ویندوز نوشته میشه لود میشن و توی تمامشون هستن و مهم ترین کتابخونه هان و جزو کتاب خونه های اصلی یا core library ویندوز هستن

  • adapi32.dll : این کتابخونه برای کار با ریجستر ها و رمزنگاری هست ، و از توابعش میشه استفاده کرد برای دستکاری در ریجستری و رمزنگاری
  • shellapi.dll و shell32.dll : برای استفاده از دستورات shell هست (اگر نمیدونید چیه میتونید همون خط فرمان درنظر بگیرید)
  • ws2_32.dll : مروبط به سوکت اینترنت و ارتباط با شبکه هست ، برای ارسال و دریافت اطلاعات هست ، مثلا وقتی یه کیلاگر روی یه پورت خاص شروع میکنه به گوش دادن یا وصل میشه به یه آیپی خاصی ، از این کتابخونه استفاده میکنه
  • wininet.dll : مربوط به ارتباطات HTTP و FTP هست ، و مثلا وقتی میخوایم از پروکسی استفاده کنیم از این کتابخونه استفاده میکنیم
  • urlmon.dll : یه جور کتابخونه اضافه و جانبیه برای wininet و برای کار با آدرس های URL بلند هست و کار با gzip و فشرده سازی در لایه HTTP هست و دانلود فایل از آدرسی و...
  • کتابخونه های دیگه ایم هستن مثل user32.dll و GDI.dll ولی خب مربوط به گرافیک و UI هستن و از بحث امنیت خارجن

امیدوارم مورد پسندتون واقع شده باشه اگر سوالی چیزی بود بپرسید :)



محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

10 مهر 1400 این مطلب را ارسال کرده

نظرات