OS Internals

@oxaa55


مقاله و فیلم آموزش مدیریت و برنامه‌نویسی سیستم‌های عامل، شبکه و امنیت اطلاعات.

مقالات من در ویرگول:
https://virgool.io/@akazemi

ویدئوهای کانال در آپارات:
https://www.aparat.com/oxaa55

ارتباط با مدیر کانال از طریق:
@akazemi67

OS Internals

11 Oct, 18:44


مروری بر روش‌های IPC در لینوکس و تست SharedMemory

بحث IPC یا Inter-Process Communication به روش‌هایی گفته می‌شود که از طریق آن دو پروسه می‌توانند با یکدیگر اطلاعاتی رد و بدل کرده یا یک رخ‌داد را به اطلاع هم برسانند. برای انجام اینکار متدهای متنوعی در لینوکس وجود دارد که قبلا نیز در مورد Signal پستی منتشر کرده بودم و جزئیات آنرا نمایش داده بودم.

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

برای استفاده از حافظه‌ی مشترک در لینوکس، با استفاده از shm_open درخواست ایجاد فضای مشترک را داده و پس از دریافت یک File Descriptor به کمک mmap حافظه‌ی مورد نیاز را از کرنل لینوکس دریافت می‌کنیم.

نکته‌ای که باید به آن توجه کنیم این است که نوشتن چند پروسه به صورت همزمان درفضای مشترک، می‌تواند ناسازگاری داده ایجاد کند که با استفاده از Semaphore یا روش‌های دیگر Synchronization بر اساس نیاز، باید بین پروسه‌ها هماهنگی ایجاد نمود.

در این ویدئو، پس از مرور کوتاهی بر روش‌های مختلف IPC به بررسی عمیق‌تر روش Shared Memory پرداخته و یک کد ساده برای تست آن می‌زنیم.


لینک ویدئو در یوتیوب:
https://youtu.be/exhJs3RDnN8
لینک ویدئو در آپارات:
https://aparat.com/v/gskav3t

#ShortLinuxInternals #linux #internals #programming #processes #ipc #sharedmemory

OS Internals

10 Oct, 15:00


📚 تخفیف ۷۰درصدی دوره‌ی Windows Internals and Memory Analysis برای ۲۰ نفر

🎯 چند نفری بهم پیام داده بودند و سراغ تخفیف دوره‌ی Internal رو گرفته بودند. با صحبتی که با تیم خوب مکتب‌خونه داشتم قرار شد که یک تخفیف ۷۰درصدی برای ۲۰ نفر داشته باشیم.

می‌تونید دوره رو از طریق لینک زیر مشاهده و ثبت‌نام کنید:
yun.ir/rx6jy2

📴 برای دریافت ۷۰ درصد تخفیف، در زمان خرید کد z03y2Lzs را وارد کنید.


#WindowsInternals #Course #Training #Maktabkhooneh

OS Internals

06 Oct, 09:13


#Course #DWORD

🖥ویدیو معرفی دوره برنامه نویسی تهاجمی مختص به تیم های قرمز

📊بررسی کامل دوره، سرفصل ها و موضوعاتی که در هر فصل بیان خواهند شد.

آخرین بروزرسانی سرفصل ها : 18 September 2024

🖥شهریه دوره ۱۵,۰۰۰,۰۰۰ تومان است که با ۲۰٪ تخفیف به ۱۰ نفر اول ارائه می‌شود.
📑همچنین، امکان پرداخت به صورت اقساط نیز فراهم است.

🖥نحوه شرکت در دوره :
به دلیل ظرفیت محدود کلاس، اولویت ثبت‌نام با دانشجویانی است که آزمون تعیین سطح را گذرانده باشند. چنانچه پیش‌نیازهای لازم برای شرکت در دوره را ندارید، همچنان می‌توانید در دوره شرکت کنید، اما ابتدا باید این پیش‌نیازها را بگذرانید. جهت دریافت اطلاعات بیشتر به آیدی @YMahmoudnia پیغام بدین.

🦅 کانال بایت امن | گروه بایت امن
_

OS Internals

13 Sep, 15:49


سیگنال و وضعیت پروسه‌ها در لینوکس

در لینوکس برای ارسال یک رویداد یا اطلاع دادن یک رخداد به پروسه‌ها می‌توان از سیگنال استفاده نمود. شیوه‌ی کار به این صورت است که پروسه در صورت دریافت سیگنال، اجرای کد اصلی خود را متوقف کرده و به سراغ پردازش Signal می‌رود. از همین روی در لینوکس به سیگنال Asynchronous Event و یا Soft Interrupt نیز گفته می‌شود.

تولید سیگنال و ارسال آن به یک پروسه می‌تواند از دل کرنل رخ داده، توسط یک پروسه‌ی دیگر بوده، از طریق Terminal و به کمک دستور kill بوده و یا حتی با فشردن کلید‌هایی مثل CTRL+Z یا CTRL+C توسط کاربر انجام شود.

پروسه با دریافت Signal در صورت وجود داشتن یک Handler درون کد برنامه‌ی خود، به سراغ اجرای آن رفته و در غیر این صورت رفتار پیش‌فرضی که سیستم‌عامل برای هر سیگنال تعریف کرده است را اجرا می‌کند که در اکثر مواقع باعث Terminate شدن اجرای پروسه می‌شود. همچنین ذکر این نکته ضروری است که امکان تعریف کردن Handler برای دو سیگنال‌ SIGKILL و SIGSTOP وجود نداشته و برای این دو همیشه رفتار تعریف شده توسط سیستم‌عامل اجرا می‌شود.

