Bluepill adalah kerangka analisis dinamis open-source untuk menangani malware mengelak. Tujuannya adalah untuk merekonsiliasi sifat transparansi yang diperlukan untuk analisis otomatis dengan kemampuan inspeksi dan penambalan eksekusi berbutir halus yang diperlukan untuk analisis manual.
Bluepill adalah prototipe akademik yang kami pertahankan di waktu luang kami: umpan balik Anda sangat berharga!
Bluepill dapat melawan banyak pil merah yang menargetkan hypervisor, debugger, alat pihak ketiga, dan artefak waktu. Ini dibangun di atas instrumentasi biner dinamis (DBI) untuk memantau pertanyaan yang dapat dibuat malware di lingkungan mencari artefak, mengubah hasil mereka ketika mereka dapat mengungkapkan adanya sistem analisis otomatis atau agen manusia. Bluepill menawarkan antarmuka jarak jauh GDB untuk men-debug sampel sambil mengurus penghindaran atas nama analis, bersama dengan mekanisme penambalan siluman baru untuk menyembunyikan perubahan kode yang dibuat dalam debugger dari skema pemecahan diri.
Kami menguji bluepill pada malware windows PE32 yang heterogen yang berjalan pada Windows 7-bit SP1: sebagai contoh, kami dapat menjalankan eksekutif yang dilindungi dengan versi terbaru dari VMProtect dan Themida dan sampel yang sangat mengelak seperti Furtim.
Bluepill telah disajikan dalam:
Untuk melawan Evasi DBI, Bluepill menggunakan perpustakaan mitigasi yang kami tulis untuk Intel Pin sebagai bagian dari kertas kami Sok: Menggunakan Instrumentasi Biner Dinamis untuk Keamanan (dan bagaimana Anda dapat tertangkap basah) dari Asiaccs 2019. Dalam Bluepill, kami memperluas perpustakaan dengan mitigasi lebih lanjut untuk waktu overhead dan menargetkan pil Red. Anda dapat membaca lebih lanjut tentang Evasi DBI dalam makalah ini mengevaluasi sistem instrumentasi biner dinamis untuk fitur yang mencolok dan artefak baru -baru ini muncul di ACM DTRAP (preprint).
Di bawah daftar parsial dari Evasi yang dibalas Bluepill dalam pengujian kami pada mesin Virtual 32-bit VirtualBox 5.2 untuk banyak pelindung yang dapat dieksekusi dan sampel lapis baja:
| Kategori | Instance |
|---|---|
| Hypervisor | Tambahan Tamu, File, Entri Registri, Perpustakaan, dan Driver dari VirtualBox |
| Perangkat keras | Bios dan string firmware, alamat MAC, cpuid , ukuran disk, kemampuan daya/termal |
| Waktu | Deteksi Perlambatan Menggunakan rtdsc dan API Terkait Windows Time |
| Perangkat lunak | Artefak alat pemantauan umum (proses berjalan, jendela GUI), proses induk, tata letak keyboard HKL, kursor mouse beku |
| Debugging | Pengecualian satu langkah, int 2d , kueri OS untuk debuggers aktif/terpasang (misalnya NtQueryInformationProcess ), bidang blok entri proses |
| Pertanyaan WMI | CPU, ukuran disk, alamat MAC, ACPI, Bahasa MUI, VirtualBox VBOXVIDEO |
| Dbi | Pointer Bocor dengan Instruksi FPU, Isi Memori dan Izin (misalnya halaman penjaga, penegakan NX) |
Catatan: Sebelum go public untuk BH Europe 2019, kami membuat perubahan radikal yang memecahkan penanganan kode 64-bit dan (pada tingkat kecil) dari subsistem WOW64: Harap pertimbangkan skenario ini eksperimental saat kami menyelesaikan pengujian regresi, dan jangan ragu untuk melaporkan masalah.
Bluepill dibangun di atas pin Intel (V3.16 direkomendasikan) dan membutuhkan Visual Studio 2015 atau lebih tinggi untuk kompilasi.
PIN memiliki beberapa ketergantungan yang membutuhkan inklusi manual dalam proyek. Kami membuat file Locals.props yang menyederhanakan konfigurasi proyek. Defaultnya adalah pin yang dipasang di C:Pin316 dan header SDK 8.1 sedang digunakan:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
Misalnya, jika Anda ingin menggunakan header SDK 10.0.17763.0, setelah memodifikasi pengaturan proyek di Visual Studio, Anda juga harus mengubah nilai properti WinHPath menjadi C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um . Similary, Ubah Nilai Properti Jika header SDK 8.1 Anda diinstal dalam C:/Program Files/ bukan C:/Program Files (x86)/ . Tujuan dari bidang ini adalah untuk membantu pin ketika mencakup jalur absolut Windows.h dari header CRT -nya.
Anda sekarang harus dapat mengkompilasi bluepill. Setelah kompilasi berakhir, Anda akan menemukan perpustakaan bluepill32.dll di direktori pin. Jika Anda menemukan kesalahan msvc_compat.h yang hilang, pastikan bahwa $(PinFolder)extrascrtinclude adalah jalur yang valid.
Untuk menjalankan yang dapat dieksekusi di bawah penggunaan bluepill:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
Bluepill mendukung opsi baris perintah berikut:
| Pilihan | Arti |
|---|---|
-evasions | Mendeteksi dan menangani sebagian besar evasi yang didukung (lihat di bawah untuk DBI) |
-debugger | Aktifkan mode debugger melalui antarmuka jarak jauh GDB |
-leak | Evasi DBI: Perbaiki kebocoran EIP nyata (misalnya instruksi FPU) |
-nx | Evasi DBI: Periksa apakah halaman kode dapat dieksekusi |
-rw | Evasi DBI: Sembunyikan halaman yang dimiliki oleh mesin DBI |
Misalnya, untuk menjalankan program Evasive bernama sample.exe dalam mode otomatis seperti pasir, coba:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
Mengaktifkan mitigasi -leak memiliki dampak kinerja minimal, sementara -nx dan akhirnya -rw dapat membantu dengan pengemas kompleks yang mencoba memeriksa kesesuaian pada ruang alamat program.
Bluepill akan membuat file bernama evasions.log di bawah pin folder C:Pin316 (memodifikasi variabel LOGPATH di dalam pintoolsrclogging.h untuk mengubahnya) yang mencatat kemungkinan upaya penghindaran yang dicegat selama eksekusi.
Bluepill mendukung penggunaan debugger untuk mengendalikan eksekusi dan melakukan diseksi malware. Kami mengandalkan antarmuka Remote GDB dari PIN: Bluepill dengan demikian dapat digunakan sebagai backend jarak jauh dari alat debugger Anda jika mendukung protokol GDB. Berikut ini kami memberikan instruksi untuk mengatur sesi debugging dengan IDA Pro.
Untuk mengaktifkan antarmuka debugger, Anda perlu memberikan opsi baris perintah tambahan untuk kedua pin ( -appdebug -appdebug_server_port <port> ) dan bluepill ( -debugger ) sebagai berikut:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
Kami akan menggunakan 10000 sebagai nomor port dalam panduan ini. Aplikasi akan tetap berhenti sampai Anda menghubungkan debugger ke soket: namun, jika Anda mencoba memasang debugger lokal ke proses, Anda akan akhirnya men -debug seluruh mesin pin alih -alih hanya aplikasi. Output yang diharapkan di layar akan seperti:

