روابط عمومی شرکت ایدکو (توزیعکنندهی محصولات کسپرسکی در ایران)؛ این روزها، کلی متخصص حوزه امنیت سایبری وجود دارد که ابزار اصلیشان برای مهندسی معکوس، IDA Pro است. گرچه IDA Pro ابزار پیچیدهای است که قابلیتهای مفید برای تشریح باینریها را پیادهسازی میکند اما بسیاری از مهندسین معکوس از پلاگینهای مختلف برای افزودن کارایی بیشتر به این نرمافزارها استفاده میکنند.
ما در تیم تحلیل و تحقیق جهانی خود نیز همین کار را انجام میدهیم و در طول سالها پلاگین IDA مخصوص خود را توسعه دادهایم که نامش hrtng است و مشخصاً طراحی شده برای اینکه به ما در مهندسی معکوس بدافزارها کمک کند. گاهی قابلیتهایی که نیاز داشتیم در پلاگینهای موجود و گاهی در پلاگینهای ترکشده پیادهسازی شده بودند- در مورد پلاگینهای ترکشده ما کد منسوخ را در into ادغام کردیم و برای کار را جدیدترین نسخههای IDA SDK که همیشه در حال تغییرند به روز نگه داشتیم. اخیراً تصمیم گرفتیم hrtng را با جامعه در میان گذاشته و کد منبعش را تحت لایسنس GPLv3 منتشر کنیم.
در این مقاله هم قصد داریم نشان دهیم چطور پلاگین ما مهندسی معکوس نمونههای پیچیده را برای تحلیلگر بدافزار آسانتر میکند. برای انجام این کار، جزء بدافزار FinSpy را که برنامه جاسوسافزار پیچیدهی تجاری برای چندین پلتفرم است تحلیل خواهیم کرد. حین نمایش قابلیتهای پلاگین خود همچنین برای کار با IDA نیز توصیههای کلی ارائه خواهیم داد. اگر نمونه خود را در یک ادیتور HEX باز کنیم میبینیم که دو بایت اول 4D و 5A هستند- امضای فایلهای قابلاجرای ویندوزی.
با این حال، اگر آن را در IDA بارگذاری کنیم، میبینیم که IDA نمیتواند باینری را به عنوان یک فایل اجرایی تشخیص دهد. بنابراین چارهای نداریم جز اینکه نمونه را به صورت فایل باینری بارگذاری کنیم. وقتی این کار را انجام میدهیم، IDA بایتهای فایل بارگذاریشده را نمایش میدهد. اگر آنها را جدا کنیم، میبینیم که توالی 4D 5A هِدِر فایل EXE نیست. پس از به دست آوردن این آدرس، کد پوسته آن را 0x1D افزایش میدهد و با استفاده از دستورالعمل LEA آن را در ثبات EDX ذخیره میکند.
چطور میشود با استفاده از دستورهای fldz و fstenv به ارزش EIP رسید؟
پس از بازیابی آدرس خود، کد پوسته وارد یک حلقه میشود که با رنگ سبز مشخص شده است. بدنه آن شامل دو دستورالعمل XOR و ROL میشود. اولین عملوند[1] دستور XOR حاوی رجیستر EDX است – و همانطور که قبلاً بحث کردیم، آدرس پوسته کد را ذخیره میکند. در نتیجه، کد پوسته عملیات XOR را بر روی بایتهای خود اعمال و خود را رمزگشایی میکند. همچنین کلید رمزگشایی در ثبات EBX ذخیره میشود و مقدار آن در قسمت نارنجی کد پوسته تخصیص داده شده است. در مورد تعداد بایتهایی که باید رمزگشایی شوند، مقدار 0x2C7B2 ذخیره شده در ثبات ECX به آن اختصاص داده میشود. برای ادامه تجزیه و تحلیل خود، باید کد پوسته را رمزگشایی کنیم، و این را میتوان به روشهای مختلفی انجام داد، به عنوان مثال، با نوشتن یک اسکریپت IDAPython یا با یک برنامه C مستقل. همچنین انجام رمزگشایی با افزونه hrtng راحت است. برای انجام این کار، می توانیم حباب رمزگذاری شده را با استفاده از کلید میانبر Alt + L انتخاب و سپس با فشار دادن Shift + D پنجره Decrypt data را باز کنیم. در این پنجره میتوانیم کلید رمزگذاری و الگوریتم مورد استفاده را مشخص کنیم. افزونه ما محبوبترین الگوریتمها مانند XOR، RC4 یا AES را خارج از جعبه پیادهسازی میکند و امکان رمزگشایی را تنها با چند کلیک انجام میدهد. برای رمزگشایی کد پوسته خود، باید الگوریتم FinSpy را در پنجره انتخاب کرده و کلید 0xF6E4BB5E را تنظیم کنیم. هنگامی که رمزگشایی کامل شد، میتوانیم به تجزیه و تحلیل بار مخرب ادامه دهیم.
چطور به پلاگین، الگوریتم رمزگذاری سفارشی اضافه کنیم؟
پس از اتمام حلقه رمزگشایی، دستورالعملهای برجستهشده با رنگ بنفش به کد رمزگشایی شده انتقال داده میشود. توالی بایت با بایتهای 50 45 PE شروع میشود که امضای سرصفحههای فایل PE را ارائه میدهند. در همان زمان، کد پوسته ما با بایتهای 4D 5A (MZ) شروع میشود، بایتهای جادویی فایلهای PE. همانطور که میبینیم، کد پوسته ما خود را در یک فایل PE رمزگشایی کرده و اکنون میتوانیم با استفاده از ویژگی Create file DEC پلاگین hrtng، بار رمزگشایی شده را در دیسک بریزیم. همانطور که مشخص شد، رمزگشایی کد پوسته به تنهایی راه را برای تجزیه و تحلیل موفق بیشتر هموار نکرد.
وقتی بار رمزگشاییشده را در IDA باز میکنیم، بلافاصله متوجه میشویم که به درستی بارگیری نمیشود زیرا جدول ایمپورت آن حاوی مقادیر ناخواسته است. این امر ادامه تجزیه و تحلیل فایل بارگذاری شده را غیرممکن میکند، زیرا ما قادر به درک نحوه تعامل کد پوسته با سیستم عامل نیستیم. برای تحلیل بیشترِ چرایی اشتباه پردازش جدول ایمپورت، باید به تجزیه و تحلیل قسمت بنفش کد پوسته ادامه دهیم. کد بالا اجرا را به یک تابع کد شده در C منتقل میکند و ما میتوانیم آن را برای تجزیه و تحلیل بیشتر دیکامپایل کنیم. توجه داشته باشید که افزونه hrtng شامل مؤلفهای میشود که با برجسته کردن براکتهای فِر مانند مورد استفاده در عبارات و حلقههای if، خواندن دیکامپایل را راحتتر میکند. همچنین میتوان با فشار دادن کلیدهای میانبر [ و ] از یک براکت به براکت دیگر پرش کرد.
در مورد توابع هش مانند CRC32، آنها اغلب در بدافزارها برای پیادهسازی تکنیک فرار از دفاع با وضوح API دینامیک استفاده میشوند، که برای به دست آوردن نشانگرها به توابع API ویندوز استفاده میشود. این تکنیک از هشها برای جلوگیری از گنجاندن رشتههایی با نام توابع API مشکوک در باینریهای مخرب استفاده و آنها را مخفیتر میکند. کد پوسته ما از هش CRC32 برای هدف دقیق پیادهسازی تکنیک Dynamic API Resolution استفاده میکند تا نام توابع API نامیده شده را پنهان کند.
بنابراین، برای ادامه تجزیه و تحلیل کد پوسته خود، باید این نامها را با مقادیر هش CRC32 مطابقت دهیم (به عنوان مثال، نام تابع NtAllocateVirtualMemory را با هش 0xE0762FEB آن مطابقت دهیم). باز هم، افزونه hrtng با قابلیت اسکن Turn on APIHashes خود، این فرآیند را بسیار ساده میکند، که به طور خودکار کدهای جدا شده و دکامپایل شده را برای هش نام تابع API جستجو میکند. وقتی چنین درهمسازی را پیدا میکند، یک نظر با نام تابع مربوطه اضافه میکند، متغیر اشارهگر تابع را تغییر نام و نوع داده صحیح را به آن اختصاص میدهد.
برای استفاده از این ویژگی، ابتدا لازم است کتابخانههای نوع ویندوز (مانند mssdk_win10 و ntapi_win10)را با استفاده از پنجره Type Libraries وارد IDA کنید که از طریق کلید میانبر Shift + F11 قابل دسترسی است. اکنون که نام توابع API پنهان شده با هش کردن API را بازیابی کردهایم، میتوانیم به تجزیه و تحلیل تابع تجزیه و تحلیل شده، یعنی قطعه کد زیر ادامه دهیم. کد بالا یک حلقه را برای جستجوی دو امضا، 4D 5A) (MZ) و 50 45 PE) اجرا میکند. همانطور که قبلاً اشاره کردیم، اینها امضاهایی هستند که در هدرهای فایل PE استفاده میشوند. به طور خاص، توالی بایت 50 45 در فایلهای PE برای علامتگذاری ابتدای ساختار IMAGE_NT_HEADERS استفاده میشود.
ساختار به درستی اعمال شده است، زیرا مقادیر فیلد آن با مقادیر مشخص شده در مستندات فایل PE مطابقت دارد. به عنوان مثال، فیلد FileHeader.Machine حاوی عدد 0x14C (IMAGE_FILE_MACHINE_I386) و فیلد OptionalHeader.Magic دارای مقدار 0x10B (PE32) است. پس از بازیابی محتویات ساختار IMAGE_NT_HEADERS، کد پوسته آن را تجزیه میکند. قابل توجه است که چنین تجزیه ای اغلب در کدهای مورد استفاده برای بارگذاری فایلهای PE در حافظه مشاهده میشود. چیزی که در مورد ساختار IMAGE_NT_HEADERS نیز مهم است این است که آفست دایرکتوری ایمپورت را در برمیگیرد که در قسمت OptionalHeader.DataDirectory[1].VirtualAddress و برابر با 0x1240C ذخیره میشود.
با توجه به محتویات ساختارهای تعریف شده، اولین مقدار آنها، با نام OriginalFirstThunk، باید به آرایهای از نام توابع وارد شده اشاره کند. با این حال، اگر به ساختارهایی که به تازگی تعریف کردیم نگاه کنیم، می بینیم که این فیلد روی صفر تنظیم شده است. این بدان معنی است که چیزی باید با ساختارهای تعریف شده ما اشتباه باشد. اگر بدافزار ما یک فایل معمولی PE بود، مواجهه با ارزشهای صفر در این فیلد محال بود. با این همه یادتان باشد که ما فایل PE را تحلیل نمیکنیم بلکه در عوض شلکدی را بررسی میکنیم که به فایل PE شباهت دارد. به این دلیل ممکن است توسعهدهندگان بدافزار برای محققین دردسر و مانع درست کنند.
از این رو برای درک بیشتر ایراد کار در مورد ساختارهای تعریفشده و اینکه چطور میشود نام توابع ایمپورتشده را ذخیره کرد باید سایر فیلدهای این ساختارها را بررسی کنیم. قسمت چهارم در این ساختار Name نام دارد و شامل نام کتابخانه ای است که توابع وارد شده را در خود جای داده است. به نظر میرسد که به درستی تنظیم شده - برای مثال، کد پوسته حاوی رشته msvcrt.dll با offset 0x12768 است. اما این مورد در مورد آخرین فیلد به نام FirstThunk صدق نمیکند، زیرا آفستهای مشخص شده در آن به آدرس هایی با ظاهر عجیب اشاره میکنند.
با این حال، اگر شروع به تعریف اعضای این آرایه به عنوان اعداد صحیح 4 بایتی کنیم، پلاگین hrtng آنها را به عنوان هشهای API CRC32 شناسایی میکند و درک اینکه کدام توابع توسط کد مخرب استفاده می شود را آسان میکند. همچنین شایان ذکر است که برای هر تابع وارد شده، افزونه به طور خودکار نام آرگومانها و انواع دادههای آنها را بازیابی میکند. همانطور که به نظر میرسد، کد پوسته ما ایمپورت را با استخراج نام توابع از آرایه های فیلدهای FirstThunk پردازش میکند. به طور خاص، روی توابع صادر شده توسط کتابخانه های سیستم ویندوز تکرار میشود و هش CRC32 نام هر تابع را محاسبه میکند، تا زمانی که مقدار هش با مقدار آرایه مطابقت داشته باشد. پس از یافتن تابع تطبیق، کد پوسته آدرس خود را در آرایه FirstThunk ذخیره میکند و مقدار هش CRC32 را بازنویسی میکند. اکنون که به ایمپورتها پرداختیم، میتوانیم تابع نقطه ورودی را تحلیل کنیم. برای انجام این کار، میتوانیم کد پوسته را به آدرس مشخصشده در مقدار OptionalHeader.ImageBase تغییر دهیم و سپس کد تابع نقطه ورودی را در آدرس 0x407FB8 ( (مشخص شده در قسمت OptionalHeader.AddressOfEntryPoint)جدا کنیم.
در مورد دایرکتوری ایمپورت به عنوان آرایهای از ساختارهای IMAGE_IMPORT_DESCRIPTOR تعریف شده است. برای اختصاص دادن این ساختارها به دایرکتوری import در IDA، ابتدا میتوانیم تعریف نوع ساختار IMAGE_IMPORT_DESCRIPTOR را وارد و سپس آن را به محتویات دایرکتوری اعمال کنیم.
این کد ابتدا مقادیر رجیسترهای ESI و ECX را در پشته فشار سپس محاسبات مختلف مربوط به ثبت ESI مانند جمع، تفریق یا XOR را انجام میدهد. پس از اجرای تمام دستورات محاسبه، کد پوسته مقادیر رجیسترهای ESI و ECX را با استفاده از دستور POP بازیابی میکند. از آنجایی که کد پوسته مقدار را در رجیستر ESI محاسبهشده توسط دستورالعملهای محاسباتی بازنویسی میکند، این دستورالعملها بیمعنی هستند و برای گیجکردن disassembler درج شدهاند. افزونه hrtng دارای یک ویژگی مفید برای حذف سریع آنها است - این کار را میتوان با انتخاب کد ناخواسته و اعمال عملیات Fill with nops روی آن انجام داد.
اگر ما یک جستجوی منبع باز روی کد دیکامپایل شده از ویدیو انجام دهیم، میتوانیم آن را به عنوان موتور مبهمساز مبتنی بر مجازیسازی FinSpy VM شناسایی کنیم. از آنجایی که رفع ابهام از ماشینهای مجازی یک چالش مهندسی معکوس بسیار خسته کننده است، ما در این مقاله به آن نمیپردازیم. برای غیر مجازی کردن کد موجود در نمونه ما که توسط VM FinSpy محافظت میشود، از یک اسکریپت آماده که در اینجا موجود است استفاده میکنیم. با این حال، برای درست کار کردن، این اسکریپت باید عملکردهای موتورهای VM FinSpy را به ترتیب صحیح قرار دهد تا مقادیر کد عملیات مجازی صحیح را تعیین کند. از آنجا که ترتیب عملکردهای موتور ماشین مجازی در هر نمونه FinSpy متفاوت است، برای بازیابی این ترتیب باید این توابع را در IDA نامگذاری کنیم.
به طور کلی، هنگام پرداختن به شناسایی نام تابع، استفاده از ابزارهایی که تشخیص امضای کد را انجام می دهند بسیار رایج است. یک مثال محبوب از چنین ابزاری FLIRT است که در IDA تعبیه شده است و از disassembly برای محاسبه امضای کد استفاده میکند. متأسفانه FLIRT با عملکردهای موتور در نمونه ما به درستی کار نمیکند زیرا جداسازی آنها به شدت مبهم است. با این وجود، پلاگین hrtng جایگزین قویتری از FLIRT به نام MSIG را پیادهسازی میکند که مبتنی بر کدهای دیکامپایلشده به جای جداشده است، و ما میتوانیم از آن برای شناسایی موفقیتآمیز توابع در باینری خود استفاده کنیم. این را میتوان با استفاده از منوی "File -> Load file -> [hrt] MSIG file" انجام داد. هنگامی که همه توابع شناسایی شدند، افزونه deobfuscation میتواند به درستی کار و کد دیکامپایل شده بدافزار را تولید کند. توجه داشته باشید که به لطف افزونه hrtng، به نظر میرسد که هرگز مبهمسازی نشده است.
نمونهای که در این مقاله مهندسی معکوس کردیم بسیار پیچیده است و برای تجزیه و تحلیل آن باید مراحل متعددی را طی میکردیم. ابتدا نحوه عملکرد پوسته کد قرار داده شده در ابتدای نمونه را یاد گرفتیم و سپس فایل PE اصلاح شده موجود در پوسته کد را بررسی کردیم. در حین تجزیه و تحلیل آن، ساختارهای چند فرمت PE را مورد مطالعه قرار دادیم و با تکنیکهای مبهمسازی مختلف مانند هش کردن API، درج کد ناخواسته و مجازیسازی کد مقابله کردیم. ما مطمئناً بدون hrtng نمیتوانستیم این همه کارآمد را انجام دهیم - این افزونه میتواند وظایف پیچیده مهندسی معکوس را تنها با چند کلیک خودکار کند. در واقع، این افزونه دارای ویژگیهای بسیار بیشتری نسبت به آنچه در این مقاله توضیح داده ایم است. شما می توانید لیست کامل ویژگیها و همچنین کد منبع افزونه و فایل های باینری را در GitHub ما بیابید. امیدواریم افزونه ما برای خودکارسازی گردش کار تجزیه و تحلیل بدافزار شما مفید واقع شود. و اگر به دنبال ارتقاء سطح مهارت های خود با کمک کارشناسان کسپرسکی هستید، میتوانید دورههای مهندسی معکوس ما را بررسی کنید.
[1]در ریاضیات و برنامهنویسی رایانه، یک عملوند هدف یک عملیات ریاضی است. هر عبارت که بین دو عملگر قرار بگیرد یا بعد از یک عملگر بیاید یک عملوند محسوب میگردد.
کسپرسکی آنلاین (ایدکو)
کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز میشناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکی نام دارد.