برخی از سیگنال‌ها باعث تغییر در وضعیت اجرای پروسه می‌شوند. به عنوان مثال زدن CTRL+Z در اکثر برنامه‌ها باعث می‌شود که برنامه در وضعیت Stopped قرار گرفته و به Background رود و یا زدن CTRL+C به پروسه یک Interrupt داده که ممکن است اجرای آنرا متوقف کند.

در پایان این نکته را اضافه کنم که ارسال SIGKILL با شماره ۹ برای برخی از برنامه‌ها ممکن است باعث از بین رفتن داده شود. به عنوان مثال فرض کنید که یک برنامه فایلی را باز کرده و در حال نوشتن در آن است. اگر منتظر اتمام کار برنامه نمانده و وسط کار آن SIGKILL‌ ارسال کنیم بلافاصله برنامه بسته شده و نوشتن در فایل تمام نشده و بخشی از داده از بین می‌رود ولی ارسال SIGTERM با شماره ۱۵ به برنامه در صورت Handle شدن آن توسط برنامه، این فرصت را به برنامه می‌دهد که نوشتن در فایل را به اتمام رسانده و سپس بسته شود.

در این ویدئو شیوه‌ی کار سیگنال، تاثیر آن بر وضعیت پروسه و چرخه‌ی اجرای پروسه‌ها در لینوکس شرح داده شده و شیوه‌ی تعریف Handler‌ برای پردازش سیگنال در کد C‌ نمایش داده می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/6FbpnYDeWw0
لینک ویدئو در آپارات:
https://aparat.com/v/nruhez3

#ShortLinuxInternals #linux #internals #kernel #programming #signals #processes

OS Internals

16 Aug, 07:17


محدود کردن اجرای پروسه‌ها به کمک Sandbox در لینوکس

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

روش‌ها و ابزارهای مختلفی برای انجام Sandboxing بر روی لینوکس وجود دارد و برخی از این روش‌ها مستقیم توسط کرنل نیز پشتیبانی می‌شوند. به عنوان مثال در لینوکس به کمک namespaces امکان جداسازی سیستم‌فایل، شبکه و پروسه‌های سیستم از یکدیگر فراهم بوده و به کمک cgroups می‌توانیم محدودیت دسترسی به RAM/CPU تعریف کنیم، که ایجاد Containerها و استفاده از docker به لطف این موارد در لینوکس امکان‌پذیر است.

یک روش جالب دیگر برای ایجاد محدودیت اجرا در لینوکس seccomp است که خود یک System Call بوده و قابلیت محدود کردن System Callهایی که یک پروسه امکان اجرای آن‌ها را دارد فراهم می‌کند. این System Call به شیوه‌های مختلفی مثل تعریف محدودیت درون برنامه، اعمال محدودیت به کمک systemd و استفاده به صورت library و با ست کردن LD_PRELOAD قابل استفاده است.

در این ویدئو کاربرد Sandboxing توضیح داده شده و پس از معرفی چند روش انجام آن، جزئیات و نحوه‌ی استفاده و کاربرد seccomp در لینوکس نمایش داده می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/g8fuUag7oA8
لینک ویدئو در آپارات:
https://aparat.com/v/wowkca1

#ShortLinuxInternals #linux #internals #kernel #programming #seccomp #sandbox #namespaces #syscalls #processes #systemd

OS Internals

12 Jul, 17:51


سرقت توکن پروسه‌ها در ویندوز به کمک WinDbg

توکن یا به صورت کامل‌تر Access Token در ویندوز، یک شی است که شرایط امنیتی که یک پروسه یا نخ تحت آن می‌توانند کار کنند را مشخص می‌کند. توکن با احراز هویت موفق یک کاربر ایجاد شده و هر پروسه‌ای که توسط کاربر ایجاد شود، یک نسخه از آنرا خواهد داشت.

ویندوز از توکن در زمانیکه یک نخ تلاشی برای دسترسی به یک شی می‌کند استفاده می‌کند که کاربر را تشخیص داده و بررسی کند که آیا کاربر مجوز دسترسی به شی مورد نظر را دارد یا خیر. به عنوان مثال فرض کنید که با notepad قصد باز کردن یک فایل را داشته باشید. در این مثال پروسه‌ی notepad‌ توسط کاربر شما ایجاد شده و در نتیجه توکن آنرا خواهد داشت. شی مورد دسترسی نیز فایلی است که برای آن دسترسی خاصی تعریف شده و باید بررسی شود که آیا توکن مورد نظر مجوز دسترسی به فایل را دارد یا باید جلوی این دسترسی توسط ویندوز گرفته شود.

برخی از اطلاعاتی که توسط توکن مشخص می‌شوند عبارتند از: شناسه یا SID‌ کاربر. شناسه‌ی گروه‌هایی که کاربر عضوی از آن‌هاست. شناسه‌ی نشست جاری. لیستی از مجوزهایی که کاربر یا گروه‌های آن دارند.