Anda sekarang dapat membuka yang dapat dieksekusi di IDA dan memilih backend GDB Debugger jarak jauh dari Debugger->Switch debugger . Periksa apakah opsi (misalnya nomor port) benar menggunakan Debugger->Process options seperti di tangkapan layar di bawah ini:

Pada titik ini membantu memasukkan breakpoint pada beberapa alamat di bagian utama yang dapat dieksekusi, misalnya di titik masuk. Kemudian Anda dapat memulai sesi debugging Anda dengan Debugger->Start process . Ida akan memberi tahu Anda bahwa "Sudah ada proses yang debug oleh Remote. Apakah Anda ingin melampirkannya?" . Cukup klik ya dan sesi debugging akan dimulai, dengan EIP berada di suatu tempat di dalam di ntdll.dll.
Karena informasi pemetaan memori tidak tersedia secara default atas protokol jarak jauh GDB, kami menambahkan vmmap perintah debugger khusus yang menginstruksikan Bluepill untuk membangun peta seperti itu. Kami mengotomatiskan proses ini dengan script addSegments.py yang tersedia di scripts/ folder: cukup muat di IDA dengan File->Script file . Script akan mengisi subview segmen IDA dengan informasi tata letak memori (yaitu bagian dan izinnya) untuk setiap modul kode. Catatan: Kami akan segera menambahkan kode untuk memperbarui subview modul, yang saat ini tetap basi.
Anda sekarang dapat men-debug sampel Anda saat Bluepill melindungi Anda dari banyak evasi :-)
Harap dicatat bahwa penanganan pengecualian memerlukan solusi untuk dukungan server GDB saat ini di PIN. Ketika pengecualian tidak boleh diteruskan ke aplikasi (misalnya, 0xc0000008 untuk pegangan yang tidak valid diteruskan ke Closhandle), kirim perintah wait di konsol GDB tepat setelah Anda menerima pesan pengecualian, kemudian lepaskan dan hubungkan kembali IDA ke bluepill. Sementara itu, pembantu debugger akan tetap dapat ditahan sebagai tanggapan terhadap perintah tersebut.
Catatan: Kami awalnya mengandalkan trik pemutusan juga untuk jenis pengecualian lainnya. Bagi mereka, perubahan yang baru diperkenalkan dalam beberapa rilis pin setelah 3,5 yang mengarah pada kegagalan pernyataan internal ketika mengulangi debugger ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID ; Oleh karena itu, ketika Anda menghadapi EG A 0xc0000005 Pengecualian dari Opcode int 3 atau Evasion int 2d , Anda harus meneruskan pengecualian ke aplikasi. Antarmuka PIN debugger tidak akan terdeteksi secara langsung, tetapi musuh mungkin masih melakukannya dengan menggunakan jam tangan. Kami saat ini sedang memikirkan solusi untuk melindungi artefak seperti itu juga.
Bluepill mengimplementasikan fungsionalitas unik untuk menambal bagian kode saat men -debug saat menyembunyikannya dari kode pelaksanaan. Patch yang diterapkan tetap tidak terlihat oleh skema anti-perusak (misalnya sekuens self-checksumming) karena sangat ditambah dengan mekanisme JIT pin. Singkatnya, kami mengulang kompilasi JIT untuk menambahkan trampolin yang mengesampingkan instruksi (asli) yang dikompilasi dan tidak diperhatikan oleh mekanisme perlindungan kode, karena membaca memori terus dialihkan ke instruksi program asli.
Penciptaan tambalan dibagi menjadi tiga langkah:
Pertimbangkan blok kode pada gambar di bawah ini, dan anggaplah kita ingin menimpa mov ebp, esp di alamat 0x771X37A5 dengan mov eax, esp Instruction ( 89 e0 dalam biner), dan kemudian melakukan pelaksanaan eksekusi di alamat 0x771X37A8 .

Ketika Bluepill beroperasi dalam mode Debugger, kami dapat menginstruksikan PIN untuk tambalan melalui perintah GDB khusus: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> , dengan alamat yang dinyatakan sebagai nomor hex dan byte patch kode yang dipisahkan oleh koma. Untuk contoh di atas kita dapat menggunakan: set_771c37a6_771c37a6_771c37a8_89,e0 .
Patch kemudian dapat dihapus dengan mudah menggunakan perintah GDB kustom lain: rm_<START_ADDR>_<END_ADDR> .
Jika Anda menggunakan Bluepill dalam proyek akademik atau Anda yakin itu akan cocok dengan beberapa bagian diskusi di makalah Anda, kami akan berterima kasih jika Anda dapat merujuk pekerjaan kami menggunakan entri Bibtex berikut:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}