شکستن مبهمسازی ماشین مجازی تنسنت
خلاصهٔ کاملتر
به گفتهٔ نویسندهها، ماشین مجازی تنسنت نقطهٔ ورود تابع اصلی رو به سکشن .tvm میفرسته، همهٔ رجیسترهای عمومی و فلگها رو توی یه ساختار کانتکست ذخیره میکنه و بعد اجرا میافته توی یه حلقهٔ dispatch مشترک. ساختارش از این نظر خیلی شبیه VMProtect هست. هر دستوری که خارج از زیرمجموعهٔ مدلشدهٔ AMD64 باشه بهصورت boxed اجرا میشه: ماشین مجازی حالت واقعی رو برمیگردونه، دستور نیتیو اجرا میشه و بعد رجیسترها دوباره جمع میشن.
بخش جالب مهندسیاش سازگاری با CET و SEH هست. چون فراخوانیهای ورودی به dispatcher هیچوقت برنمیگردن، شدو استک مدام رشد میکنه؛ تنسنت با RDSSPQ چک میکنه CET فعاله یا نه (این دستور روی سختافزار قدیمی مثل NOP رد میشه، پس چک روی هر دو نسل درسته) و بعد با INCSSPQ دو ورودی اضافه رو دور میندازه.
برای اکسپشنها هم کل محدودهٔ ماشین مجازی زیر یه ورودی .pdata بزرگ قرار داره و یه تابع هیچوقت اجرانشده با unwind info قلابی نگه داشته میشه. وقتی اکسپشنی داخل VM بلند میشه، هندلر رجیسترهای مهمان رو توی ناحیهٔ ذخیره کپی میکنه و آنوایندر از همون مسیر حالت اصلی تابع رو بازسازی میکنه.
حملهٔ اصلی اجرای نمادین هدایتشدهست. نویسنده میگه یه اکتشاف ساده ولی مؤثر اینه که callهایی که بلافاصله بعدشون int3 هست دنبال بشن، چون همهشون ورود به حلقهٔ dispatcherن. بایتکد هم باید توی IR به ثابت ارتقا پیدا کنه تا رمزگشاییهای بایتکد فولد بشن، و VIP ردیابی میشه تا حلقههای مجازیشده دوباره باز نشن.
مبهمسازی MBA تنسنت هم روی چند قاعدهٔ همانی خیلی ساده بنا شده که بازگشتی اعمال شدن؛ کافیه همونها به ruleset مربوط به inst-combine اضافه بشن تا کل عبارت جمع بشه:
(A|B) + (A&B) = A + B
(A^B) + (A&B) = A | B
(A|B) - (A&B) = A ^ B
A - (A - (A&B)) = A & Bپوشش نهایی روی چهار درایور کرنلی ACE برابر ۸۱۵ تابع از ۸۶۵ تابع یعنی ۹۴.۲ درصد بوده و بالاترین نرخ مربوط به ACE-GAME.sys با ۹۹.۳ درصده. محدودیت باقیمونده هم حلقههای for با شرط ثابتشوندهست که بهینهسازی تهاجمی رو به حلقهٔ بینهایت میکشونه. نویسندهها معتقدن مبهمسازهای کلاسیک مبتنی بر ماشین مجازی جلوی این نوع تحلیل دووم نمیآرن.
نکات کلیدی:
- ماشین مجازی تنسنت با حلقهٔ dispatch مشترک کار میکنه و دستورهای مدلنشده رو بهصورت boxed و نیتیو اجرا میکنه
- سازگاری با CET از طریق RDSSPQ و INCSSPQ و سازگاری با SEH از طریق unwind info قلابی حل شده
- اجرای نمادین هدایتشده بههمراه ارتقای بایتکد به ثابت و ردیابی VIP کلید بازکردن VM بوده
- قواعد MBA استفادهشده سادهان و با چند قاعدهٔ همانی کامل تا میشن
- پوشش نهایی ۹۴.۲ درصد روی ۸۶۵ تابع مجازیشدهٔ چهار درایور ACE گزارش شده