یکی از کارهایی که با توکن‌ها قابل انجام بوده و در سرویس‌ها کاربرد زیادی دارد impersonation است. در این مدل، یک نخ با توکن متفاوتی از توکن اصلی خود اجرا شده و در نتیجه مجوزهای متفاوتی خواهد داشت. به عنوان مثال فرض کنید یک File Server دارید که فایل‌های آن محدودیت‌های دسترسی متفاوتی دارند. در این مثال، سرور با انجام impersonation درخواست هر کلاینت را با توکن همان کلاینت پاسخ داده و در نتیجه هر کاربر تنها به فایل‌های خود دسترسی خواهد داشت.

یکی از کارهایی که بدافزارها از آن بهره می‌برند همین بحث impersonation و دسترسی به منابع مختلف، مثل dump اطلاعات کاربران، است. در این حالت بدافزار توکن یک پروسه با دسترسی بالا را دزدیده و از آن برای مقاصد خود استفاده می‌کند.

در این ویدئو به کمک WinDbg مفهوم توکن و شیوه‌ی دزدیدن و قرار دادن آن بر روی پروسه‌ی دلخواهی شرح داده می‌شود که هم با موضوع توکن آشنا شده و هم به صورت عملی ببینیم که بدافزارها چطور می‌توانند از impersonation سواستفاده کنند.


لینک ویدئو در یوتیوب:
https://youtu.be/NTPVeauBDe4
لینک ویدئو در آپارات:
https://www.aparat.com/v/cvyprh5

#ShortWinInternals #windows #internals #token #WinDbg #impersonation #kernel

OS Internals

05 Jul, 14:43


استفاده از ftrace‌ برای بررسی توابع فراخوانی شده در کرنل لینوکس

به کمک دستور strace می‌توان system callهایی که در اجرای برنامه‌ها فراخوانی می‌شوند را بررسی نمود ولی امکان اطلاع پیدا کردن از توابعی که درون کرنل لینوکی فراخوانی می‌شوند وجود ندارد و به عنوان مثال نمی‌توان متوجه شد که در خواندن یک فایل، از چه توابعی در چه ماژولی و یا چه سیستم‌فایلی استفاده می‌شود.

لینوکس به کمک قرار دادن یکسری point در بخش‌هایی از کرنل، مکانیزمی به اسم ftrace فراهم می‌کند که مشابه procfs پس از mount شدن، با فراهم کردن یکسری فایل، امکان بررسی توابعی کرنلی که در رویدادهای مختلف فراخوانی می‌شوند را در اختیار قرار می‌دهد.

از ftrace در حالت‌های مختلفی می‌توان استفاده نمود. مثلا می‌توان فقط لیست توابعی که فراخوانی می‌شوند را مشاهده کرده و یا به صورت نمایش گرافی، کلیه‌ی توابعی که با شروع از یک تابع یکی پس از دیگری فراخوانی می‌شوند را دیده و به این صورت مثلا متوجه شد که پس از تابع vfs_read که یک تابع برای پردازش درخواست خواندن از فایل در VFS لینوکس است، به سراغ تابع خواندن از ext4 می‌رسیم یا xfs.

یکی از دیگر کاربردهای ftrace که هم در توسعه‌ی ابزارهای امنیتی کاربرد دارد و هم بدافزارها می‌توانند از آن استفاده کنند پیاده‌سازی hooking برای توابع کرنل لینوکس است. در این روش ftrace در ابتدای فراخوانی تابع کرنلی، به سراغ اجرای تابعی که شما مشخص کرده‌اید رفته و پس از اتمام کار تابع شما، می‌تواند به چرخه‌ی اصلی فراخوانی تابع کرنل بازگشته و آنرا تا انتها اجرا کند.

در این ویدئو کاربرد ftrace شرح داده شده و شیوه‌های مختلف استفاده از آن نمایش داده می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/AhxxT7lal5c
لینک ویدئو در آپارات:
https://aparat.com/v/acmv35h

#ShortLinuxInternals #linux #internals #kernel #tracing #ftrace

OS Internals

14 Jun, 16:01


جزئیات پروسه و نخ در لینوکس

به صورت خلاصه از دید ویندوز پروسه فقط یک container می‌باشد که اجرا نشده و فضایی برای اجرای Threadها فراهم می‌کند و در سطح کرنل نیز دو ساختار EPROCESS, ETHREAD برای این دو تعریف شده‌اند. اما در لینوکس ماجرا متفاوت است و Process, Thread هر دو قابلیت اجرا داشته و در سطح کرنل نیز یک ساختار task_struct برای آن‌ها تعریف شده است. در دنیای شی‌گرایی مثل این است که در لینوکس یک کلاس برای این دو وجود دارد و فقط در زمان ایجاد شی خصوصیات متفاوتی برای آن‌ها تنظیم می‌شود.

اگر به سراغ برنامه‌نویسی سیستمی در لینوکس برویم، تابع fork برای ایجاد پروسه استفاده شده و از تابع pthread_create نیز برای ایجاد نخ در لینوکس استفاده می‌شود. در سطحی کمی پایین‌تر، هر دوی این توابع syscallای به نام clone را فراخوانی می‌کنند و با ست‌کردن فلگ‌هایی مشخص می‌کنند که قصد ایجاد پروسه یا نخ را دارند. در زمان بررسی برنامه‌ها، در خروجی دستور ps برای یک برنامه‌ی چند پروسه‌ای pidهای مختلفی خواهیم دید ولی در یک برنامه‌ی چند نخی pidها یکسان بوده ولی عددهای متفاوتی در فیلد Light-Weight Process-LWP می‌بینیم.

