مجازی سازی کد (حفاظت مبتنی بر VM)

6 شهریور 1404 - خواندن 5 دقیقه - 12 بازدید

مجازی سازی کد (حفاظت مبتنی بر VM)


 مقدمه

مجازی سازی کد یکی از تکنیک های پیشرفته در زمینه حفاظت از نرم افزارهاست که توسط ابزارهایی نظیر **VMProtect** و **Themida** استفاده می شود. این تکنیک به جای اجرای مستقیم برنامه ها به زبان ماشین CPU، کد را به دستورالعمل های یک CPU مجازی تبدیل می کند. هدف اصلی این روش، جلوگیری از تحلیل و مهندسی معکوس نرم افزارها و افزایش امنیت آنهاست. در این یادداشت، به ساختار کار، چالش های تحلیل، ترکیب با Anti-Debug و روش های Devirtualization پرداخته می شود.


 1. ساختار کار

 1.1. تولید Bytecode مخصوص VM

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


 1.2. پاک سازی یا رمزنگاری کد اصلی

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


 1.3. Interpreter ماشین مجازی

ماشین مجازی دارای یک Interpreter است که وظیفه اش خواندن و اجرای کد Bytecode است. این Interpreter دستورالعمل های مجازی را به دستورالعمل های واقعی CPU تبدیل کرده و آنها را اجرا می کند. به این ترتیب، هر دستورالعمل واقعی CPU مانند MOV، ADD و CALL به یک دستور خیالی مانند VM_INST_01، VM_INST_A3 و VM_INST_FF تبدیل می شود.


 2. چرا تحلیل آن دشوار است؟

2.1. زبان عجیب و غریب

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


 2.2. وجود VM های اختصاصی

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


2.3. عدم کارایی دیباگرهای معمول

ابزارهای دیباگری نظیر x64dbg، OllyDbg و IDA در این شرایط کارایی کمتری دارند. این دیباگرها معمولا برای تحلیل کدهای x86 طراحی شده اند و نمی توانند به خوبی با زبان های مجازی کار کنند. به همین دلیل، تحلیل گران نیاز به ابزارهای خاص و روش های جدید دارند تا بتوانند به تحلیل این نوع کدها بپردازند.


3. ترکیب با Anti-Debug

بسیاری از اوقات، VMProtect نه تنها مجازی سازی را ارائه می دهد بلکه تکنیک های Anti-Debug را نیز ترکیب می کند. این ترکیب باعث می شود که:

- **Obfuscation شدید**: کد به طور قابل توجهی غیرقابل فهم شود. این موضوع باعث می شود که حتی اگر تحلیل گر به کد دسترسی پیدا کند، نتواند به راحتی آن را تحلیل کند.

- مشکلات در اتصال دیباگرها: دیباگرها نمی توانند به راحتی به کد متصل شوند. این موضوع به دلیل وجود تکنیک های مختلفی است که در زمان اجرای کد، از اتصال دیباگرها جلوگیری می کند.


4. روش های Devirtualization

برای شکستن حفاظت مبتنی بر VM، مراحل زیر باید انجام شود:

 4.1. شناسایی VM Handlerها

اولین قدم در فرآیند Devirtualization، شناسایی VM Handlerها است. این توابع مسئول اجرای هر دستور در ماشین مجازی هستند و شناسایی آنها به تحلیل گر کمک می کند تا بفهمد هر دستور مجازی چه عملکردی دارد.


4.2. Map کردن دستورات VM به دستورات واقعی CPU

پس از شناسایی VM Handlerها، تحلیل گر باید معادل سازی دستورهای مجازی به دستورهای واقعی CPU را انجام دهد. این فرآیند نیاز به دانش عمیق از معماری CPU و نحوه عملکرد آن دارد.


4.3. نوشتن Decompiler اختصاصی

در نهایت، برای بازگرداندن کد اصلی، نیاز به نوشتن یک Decompiler اختصاصی است. این ابزار باید قادر باشد تا کد Bytecode را به کد منبع اصلی تبدیل کند. این فرآیند به ویژه در تحلیلگرهای بزرگ مانند IDA با استفاده از پلاگین های خاص یا ابزارهای شخصی سازی شده انجام می شود.



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