این مبحث Alignment که سوال پرسیدید، البته من در ویدیوهای برنامه‌نویسی سیستمی آن را توضیح ندادم، مبحث زیاد خاصی نیست اما خب آشنایی با آن هم بد نیست. 

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

از این بحث‌ها که بگذریم، این File Alignment و Section Alignment در فایل فرمت چه هستند و چرا نیاز هستند؟ خیلی ساده بخواهم این مسئله را توضیح بدهم، موضوع اصلی پارس کردن فایل روی حافظه و بر روی دیسک است. 

وقتی شما فایلی را با StudPE یا CFF Explorer باز می‌کنید، در استراکچر Optional Header مقدار ممبر File Alignment مشخص می‌کند هر بلاک کد و داده فایل اجرایی مد نظر ما بر روی دیسک دارای چه مقداری است که عموما این مقدار 512 بایت (200h) است، یعنی هر بخش از برنامه در یک محدوده و یا مرز 512 بایتی بر روی دیسک قرار می‌گیرد، اما فایل اجرایی وقتی در حافظه ترسیم و مپ می‌شود، این مقدار 4 کیلوبایت است، یعنی هر سکشن بر روی حافظه در یک مرز 4 کیلوبایتی تعریف می‌شود که لودر می‌تواند آن‌ها را با دقت پارس کند. 

علاوه بر این هر کدام از این سکشن‌ها سطح دسترسی مخصص به خودشان را دارند، مثلا سکشن تکست بر روی مموری Executable است در حالیکه سکشن بعدی یعنی مثلا Data فقط Readable است. با این مرزبندی لودر سیستم عامل می‌تواند خصوصیت‌ها و سطح دسترسی سکشن‌های برنامه در حافظه را هم مشخص کند. 

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

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


کانال تلگرام: @miladkahsarialhadi