نکته‌ی جالب دیگر این است که در سطح کرنل پروسه‌ها یک لیست پیوندی تشکیل می‌دهند. هم شیوه‌ی ایجاد لیست پیوندی Generic در سطح کرنل و در زبان C موضوع جالبی است و هم اینکه به کمک فیلدی به اسم tasks می‌توانیم یک لیست پیوندی از پروسه‌ها تشکیل دهیم که به پروسه‌های قبلی و بعدی اشاره می‌کند.

این موارد و موارد دیگری از جزئیات پروسه‌ها و نخ‌های لینوکس مواردی هستند که در این ویدئو به آن می‌پردازیم.

لینک ویدئو در یوتیوب:
https://youtu.be/0fxYtyFn8Jc
لینک ویدئو در آپارات:
https://aparat.com/v/cnytp55

#ShortLinuxInternals #linux #internals #syscalls #kernel #process #thread #gdb #qemu #clone #LWP

OS Internals

10 May, 18:53


مقدار صفر برای argc در برنامه‌های لینوکسی. چرا و چگونه؟

همه چیز از بررسی CVE-2021-4034 و کامپایل مجدد PolKit بر روی Ubuntu 22.04 شروع شد! تصمیم داشتم یک نسخه‌ی آسیب‌پذیر PolKit رو با فعال کردن Debug Symbols کامپایل کرده و مراحل کامل این CVE رو در GDB بررسی کنم. به صورت خلاصه بگم که این آسیب‌پذیری در باینری pkexec وجود دارد و به کمک آن می‌توان LPE انجام داد. یکی از شرایط استفاده از این آسیب‌پذیری این است که در زمان اجرای pkexec شرط argc==0 برقرار باشد که از طریق آن متغیرهای محلی خوانده شده و بتوان یک library مخرب را بارگذاری نمود.

از آنجایی که pkexec علاوه بر لینوکس بر روی Solaris, BSD هم قابل استفاده است، در مقاله‌ی اصلی این CVE که توسط Qualys Security منتشر شده است متن زیر مشاهده می‌شود که از الزام argc==0 برای امکان‌پذیر بودن این LPE خبر می‌دهد.
OpenBSD is not exploitable, because its kernel refuses to execve() a program if argc is 0

پس فرض من این بود که در نسخه‌های اخیر لینوکس هم با کامپایل PolKit باید بتوان این آسیب‌پذیری را تست کرد. این بود که بر روی Ubuntu 22.04 یک نسخه‌ی آسیب‌پذیر را کامپایل کرده و یک کد ساده به صورت زیر نوشتم که pkexec را اجرا کرده و argc==0 برقرار باشد.

void main() {
char *args[] = { NULL };
char *envs[] = {"SHELL=/bin/bash", 0};
execve("pkexec", args, envs);
}

با اجرای برنامه و زدن strace مشاهده شد که فراخوانی در سطح user طبق انتظار انجام شد.
execve("pkexec", [], 0x7ffe3883b200 /* 1 var */)

ولی دو تا مورد عجیب رخ داد. اول اینکه برنامه در gdb بر خلاف انتظار با argc==1‌ اجرا شده و argv[0] که اسم برنامه در آن قرار می‌گیرد و طبق مدل فراخوانی باید NULL می‌بود برابر “” شده بود. مورد دومی که عجیب بود پیام زیر در dmesg بود.
process 'exploit' launched 'pkexec' with NULL argv: empty string added

با رسیدن به این مرحله به سراغ Ubuntu 20.04 رفتم و همین کد را بر روی آن اجرا کردم که همه چیز طبق انتظار رخ داده و در gdb با رسیدن به main برنامه‌ی pkexec مقدار argc==0 برقرار بوده و امکان تست CVE وجود داشت. اینجا واضح بود که در کرنل‌های جدید لینوکس در فراخوانی سیستمی execve تغییراتی اعمال شده است که جلوی اجرای برنامه‌ها با argc==0 گرفته شود. اینجا دیگه لازم بود کد کرنل چک شود!

با رفتن به github‌ و بررسی فایل fs/exec.c کرنل لینوکس مشاهده شد که در تابع اجرای فراخوانی سیستمی execve کد زیر در March 2022 اضافه شده که جلوی اجرای برنامه‌ها با argc==0 را می‌گیرد.

/*
* When argv is empty, add an empty string ("") as argv[0] to
* ensure confused userspace programs that start processing
* from argv[1] won't end up walking envp. See also
* bprm_stack_limits().
*/
if (bprm->argc == 0) {
retval = copy_string_kernel("", bprm);
if (retval < 0)
goto out_free;
bprm->argc = 1;
}

پس از این به بعد علاوه بر OpenBSD بر روی لینوکس نیز امکان اجرای آسیب‌پذیری‌های این مدلی وجود نخواهد داشت! :-D
پ.ن: در آینده‌ یک ویدئو از شیوه‌ی کامل اجرای این CVE منتشر می‌کنم.

#linux #kernel #CVE #PolKit #pkexec #execve

OS Internals

02 May, 14:35


نحوه‌ی استفاده‌ی لینوکس از vDSO برای سرعت بخشیدن به فراخوانی‌های سیستمی

اگر ساختار حافظه‌ی پروسه‌های لینوکسی را مشاهده کنید (مثلا از طریق cat /proc/pid/maps) در کنار بخش‌های مربوط به کد، داده، پشته، هیپ و کتابخانه‌های استفاده شده در برنامه، دو بخش نیز مشاهده می‌شود که عناوین vsyscall/vdso دارند که آدرس‌های یکی مربوط به Kernel Mode بوده و دیگری آدرس‌های User Modeای دارد.

