دوربینزدایی استاتیک از Themida: VM Obfuscator بزرگها
خلاصهٔ کاملتر
Devirtualization یعنی برگردوندن کد مبهمشده توسط یه VM Obfuscator به کد اصلی قابل فهم. Themida و CodeVirtualizer دو تا از پرکاربردترین ابزارهای این حوزهان که کد رو داخل یه ماشین مجازی اجرا میکنن تا تحلیلش سخت بشه. این مقاله یه روش کلی و مقاوم برای مقابله با این تکنیک رو معرفی میکنه که به جزئیات خاص هر نسخه از Themida وابسته نیست.
نویسندهها تأکید میکنن که pattern matching — یعنی شناسایی handler های VM و نگاشت دستیشون به دستورات x86 — رویکرد درستی نیست. هر تغییر کوچیکی که vendor محافظتکننده توی layout یا جدول opcodeها بده، کل tooling رو خاموش میکنه. به جاش، روشی معرفی میشه که اطلاعات خاص VM رو به حداقل میرسونه.
ایده اصلی Guided Symbolic Evaluation اینه: دستورات native رو به یه IR (Intermediate Representation — نمایش میانی) قابل تغییر lift کن، و با اجرای بهینهسازیها control flow رو تا جایی که مقصد پرش مشخص بشه، جلو ببر. Back Engineering Labs برای این کار یه موتور اختصاصی به اسم BLARE2 داره که میتونه IR بهینهشده رو دوباره به کد native کامپایل کنه. برای کسایی که میخوان این روش رو پیاده کنن، ابزارهایی مثل Triton یا Remill هم میتونن بخش زیادی از کار رو پوشش بدن.
یه نکته کلیدی اینه که در شروع symbolic evaluation، همه رجیسترها و فلگها symbolic هستن به جز RSP (stack pointer) که یه مقدار concrete بهش داده میشه. این انتخاب هوشمندانهست: وقتی RSP مشخصه، دسترسیهای stack بهصورت خودکار توسط منطق load/store propagation مدیریت میشن و arithmetic مربوط به stack رو میشه constant fold کرد — بدون هیچ منطق اختصاصی اضافهای.
قلب devirtualization یه سری پاس بهینهسازی کوچیکه که با هم اجرا میشن تا کل داربست VM فرو بپاشه. مهمترینشون Constant Promotion و Memory Modeling هستن: وقتی یه load از آدرس bytecode VM به یه constant تبدیل بشه، constant folding میتونه روی decode arithmetic اطرافش کار کنه — منطق decryption handler، ایندکسگذاری جدول opcode، و محاسبات VPC — تا آدرس concrete handler بعدی مشخص بشه و lifting ادامه پیدا کنه.
پاسها به هم وابستهان و به صورت زنجیرهای کار میکنن: یه bytecode load تبدیل به constant میشه ← arithmetic decryptionش fold میشه ← handler index مشخص میشه ← آدرس handler بعدی resolve میشه. این زنجیره تا از بین رفتن کامل VM scaffolding ادامه داره.
نکات کلیدی:
- Devirtualization بدون pattern matching — رویکردی که در برابر تغییرات نسخههای مختلف Themida مقاومه
- Guided Symbolic Evaluation ایده اصلیه: lift کردن به IR و هدایت lifting با بهینهسازیهای تدریجی
- RSP در شروع concrete نگه داشته میشه تا stack accesses بهصورت خودکار مدیریت بشن
- یه سری پاس بهینهسازی کوچیک (Constant Promotion، Memory Modeling و ...) با هم کافیه تا VM کامل unravel بشه
- همین روش با تغییرات جزئی روی VMP، EagleVM، covirt و دیگر obfuscatorهای مبتنی بر VM هم قابل اعماله




