در این مطلب اول میخوایم به بررسی نحوه کامپایل شدن یه برنامه بپردازیم بعد بریم سراغ مفاهیم api و dll
در مقاله اول من نحوه تبدیل کد از زبان سطح بالا به زبان سطح پایینو توضیح دادم ولی اینجا میخوام فرایند کامپایل رو توضیح بدم ،به صورت خیلی ساده در زبان های کامپایلی مثل c اگر ما یه برنامه بنویسیم ، کد های ما اسمشون میشه source code ، بعد وقتی ما توسط کامپایلر gcc این کد رو کامپایل میکنیم ، این کد اول میشه کد به زبان اسمبلی ، بعد توسط امسبلر میشه یه فایل شئ یا Object file و اگر توی کدامون از کتابخونه ای استفاده کرده باشیم ، اون ها هم داخل کد ما میان و library و oject file جفتی باهم توسط linker متصل میشن و یه فایل اجرایی .exe به ما تحویل میدن
نکته: در مرحله ای که linker میخواد فایل object رو بچسبونه به library ، ممکنه چند تا فایل object و چند تا library داشته باشیم !
قبلش یه نکته ریز بگم :
PE فایل چیه؟ یه راهیه که برنامه به سیستم عامل بگه برای اجرا به چه چیز های نیاز داره ، مثل مقدار حافظه ای که نیاز داره ، مجوز های دسترسی حافظه ، برنامه رو کجای حافظه ذخیره کنه ، چه توابع و کتابخونه هایی نیازه و.. و سیستم عامل سعی میکنه نیاز هارو برآورده کنه ، چرا سعی ؟ چون بعضی اوقت کامل نمیتونه نیاز هارو برآورده کنه
برنامه های امروزی برای اجرا شدن نیاز به کتابخونه های زیادی دارن و برنامه نویس نمیاد همه کد هایی ک نیاز داره رو از صفر بنویسه ( نمیاد چرخ رو دوباره اختراع کنه)
وارد جزئیات نمیشم ولی همین قدر کافیه بدونید ، بعد توضیح dll یکم دیگه بیشتر در این باره صحبت میکینم :
در دنیای برنامه نویسی ما چیزی به نام تابع داریم که کد هایی توی اون ریخته میشه که به وفور ما به اون ها نیاز داریم و با توابع ماکارمون خیلی سریع میشه و نیاز نیست هرچیو از 0 کد بزنیم ، حالا این توابع بعضی اوقات انقدر مفید و پراستفاده هستن که ما در کتابخانه یا library ازشون استفاده میکنیم (در زبان های دیگه ماژول هم بهش گفته میشه) و وقتی ما میگیم کتابخونه مثلا math یعنی یه کتابخونه ای که توابعی داره که همش ریاضیه و اعمال ریاضی مثل مشتق ، لوگاریتم و... رو فقط با گرفتن یه عدد انجام میده و ما دیگه نیاز نیست بشینیم کد اینارو بنویسیم
وقتی ما داریم یه برنامه رو مینویسیم و کامپایلر میخواد اونو به فایل اجرایی تبدیل کنه ، میاد و با استفاده از linker یه سری کتابخونه هارو به اون کد ما لینک میکنه که در تصویر بالا ما دیدم ، ولی
SLL : اگر کتابخونه ها داخل کد برنامه کپی بشن و باهم کامپایل بشن و یه فایل بشن به اون حالت میگن SLL ، یعنی کتاب خونه و توابعش همگی داخل برنامه هستن و باهم کامپایل شدن (مثلا شما یه برنامه نویسی که با استفاده از OpenSSL میاد و رمز میکنه و وقتی برنامه کامپایل میکنه این بدافزارو ، کل توابع OpenSSL داخلش میاد ، یا مثلا وقتی شما یه برنامه به زبان سی مینویسید و میخواید توش از تابع ()strcpy استفاده کنید ، میایید و کتابخونه string.h رو وارد میکنید و linker موقع ساخت فایل اجرایی این کتابخونه رو با کد شما ادغام میکنه و برنامه شما ، شامل دو قسمت کد+کتابخونه میشه فایل اجرایی
DLL : اما اگر کتابخونه ها جدا بارگزاری بشن جریان فرق میکنه، این کتابخونه ها فایل جدایی هستن برای خودشون و بقل برنامه ذخیره میشن و چندین پردازش میتونن به اونا دسترسی داشته باشن ، این کتابخونه ها در حافظه فیزیکی باز میشن برای پردازش ها که لودشون کنن داخل حافظه مجازی خودشون و از اون کتابخونه ها استفاده کنن
DLL ها درواقع PE فایل هستن و توابعی که برنامه میخواد استفاده کنه از داخل این کتابخونه ها ، ذخیره میشه در جایی به اسم IMPORT/EXPORT Table (یه بخشیه از PE فایل) ، وقتی ما برنامه ای رو باز میکنیم ، ویندوز به صورت خودکار تمام کتابخانه هارو در حافظه مجازی برای اون برنامه لود میکنه و میره و تمامی توابع و دستوراتی که اون برنامه از داخل این کتابخانه ها نیاز داره رو سرچ میکنه از داخل کتابخانه ها و اسمشونو بهمراه آدرسشون ذخیره میکنه بقل برنامه درون حافظه مجازی تا هروقت برنامه نیاز داشت به این توابع فقط بخواد آدرسشونو بخونه و بره بهشون دسترسی بگیره
کتابخونه ها میتونن در اول برنامه لود بشن یا حتی در وسط اجرا ، کتابخونه ها توسط دوتا دستور توسط ویندوز لود میشن :
وقتی دستور اول توسط ویندوز به درخواست برنامه اجرا میشه ، کتابخونه در حافظه لود میشه ، و اسم و آدرس برنامه در حافظه قرار میگیره و دستور دوم وقتی اجرا میشه ، برنامه آدرسی که از دستور اول گرفته رو میده بعلاوه نام تابعی که میخواد از درون اون کتابخونه استفاده کنه و بعد فرایند پاس دادن پارامتر طی میشه و...
این مفهوم رو ما در دنیای وب داریم و در دنیای سیستم و کلاینت هم داریم ، پس این دوتارو باهم قاطی نکنید ، برای ساده سازی و درک این موضوع من یک مثال بزنم : شما میرید رستوران ، برای دریافت غذا به گارسون سفارش میدیم و غذارو از اون تحویل میگیرید ، در اینجا گارسون نقش واسط یا api رو داره ، برنامه هم به وسیله api میاد و dll رو لود میکنه
به وسیله این api ها میشه توابع رو از داخل کتابخونه ها صدا زد یا یک برنامه دیگه رو صدا زد و اونرو اجرا کرد( چه به وسیله نام و چه به وسیله عددشون) ، وقتی ویندوز میخواد یه تابعی رو صدا بزنه میاد و توسط دستورات داخلی خودش میره داخل PE فایل های DLL و از Import/Export table نام و ادرس اون توابع رو پیدا میکنه و اون هارو صدا میزنه ، یعنی لودشون میکنه
در اینجا اسم یه سری از این کتابخونه های ویندوز رو میگیم و یه سری از کاربرداشونو ، و شما باید این هارو بشناسید چون بدافزار ها اغلب از این ها استفاده میکنن و بر روی این ها مانور میدهند :
این دو کتابخونه که در بالا ذکر شده ، در تمامی برنامه هایی که برای ویندوز نوشته میشه لود میشن و توی تمامشون هستن و مهم ترین کتابخونه هان و جزو کتاب خونه های اصلی یا core library ویندوز هستن
امیدوارم مورد پسندتون واقع شده باشه اگر سوالی چیزی بود بپرسید :)
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)
کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود