جدول ۲-۲زمینه های بلوک محیطی فرایند که توسط مایکروسافت مستند شده است
محتوای بلوک محیطی فر آیند با فراخوانی سیستم NtCreateUserProcess آغاز می شود، تابع رابط برنامهنویسی اصلی که بخشی از مجموعه توابع زیر میباشد در :Win32
CreateProcess
CreateProcessAsUser,
CreateProcessWithTokenW,
CreateProcessWithLogonW
را بکار میبرد که در مجموعههای advapi32.dll, kernel32.dll همانند پشتیبانی تابع fork در مجموعه POSIX ویندوز NT، posix.dll هستند. POSIX ویندوز NT، محتوای یک بلوک محیطی فرایند جدید با NtCreateUserProcess شروع می شود به همان سادگی که یک کپی مستقیم فرایند منشأ بلوک محیطی فرایند در خطی موازی با چگونگی کارکرد تابع fork است. برای فرایندهای Win32، محتوای آغازین یک فرایند بلوک محیطی فرایند جدید بطور اصلی از متغیرهای جهانی باقی مانده در هسته گرفته می شود. اگرچه چندین زمینه از اطلاعات آماده شده در فایل تصویر فرایند گرفته می شود، بویژه اطلاعات آماده شده در ساختار داده
(( اینجا فقط تکه ای از متن درج شده است. برای خرید متن کامل فایل پایان نامه با فرمت ورد می توانید به سایت feko.ir مراجعه نمایید و کلمه کلیدی مورد نظرتان را جستجو نمایید. ))
جدول ۲-۳زمینه هایی از PEB که از متغیرهای جهانی هسته شروع شده اند
۲-۴- جدول آدرس واردات[۱۲]۱
یک بخش از یادداشت جدول آدرس واردات است که بعنوان یک جدول جستجو استفاده میشود. زمانی که برنامه در ماژولهای مختلف کاربرد دارد. این میتواند در قالب هر دو واردات یعنی ترتیبی یا بصورت اسمی ساماندهی شود. چرا که یک برنامه گردآوری شده قادر به شناسایی مکان کتابخانه نیست وآن بستگی به خیزش مستقیم با عنوان فراخوان رابط برنامه نویسی کاربردی دارد. از آنجایی که متصل کنندههای دینامیک مدلها را به هم وصل میکنند قادرند آدرسهای واقعی را درنقاط IAT1 بنویسند بنابراین آنها به مکانهایی که عملکرد کتابخانهها به هم مربوط است اشاره میکند پس این فرایند یک خیزش اضافی بر روی نتیجه مدلها اعمال میکند که بصورت طیف گستردهای نتایج نامیده میشود که بیانگر یک فایده کلیدی است. تعداد صفحات حافظهای که نیاز به کپی کردن است را برای یادگیری در حافظه بسیار اندک میکند و این باعث صرفه جویی در زمان و حافظه است. اگر گردآورنده مدت زمان یک تماس وارد شده را بداند میتواند کدهای بهینه سازی بیشتری را که بتواند به راحتی تماسهای غیر مستقیم را شناسایی کند تولید کند.
۲-۵- پرونده اجرایی قابل حمل[۱۳]۲
شرکت مایکروسافت در زمان عرضه ویندوزNT، فرمت جدیدی را برای فایلهای اجرایی ویندوز با نام فایل اجرایی قابل حمل ارائه کرده علت این نامگذاری این است که در میان تمام سیستم عاملهای ۳۲ بیتی مایکروسافت قابل استفاده بوده و توسط آن پشتیبانی میشود.
این فرمت براساس فرمت رایج شیئیهای پرکنند هر که فرمت فایل رایج و مورد استفاده در سیستم عامل یونیکس است طراحی شده بود. فرمت پرونده اجرایی قابل حمل در سال ۱۹۹۳ توسط کمیتهای به نامه متشکل از شرکتهای اینتل، مایکروسافت، بورلند و آی بیام به استانداردهای همگانی تبدیل شد.
فایل پرونده اجرایی قابل حمل به بلاکهایی به نام سکشن تقسیم شده که حاوی دادههایی با خصلتهای مختلف مثل داده / کد اجرایی/ خواندنی/ نوشتنی هستند. این فایل را میتوان مشابه یک دیسک منطقی فرض کرد که هدر۳ فایل پرونده اجرایی قابل حمل مثل بوت سکتور آن بوده و سکشنها همان فایلهای نوشته شده روی دیسک میباشند.
پس هدر فایل، قسمتی به نام جدول سکشنها موجود است که مانند جدول فت در دیسک میباشد. این جدول آرایهای از هدر تمام سکشنهای موجود در فایل است. به عبارتی برای تمام سکشنهای موجود در فایل، درو نی جدول هدر وجود دارد. در هر کدام از این هدرها اطلاعاتی مثل خصلت سکشن مربوطه، آفست و سایز آن در فایل و نحوه بارگزاری آن در حافظه موجود است. در نهایت پس از این جدول به خود سکشنها میرسیم که حاوی تمام دادههای موجود در فایل، با توجه به نوع سکشن میباشند. پس به طور کلی یک فایل پرونده اجرایی قابل حمل یک جدول بزرگ حاوی هدرها وسکشنها میباشد. خلاصهای از مهمترین قسمتهای فرمت پرونده اجرایی قابل حمل در جدول ۲-۴ ذکر شدهاند.
جدول ۲-۴ ساختار فایل پرونده اجرایی قابل حمل
۲-۵-۱ روند اجرای فایل های پرونده اجرایی قابل حمل
پس از اجرای یک فایل پرونده اجرایی قابل حمل، سیستم بارگزار ویندوز فضایی را در حافظه به آن پروسه اختصاص داده و اقدام به بارگزاری فایل اجرایی در آن فضا میکند. بدین منظور جدول هدر را در آدرس پایه پیش فرض قرار داده و به همین ترتیب سکشنها نیز با محاسبه آدرس نسبیشان نسبت به آدرس پایه، در حافظه قرار میگیرند.
در همین حین خصلتهای هر سکشن نیز با توجه به تعاریف موجود در هدر آن تنظیم میشوند. پس از اینکه تمام سکشنها در حافظه قرار گرفتند، جدول توابع ورودی بررسی شده و تمام فایلهای کتابخانهای مورد نیاز، در فضای رزرو شده توسط این پروسه بارگزاری میشوند.
پس پایان بارگزاری، جدول خروجی تک تک DLLهای مذکور بررسی شده و آدرس توابع مورد نظر آنها در جدول آدرس وارده پروسه ثبت میگردد. در نتیجه جدول آدرس وارده حاوی اشاره گر تمام توابع مورد نیاز پروسه در حافظه میباشد. با بهره گرفتن از این مکانیسم دیگر نیازی به تغییر آدرس در خود فراخوانیهای تابع در کد برنامه نبوده و تمام آدرس دهیها به طور نسبی و نسبت به جدول آدرس وارده انجام میشوند.
فصل ۳
پک و آنپک
۳-۱-مقدمه
برنامههای بستهای کننده که به عنوان پکرها شناخته میشوند در میان کسانی که برنامههای بدافزار (مثل ویروسها) را مینویسند بسیار معروف و پرکاربرد شده است. زیرا کمک میکند که بدافزارها از دید نرم افزارهای آنتی ویروس پنهان بمانند. همچنین باعث میشوند که تحلیل بدافزارها پیچیده شود و اندازه و حجم برنامههای مضر کامپیوتری را کاهش میدهند. بیشتر برنامههای بستهای شده به صورت مجانی وجود دارند و در دسترس هستند و استفاده از آنها بسیار آسان است. تحلیلهای پایهای بر روی برنامههای بستهای شده مفید نیستند (جواب مطلوب را نمیدهند). بدافزارهای بستهای شده باید قبل از آنکه مورد تحلیل قرار بگیرند باز شوند (از حالت بستهای خارج شوند. که این امر تحلیل را پیچیدهتر و چالش دارتر میکند. به دو دلیل بستهای شدهها در برنامههای اجرایی استفاده میشوند: یا کاهش حجم برنامه (کوچک کردن آن) و یا جلوگیری از ردیابی یا آنالیز. اگرچه انواع مختلفی از بستهای شدهها وجود دارد اما همه آنها از الگوی مشابهی پیروی میکنند. آنها یک برنامه اجرایی را تغییر شکل میدهند تا یک برنامه اجرایی جدید ایجاد کنند که برنامه اجرایی تغییر شکل داده شده را در خود ذخیره کند (به عنوان داده). این برنامه دارای یک برنامه کوچک موقتی است که بازکننده بستهای که به وسیله سیستم عامل فراخوانده میشود. ما این فصل را در مورد مطالبی در مورد اینکه چگونه بستهای شدهها کار میکنند یا اینکه چگونه باید آنها را تشخیص داد شروع میکنیم. سپس در مورد راه کارهای باز کردن بستهها صحبت میکنیم. ما از برنامههای آسانتر شروع میکنیم و به برنامههای پیچیدهتر میرسیم.
۳-۲-شکل برنامه های بسته ای شده ها
زمانی که یک بدافزار بسته بندی میشود یک تحلیل گر نوعاً به برنامه بسته بندی شده دسترسی دارد و نمیتواند به برنامههای اصلی که بسته بندی نشده است یا برنامهای که بدافزار را بسته بندی کرده دسترسی داشته باشد. به منظور اینکه یک برنامه اجرایی را از حالت بسته بندی خارج کنیم ما باید تمام کارهای انجام شده توسط بستهای شده را از آخر به اول انجام دهیم. این کار به این احتیاج دارد که ما تمام کارهای انجام شده توسط بستهای شده را متوجه بشویم. تمام بستهای شدهها یک فایل اجرایی به عنوان ورودی دارند و یک فایل اجرایی به عنوان خروجی دارند. برنامه اجرایی بسته بندی شده فشرده است. و یا رمز دار شده و یا تغییر شکل یافته است و تشخیص و مهندسی معکوس آن بسیار دشوار است.
بیشتر بستهای شدهها از یک الگوریتم فشرده سازی برای فشرده کردن برنامه اجرایی اصلی خود استفاده میکنند. یک بستهای شده برای این طراحی میشود که تشخیص آن دشوار شود، بنابراین ممکن است رمزدار شود و از تکنیکهای ضد مهندسی معکوس استفاده میکند. مانند برنامههای ضدجداسازی و یا ضد اشکال زدایی و یا آنتی vm. بسته بندی شدهها میتوانند کل برنامه اجرایی (فایل اجرا) را بسته بندی کند، شامل تمام داده و یا تمام منبع داده ویااینکه فقط کدها یا قسمت هایی از دادهها را بسته بندی کند. برای حفظ کارایی برنامه، یک برنامه بسته بندی کننده نیازدارد که دادههای ورودی برنامه ذخیره کند. این اطلاعات میتوانند به هرفرمتی ذخیره شوند و استراتژی متفاوتی برای این کار وجوددارد که در قسمتهای بعدی این فصل به طور عمیق بحث خواهد شد. زمانی که یک برنامه غیربستهای کننده، قسمت دادههای ورودی را ازنو میسازد (بازسازی میکند) (که این کار میتواند بسیار چالش زاو زمان بر باشد) امااین کار برای آنالیزکردن کار این برنامه میباشد.
۳-۳-زیربر نامه باز کننده بسته
یک برنامه کوچک که معمولا برای اتصال برنامه به کتابخانه استفاده میشود: برنامههای فایل اجرای غیربستهای شده به وسیله سیستم عامل بارگذاری میشود. باوجود برنامههای بسته بندی شده، برنامه stub غیربستهای شده به وسیله سیستم عامل بارگذاری میشود و سپس زیربرنامه stub غیربستهای کننده برنامه اصل را بارگذاری میکند. نقطه ورودی کد برای… نقاط قابل اجرا به جای کدهای اصلی به برنامههای stub اشاره دارد. برنامه اصلی دریک یا دوفایل اضافی ذخیره میشود. Stub غیربستهای کننده میتوانند به وسیله تحلیل گران بد افزارهابررسی شود و دیده شود. فهم قسمتهای مختلف stub برای غیربستهای کردن برنامه اجرای بسیارمهم است. Stubها معمولا کوچک هستند و به دلیل آنکه نقشی درکارکردهای اصلی برنامه ندارند، کارکرد آنها بسیارساده است، آنها فقط برنامه قابل اجرای اصلی را ازحالت بستهای خارج میکنند. اگرشما بخواهید که یک برنام بسته بندی شده راآنالیز کنید، شما باید stub را نیز آنالیز کنید. stubهای غیربستهای کننده سه گام را اجرا میکنند:
برنامه اصلی را در حافظه ازحالت بسته بندی شده خارج میکنند.
تمام دادههای ورودی را در برنامه اجرایی اصلی تجزیه و تحلیل میکنند.
برنامه اجرایی را به نقطه ورودی اصلی منتقل می کنند.[۱۴]
۳-۴- بارگذاری برنامه قابل اجرا
زمانی که یک برنامه اجرایی بارگذاری میشود، بارگذاری کننده پرونده اجرایی قابل حمل را برروی دیسک میخواند، و حافظهای را برای هرقسمت از برنامه قابل اجرا اختصاص میدهد. بارگذاری کننده سببی کپیها و رونوشتهایی را از قسمتها را در حافظه اختصاص داده شده، جا میدهد. برنامههای قابل اجرای بستهای شده پرونده اجرایی قابل حمل را به گونهای فرمت میکنند که بارگذاری کننده بتواند فضایی را برای بعضی قسمتها اختصاص دهد. این قسمتها ممکن است قسمت های از برنامه اصلی باشد. برنامه غیربستهای کننده کدها راازحالت بستهای درمیآورد وآنها را در حافظه جای میدهد (کپیهایی از آنها را). روش مورد استفاده توسط بستهای شدهها به اهداف آنها بستگی دارد.
۳-۵- تجزیه و تحلیل داده ها ی ورودی
پروندههای غیر بستهای شده پرونده اجرایی قابل حمل شامل قسمتی است که به بارگذاری کننده میگوید که چه توابعی را وارد کند وهمچنین شامل قسمتی است که آدرس و یا نامهای تمام توابع ورودی را ذخیره میکند. بارگذاری کننده ویندوز دادههای ورودی را میخواند و تعیین میکند که به چه توابعی نیاز هست و سپس آدرسها را پر میکند. بارگذاری کننده ویندوز نمیتواند دادههای ورودی که بسته بندی شدهاند را بخواند. برای یک برنامه اجرایی بسته بندی شده، زیر برنامه غیر بستهای کننده دادههای ورودی را تجزیه تحلیل خواهد کرد. روش و راهکار خاص این کار به بستهای شدهبستگی دارد. متداولترین راهکار این است که کاری کنیم که زیر برنامه غیربستهای کننده فقط توابع getpro Address و loadlibray را داشته باشد. بعداز اینکه زیر برنامه غیربستهای کننده، برنامه اصلی را از حالت بسته بندی شده خارج کرد، اطلاعات ورودی را میخواند و Dll را در حافظه بارگذاری میکند و همچنین از getpro Address استفاده میکند تا آدرس هر تابع را به دست آورد. راهکار دیگر آن است که دادههای ورودی را به صورت دست نخورده نگه داریم. تا اینکه بارگذاری کننده بتواند Dllها را بارگذاری کند. این سادهترین راهکار است زیرا دیگر لازم نیست زیر برنامه دادههای ورودی را تجزیه تحلیل کند. اگرچه آنالیز برنامه بسته بندی شده تمام دادههای ورودی اصلی را به ما نشان میدهد، بنابراین این راهکار نهانی ومخفیانه انجام نمیشود. علاوه براین به این علت که توابع ورودی در پیامهای عادی برنامههای اجرایی ذخیره میشوند فشرده سازی متحمل توسط این راهکار بهینه نیست. سومین راهکار نگه داری یک تابع ورودی از هر Dll است. این راهکار فقط یک تابع را به ازای هر کتابخانه ورودی درطول آنالیز نشان میدهد. بنابراین این راهکار مخفیانه تراز راهکار قبل است. این راهکار ساده تراز راهکار اول است ولی تمام کتابخانههای ورودی را نشان میدهد. زیرا نیازی به بارگذاری کتابخانهها توسط زیر برنامه غیربستهای کننده نداریم. اما بازهم باید تمام و یا اکثریت توابع را تجزیه تحلیل کند. راهکار نهایی حذف تمام دادههای ورودی است. بستهای شدهها باید تمام توابع مورد نیاز را از دیگر کتابخانهها را پیدا کنند و یا باید توابع getpro Address و loadlibray را پیدا کنند و از آنها برای یافتن محل دیگر کتابخانهها استفاده کند. مزیت این راهکار این است که برنامه بسته بندی شده شامل هیچ اطلاعات ورودی نیست که آنها را به یک فرایند مخفی تبدیل میکند. اگرچه به منظور استفاده از این راهکارstub غیربستهای کننده باید پیچیده باشد.
۳-۶- talijamp
زمانی که یک زیر برنامه غیربستهای کننده کامل شد (بطورکامل عمل کرد) باید برنامه اجرایی را به نقطه ورودی قابل اجرارمنتقل کند. دستوری (دستور در برنامه ریزی) که این برنامه اجرایی را به نقطه ورودی قابل اجرار منتقل میکند معمولا tailjamp خوانده میشود. دستور (کدی) jamp سادهترین و معروفترین راه برای انتقال برنامههای قابل اجرا است. به این علت که این دستور بسیار معروف است، بسیاری از بستهای شده تلاش میکنند که این تابع را با بهره گرفتن از دستور call و یا دستور ret مخفی کنند. گاهی اوقات Tailjamp به وسیله توابع سیستم عامل مخفی میشود. اشکال۳-۱ فرآیندهای بستهای کردن وغیربستهای کردن را نمایش میدهد. شکل۳-۱ برنامه قابل اجرای اصلی را نشان میدهد. سراندازها و بخش ها مرئی و مشخص هستند و نقطه شروع بر نامه قابل اجرا است.
شکل ۳-۲ نشان میدهد یک برنامه قابل اجرای اصلی را همان گونه که روی دیسک است را نشان میدهد. تمام آنچه قابل مشاهده است سرانداز جدید، stub غیربستهای کننده و کداصلی بستهای شده است.
شکل ۳-۳ برنامه قابل اجرا را همان گونه که درزمان بارگذاری در حافظه است نشان میدهد. Stub غیربستهای کننده کد اصلی غیربستهای کننده دارد. و قسمت های اطلاعات ۳ و متن ۴ قابل دید هستند. دادههای ورودی معمولا دراین مرحله معتبر نیستند.
شکل ۳-۴ کل برنامه قابل اجرایی بسته بندی را نشان میدهد. ونقطه شروع معمولا نقطه اصلی ورودی است. توجه داشته باشید که برنامه غیربستهای شده با برنامه اصلی متفاوت است. برنامه غیربستهای شده هنوززیر متن غیربستهای کننده ویاهر کد دیگری راکه برنامه بسته بندی کننده دارد را درخود دارد. برنامه غیربستهای کننده پرونده اجرایی قابل حمل داردکه به وسیله برنامه غیربستهای کننده بازسازی میشود. و دقیقا مانند برنامه اصلی نیست.
شناسایی برنامههای بسته بندی شده: اولین گام درزمان آنالیزکردن بدافزار تشخیص این مسأله است که این برنامه بسته بندی شده است. مادرتکنیکهای شناسایی درفصلهای قبل صحبت کردیم دراینجا تکنیکهای جدید رامعرفی میکنیم.
مشخصات یک برنامه بسته بندی شده: فهرست زیر علامتهایی را که در زمانی بررسی یک بدافزار احتیاج داریم باید به آن توجه کنیم لیست میکند: این برنامه اطلاعات ورودی کمی دارد، خصوصا اگر دادههای ورودی loadlibrary، getprocadress باشند.
زمانی که برنامه در IDApro بازمی شود، فقط مقدار کمی از کدها تشخیص داده میشود (به وسیله آنالیز اتوماتیک) زمانی که برنامه باز میشود در ollydbg، این یک هشدار است که شاید برنامه
بسته بندی شده باشد. برنامه نام قسمتهایی را نشان میدهد که یک بستهای شده خاص را نشان میدهند.
این برنامه سایزهای غیرطبیعی دارد مانند قسمت متن. با اندازه داده خام o و اندازه مجازی nonzero ابزارهای تشخیص بستهای شدهها مانند پرونده اجرایی قابل حمل ID میتواند استفاده شود.
۳-۷ محاسبه بی نظمی ها
محاسبه بینظمی: برنامههای قابل اجرا بسته بندی شده میتوانند به وسیله تکنیکی به نام محاسبه بینظمی بینظمی یک معیار بینظمی در سیستم و یابرنامه است. اگرچه فرمول ریاضی استانداردی برای محاسبه آن نیست معیارها و روشهای خوبی برای اندازه گیری بینظمی داده دیجیتال وجود دارد. داده فشرده شده و یا رمزدار شده بسیار شبیه به دادههای تصادفی است. و بنابراین بینظمی زیادی دارند. برنامههای اجرایی که فشرده نشده اندویارمزدارنشدهاند بینظمی کمتری دارند. ابزار اتوماتیک برای تشخیص برنامههای بسته بندی شده از بینظمی استفاده میکنند. یک نوع از این ابزارها mandiantRedcartain است که میتواند احتمال بستهای بودن یک برنامه را پیدا کند.