این دو، مکانیزم‌هایی هستند که برای سرعت بخشیدن به اجرای syscallهایی که نرخ فراخوانی بالایی دارند استفاده می‌شوند. یکی از این syscallها gettimeofday است که به صورت مستقیم و غیر مستقیم توسط تعداد زیادی از توابع کتابخانه‌ای فراخوانی می‌شود و به دلیل سنگین بودن فراخوانی syscall و رفتن به Kernel و پردازش درخواست و بازگشتن به User Mode در فضای آدرس‌دهی پروسه قرار می‌گیرند که کار فراخوانی سریع‌تر شده و نیاز به طی مسیر پیش‌فرض syscallها نباشد.

در لینوکس کل فضای در اختیار پروسه در دسترس بوده و امکان dump آن به کمک dd وجود دارد. در این ویدئو مروری بر روی کاربرد vDSO انجام گرفته، علت استفاده از آن به جای vsyscall شرح داده شده و به dump و بررسی vDSO‌ و مشاهده‌ی توابع تعریف شده در آن می‌پردازیم.

ℹ️پ.ن: اگر دوست دارید که جزئیات system callها را در لینوکس بدانید، لینک انتهای پست را در کانالم چک کنید. من قبلا در یک ارائه جزئیات system callهای لینوکس از شیوه‌ی تعریف آن‌ها، نحوه‌ی اضافه کردن یک syscall به کرنل لینوکس و جزئیاتی که در فراخوانی system callهای لینوکس وجود دارد را به صورت کامل شرح داده‌ام که می‌توانید ویدئوی آنرا مشاهده کنید.

لینک ویدئوی vDSO در یوتیوب:
https://youtu.be/UK6annv-t-s
لینک ویدئوی vDSO در آپارات:
https://aparat.com/v/7HRz1
لینک پست مربوط به جزئیات syscall در لینوکس:
https://t.me/OxAA55/87

#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ELF #dump #memory

OS Internals

12 Apr, 19:21


شیوه‌ی دریافت حافظه توسط برنامه‌ها و درایورها در ویندوز

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

در user mode چند لایه API برای دریافت حافظه از سیستم‌عامل ویندوز وجود دارد. در پایین‌ترین سطح، APIهای VirtualAlloc وجود دارند که هیچ‌گونه مدیریتی بر روی حافظه‌ی دریافت شده انجام نداده و حافظه را در واحد‌هایی به اندازه‌ی Page (پیش‌فرض 4KB) تخصیص می‌دهند. این APIها امکان reserve/commit کردن حافظه را فراهم کرده و برای کار با حافظه‌های بزرگ مناسب هستند.

لایه‌ی بعدی APIهای حافظه که برای کار با اندازهای کوچک حافظه مثل چندبایت نیز مناسب است Heap می‌باشد. این APIها به صورت داخلی از APIهای لایه‌ی قبلی استفاده کرده و نیازی به تخصیص حافظه در ابعاد Page را ندارند. بر روی این لایه است که زبان‌هایی مثل C/C++ پیاده‌سازی‌های malloc/new و free/delete را انجام می‌دهند (جزئیات پیاده‌سازی وابسته به کامپایلر است) که مربوط به پیاده‌سازی‌های Compilerها می‌باشد. در این لایه دیگر APIهای ویندوز مستقیم توسط برنامه‌نویس استفاده نشده و نیازی به کار با آن‌ها ندارد.

اما در سمت کرنل ماجرا از چه قرار است؟ در سمت کرنل چیزی با عنوان VirtualAlloc/Heap وجود ندارد و به درایورها حافظه از طریق دو نوع Pool اختصاص داده می‌شود. اولین نوع Non-Paged Pool است که حافظه‌ی تخصیص داده شده از آن تضمین می‌شود که همیشه در RAM باشد. این موضوع برای جلوگیری از Deadlock و Crash کردن درایور اهمیت دارد (جزئیات این موضوع بماند برای یک پست و ویدئوی دیگر!) نوع دوم Pool که حافظه‌ی آن ممکن است در RAM نبوده و به دیسک منتقل شود Paged Pool است.

در این ویدئو جزئیات تخصیص حافظه در سمت کرنل و APIهای ExAllocatePool بررسی شده، در یک درایور تخصیص و آزاد شدن حافظه نمایش داده شده و سپس به کمک WinDbg حافظه‌ی تخصیص داده شده به درایور بررسی می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/pMPyT13jzwk
لینک ویدئو در آپارات:
https://aparat.com/v/VIvgR

#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters #kernel #drivers #SystemPools #WinDbg

OS Internals

02 Apr, 11:10


مروری بر حافظه‌ی مجازی در ویندوز

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

این لایه وظایفی دارد که بخشی از آن به صورت خلاصه عبارتند از:
• مدیریت اینکه داده دقیقا در کدام آدرس RAM قرار دارد و Map کردن آن در فضای مجازی پروسه
• استفاده از Hard Disk در صورت کم بودن RAM بدون اینکه پروسه از آن اطلاع داشته باشد
• جلوگیری از تکرار داده در حافظه‌ی فیزیکی و Map کردن بخشی که بین چند پروسه مشترک است برای آن‌ها
• کنترل دسترسی به اطلاعات خاص و تعیین permission برای داده
• دسترسی به داده‌ها به صورت یکسری Chunk بجای دسترسی بایت به بایت (تعریف Page)

از طرف دیگر از دید پروسه کل فضای آدرس‌دهی ممکن (در مدل ۳۲بیتی ۲گیگابایت و در مدل ۶۴بیتی ۱۲۸ترابایت) قابل تخصیص بوده و می‌توان از آن استفاده نمود ولی اینکه واقعا چقدر از آن قابل استفاده است بسته به میزان RAM موجود و میزان Hardای دارد که برای استفاده به عنوان حافظه در سیستم‌عامل تعیین شده است.

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

در ابزارهای مختلفی که در ویندوز وجود دارند (مثل Task Manager, Process Explorer) یکسری Counter برای اطلاع پیدا کردن از وضعیت حافظه در سیستم و میزان فضای رزرو یا استفاده شده توسط پروسه‌ها وجود دارد که می‌توان به کمک آن‌ها از اتفاقاتی که برای حافظه رخ می‌دهد اطلاع پیدا کرد.

در این ویدئو مروری بر وظایف حافظه‌ی مجازی در ویندوز انجام گرفته و Counterهای موجود، برای بررسی آن در ابزارهای مختلف شرح داده می‌شوند.

لینک ویدئو در یوتیوب:
https://youtu.be/x5AnJpGBdW4
لینک ویدئو در آپارات:
https://aparat.com/v/NIsUi

#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters

OS Internals

20 Mar, 12:08


سلام خدمت همه‌ی همراهان
🌹 سال نو مبارک 🌹

🪴امیدوارم در 403 به جای خطا خوردن‌ها و ممنوع شدن‌ها، گشایش‌هایی برای همه‌ی شما در راه باشد و به بهترین‌ها برسید.

🎯 برای امسال برنامه‌ی تهیه یکسری آموزش جدید و خاص رو دارم که به مرور اعلام می‌کنم.

🧩 برنامه انتشار ویدئو از InTERnAL ویندور و لینوکس هم مثل قبل ادامه خواهد داشت.

🌺 به امید بهترین‌ها برای همه

OS Internals

16 Feb, 09:33


📚 انتشار دوره Windows Internals and Memory Analysis در مکتب‌خونه و یک تخفیف ۵۰درصدی برای ثبت‌نام

🗓️ سال ۹۷ اولین همکاری من با مکتب‌خونه با انتشار دوره‌ای در زمینه‌ی شبکه شکل گرفت که تجربه‌ی خوبی بود.
از آن زمان تا کنون چندبار تلاش شد که مجدد همکاری شکل گرفته و دوره‌ی دیگری از طریق مکتب‌خونه منتشر کنم ولی متاسفانه به دلیل مشغله‌ی کاری و سختی آماده کردن دوره‌ی آفلاین این امر میسر نشد.

ℹ️ امسال دوره‌ی Windows Internals and Memory Analysis را به صورت آفلاین آماده کردم که زحمت زیادی داشته و انرژی زیادی نیز ازم گرفت.

🎯 با صحبتی که با تیم خوب مکتب‌خونه داشتم بنا بر این شد که این دوره روی سایت مکتب‌خونه منتشر شده و از این به بعد از این طریق ارائه بشه، به این امید که افراد بیشتری ازش استقبال کرده و مخاطب بیشتری داشته باشه.

می‌تونید دوره رو از طریق لینک زیر مشاهده و ثبت‌نام کنید:
yun.ir/rx6jy2

📴 برای دریافت ۵۰ درصد تخفیف، در زمان خرید کد tahlil-kazemi را وارد کنید.

#WindowsInternals #Course #Training #Maktabkhooneh

OS Internals

26 Jan, 18:42


برخی با دانلود مطالب دوره از OneDrive مایکروسافت مشکل داشتند، با کمک یکی از دوستان کل دوره روی تلگرام آپلود شده و می‌تونید از لینک زیر دانلود کنید:

https://t.me/akazemi67_courses/23

به همت یکی دیگر از دوستان دوره بر روی مگا هم قرار گرفت:
https://mega.nz/folder/U3E1XThA#I8QoMr74favg2xPcmQNrVw

OS Internals

26 Jan, 14:39


دوستانی که در لینکدین فعال هستند لطفا در اشتراک گذاری و بیان نظرات در لینکدین از طریق لینک زیر کمک کنند.

https://www.linkedin.com/posts/akazemi67_%D8%A7%D9%85%D8%B3%D8%A7%D9%84-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87%DB%8C-%D8%AC%D8%A7%D9%84%D8%A8%DB%8C-%D8%AF%D8%B1-%D8%B2%D9%85%DB%8C%D9%86%D9%87%DB%8C-%D8%AA%D8%AF%D8%B1%DB%8C%D8%B3-%DB%8C%DA%A9-%D8%AF%D9%88%D8%B1%D9%87-activity-7156656054695608321-mxvW

OS Internals

26 Jan, 14:37


دعوت از جامعه‌ی IT مخصوصا متخصصان و مدرسان حوزه‌ی امنیت و لینوکس برای داوری و بیان مشکلات کارم

امسال تجربه‌ی جالبی در زمینه‌ی تدریس یک دوره‌ با شرکت SITS «زیرساخت امن خدمات تراکنشی بانک ملت» داشتم که سوالات و ابهامات زیادی برایم ایجاد کرد که باعث شد تصمیم بگیرم روند کار، تجربه‌‌ام و حتی ویدئوهای دوره رو اینجا به اشتراک بگذارم و امیدوارم دوستان همراهی کنند و با بررسی مطالب دوره، اشتراک‌گذاری، نظر دادن و ذکر اشکالاتی که می‌بینند به من کمک کنند که هم کارم رو بهبود بدم و هم اینکه مجدد کلاسی نداشته باشم که در نهایت پولم رو دریافت نکنم!

تابستان امسال از طرف SITS با من تماس گرفتند برای یک دوره که Internal و Forensic‌ لینوکس رو تدریس کنم. من یک سرفصلی آماده و ارسال کردم که مورد تایید قرار گرفت و چون قرارداد شخصی نمی‌بستند من با آکادمی هماهنگ کردم و توافق شد که دوره از طرف آکادمی برگزار بشه. مدت زمان دوره ۴۰ ساعت در نظر گرفته شده و قیمت دوره بر اساس ۴۰ساعت بسته شده و پیش‌فاکتور برای SITS‌ ارسال شد. چون قرار بود دو روز در هفته و هر روز ۳ساعت کلاس داشته باشیم من گفتم که ۱۴جلسه‌ی ۳ ساعته و در مجموع ۴۲ساعت کلاس برگزار می‌کنیم و در فاکتور همین مدت زمان قید شد. با واریز ۵۰درصد مبلغ قرارداد، دوره اوایل مهر به صورت آنلاین آغاز شد.

با اینکه من ابتدای هر کلاسی کل کلاس رو مرور می‌کنم و میگم که چه ترتیبی پیش گرفته میشه و چه مطالبی بیان میشه، در ۴جلسه‌ی اول تقریبا هر جلسه یک بحثی در مورد سرفصل داشتیم و من باید توضیح می‌دادم که چه روندی داریم طی می‌کنیم و چرا مطالب به این صورت بیان میشه. مثل این بود که سرفصل و مطالب دوره برای افرادی که در دوره شرکت کرده‌اند مبهمه و نمی‌دونند دوره در چه زمینه‌ایه و چه چیزی رو می‌خواد پوشش بده. این بود که من پس از جلسه‌ی چهارم کلاس رو کنسل کردم و ذکر کردم که بررسی کنید آیا این دوره رو نیاز دارید و آیا سرفصلی که خودتون تایید کرده‌اید درسته یا خیر! از آکادمی با من تماس گرفتند که دوره رو ادامه بدید و مشکل با رابط سازمانی بررسی و حل شده‌ است. این بود که دوره ادامه پیدا کرد ولی تعداد شرکت کنندگان همچنان ثابت نبوده و خیلی متغیر بود!

چند جلسه‌ی دیگر پیش رفت و در یک جلسه من بودم تنهای تنها!!! کسی از SITS آنلاین نشد و پس از پیگیری مشخص شد درگیر جابجایی بوده‌اند و فرصت اطلاع رسانی برای کنسل کردن کلاس نداشته‌اند و من فقط بیکار بودم که از کار زدم و آنلاین شدم و منتظر تدریس! این بود که به پشتیبانی آکادمی اطلاع دادم به خاطر این موضوع باید یک جلسه از کلاس کم کنیم و کلاس بجای ۱۴ جلسه بشه ۱۳ جلسه چون من آنلاین و آماده‌ی تدریس بودم ولی از نظر دوستان وقت من ارزش اطلاع رسانی برای کنسل کردن نداشته! پشتیبان آکادمی هم این موضوع رو به رابط سازمانی اطلاع رسانی کردند.

دوره ادامه داشت تا اواخر دوره هم مجدد این حرکت تکرار شده و ۲ نفر پس از ۱۰ دقیقه که من منتظر بودم حاضر شدند و هرچقدر هم من ازشون تلاش کردم بپرسم که آیا شروع کنیم و بقیه می‌آیند یا خیر پاسخی دریافت نکردم و یک جلسه‌ی دیگر نیز به خاطر دوستان کنسل شد. اینبار هم می‌خواستم یک جلسه‌ی دیگر کسر کنم ولی فقط به پشتیبانی آکادمی اطلاع دادم که کلاس ۱۳ جلسه بیشتر نبوده و علی‌رغم اینکه من مطلب دارم برای بیان کردن در ۱۳ جلسه مطالب دوره جمع شده و کلاس پایان می‌پذیرد. این بود که اواخر آذرماه دوره با برگزاری ۱۳ جلسه به اتمام رسید.

الان حدود ۲ماه از اتمام دوره می‌گذرد و پس از کلی پیگیری توسط دوستان آکادمی «که واقعا از همشون کمال قدردانی و تشکر رو دارم» پیگیری‌های خودم، بیان مفصل روندی که طی شده توسط خودم به صورت voice در گروه دوره که ۳۰ نفر از کارشناسان تا افراد رده‌بالای SITS هم در آن بودند، نه تنها ۵۰درصد مابقی دوره تسویه نشده، حتی پاسخی دریافت نکرده‌ام که اشکال دوره چی بوده و چرا پرداخت انجام نشده. آیا مطالب طبق سرفصل پیش نرفته؟ آیا من بی اخلاقی در برخورد و تدریس داشته‌ام؟ آیا مدت زمان دوره کم بوده؟ خلاصه اینکه من به خطایم آگاه نشدم!

در لینک زیر تمامی مطالب دوره از سرفصل تا اسلاید و ویدئو و کد وجود دارد. لطفا دوستان بررسی کنند و بازخورد دهند. اگر مطالب براتون مفید است استفاده کرده و منتشر کنید تا به دست افراد بیشتری برسه ولی حتما نگاه نقادانه داشته و اشکالات کارم رو بیان کنید که منم کارم رو بهبود بدم.

https://1drv.ms/f/s!Ai-nCVsaY1b5tzTMfCBo4c6MeIi_?e=eE1rpU

تشکر و سپاس فراوان.

OS Internals

12 Jan, 17:41


بررسی شیوه‌ی نگهداری اطلاعات پروسه‌ها در کرنل ویندوز

از دید کرنل ویندوز، هر پروسه دارای یک شی از ساختار EPROCESS بوده و اطلاعات پروسه‌ها در یک لیست پیوندی حلقوی دو طرفه نگهداری می‌شود. متغیر سراسری PsActiveProcessHead اشاره‌گری به اولین و آخرین پروسه داشته «به خاطر دوطرفه بودن لیست پیوندی دارای دو اشاره‌گر Flink/Blink می‌باشد» و به کمک آن می‌توان لیست را پیمایش کرد.

برای ایجاد لیست پیوندی، هر شی EPROCESS به کمک آیتمی به اسم ActiveProcessLinks که آن هم دو بخش Flink/Blink دارد پروسه‌ها را به یکدیگر متصل کرده و به Offsetای از ساختار EPROCESS که مربوط به ActiveProcessLinks می‌باشد اشاره می‌کند. در این روند Flink به Offset پروسه‌ی بعدی و Blink به Offset پروسه‌ی قبلی اشاره می‌کند.

در این ویدئوی کوتاه که بخشی از کلاس‌هایم است به کمک WinDbg این لیست بررسی شده و اطلاعات پروسه‌ها از آن استخراج می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/zLxAtROZJWo
لینک ویدئو در آپارات:
https://aparat.com/v/iq3Xy

#ShortWinInternals #windows #internals #EPROCESS #WinDbg #ActiveProcessLinks

OS Internals

01 Jan, 19:57


شیوه‌ي دریافت اطلاعات فایل‌ها از سیستم‌عامل توسط دستور ls

یک سیستم‌عامل به دو بخش UserMode و KernelMode‌ تقسیم می‌شود که از نظر حافظه و سطح دسترسی کاملا از هم جدا می‌باشند. داده‌ساختارهای اصلی سیستم‌عامل مثل اطلاعات مربوط به پروسه‌ها/نخ‌ها، شیوه‌ی زمانبندی آن‌ها، درایورها و سیستم‌فایل در فضای آدردهی کرنل بوده و در این سطح اجرا می‌شوند.

برای ارتباط با سطح کرنل از UserMode از System Call استفاده می‌شود که API درخواست از سیستم‌عامل بوده و امکان اجرای درخواستی از طریق آنرا فراهم می‌کنند. حتی اجرای یک دستور بسیار ساده مثل echo hi نیز باید از SystemCallها کمک گرفته و از طریق آن‌ها متنی را در FileDescriptor شماره‌ی ۱ که همان StandardOutput می‌باشد بنویسد.

در این ویدئو ابتدا توابعی که از طریق آن‌ها می‌توان خصیصه‌های فایل‌ها را بدست آورد معرفی شده و کدی برای دریافت نوع و اندازه‌ی فایل می‌نویسیم، سپس مروری بر روی طریقه‌ی کار دستور ls به صورت اجمال انجام داده و SystemCallای که این دستور از آن برای نمایش جزئیات فایل‌ها در لینوکس استفاده می‌کند را معرفی می‌کنیم.

لینک ویدئو در یوتیوب:
https://youtu.be/118PLXAheJ8
لینک ویدئو در آپارات:
https://www.aparat.com/v/8k9zh

#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ls #commands

OS Internals

22 Dec, 18:34


📚 انتشار اسلایدهای دوره Linux Internals and Forensics

‼️ اخیرا دوره‌ای در زمینه‌ی Internal لینوکس و استفاده از آن برای Forensics داشتم و تصمیم گرفتم اسلایدهای دوره و بخش‌هایی از آن را که به توضیح طرز کار قسمتی از لینوکس می‌باشد، به صورت ویدئوهای کوتاه منتشر کنم.

ℹ️ این دوره موارد کلی زیر را پوشش داده و برای اطلاع از جزئیات مطالب می‌توانید به مرور اسلایدها بپردازید. همچنین در تمامی بخش‌ها لینک‌هایی برای ارجاع به مقالات و کسب اطلاعات بیشتر وجود دارد که می‌توانید از ‌آن‌ها برای مطالعه‌ی بیشتر استفاده کنید.
* Programming Review
* Building and Debugging Linux Kernel
* System Calls Internals
* Writing Kernel Modules
* Process and Thread Internals
* Ftrace and Hooking Kernel Functions
* IPC Mechanisms
* Linux Memory Forensics
* ELF Structure
* MBR and GPT Overview
* VFS Internals
* EXT4 File System Internals
* Disk Forensics
* Linux Malware Techniques

📌برای دسترسی به نمونه کدهای استفاده شده در دوره از مخزن زیر استفاده کنید:
https://github.com/akazemi67/Teaching/tree/main/Linux%20Internals%20Course