SimpleATor ("Simple -or") adalah emulator aplikasi mode pengguna X64 Windows-sentris yang inovatif yang memanfaatkan beberapa fitur baru yang ditambahkan dalam Pembaruan Musim Semi Windows 10 (1803), juga disebut "Redstone 4", dengan perbaikan tambahan yang dibuat dalam pembaruan Windows 10 Oktober (1809), alias "Redstone 5".
Yaitu, Simpleator bergantung pada:
Ini dimaksudkan sebagai bukti konsep tentang seberapa sederhana dan lebih cepat lingkungan peledakan kotak pasir dapat dibangun, serta lebih banyak wadah terbatas sumber daya yang dapat menjalankan beban kerja tanpa server (fungsi AWS Lambdas / Azure) tanpa memerlukan sistem operasi tamu.
Simpleator dapat dibangun dengan Visual Studio 2017 dan Windows SDK terbaru (1809). Perhatikan bahwa SDK yang lebih tua tidak dapat digunakan, karena mereka tidak mendukung definisi WHVP yang lebih baru, dan Simpleator itu sendiri hanya mendukung sistem Windows 10 64-bit yang menjalankan Building 17763 atau di atas (Redstone 5/1809).
Jendela monitor utama yang melacak panggilan sistem, yang ditampilkan di sini menampilkan output konsol dari aplikasi tamu uji:
Jendela register, yang dapat digunakan ketika ada pernyataan/masalah dengan emulator (utas UI akan membeku, maka pesan "tidak merespons"):
Dan akhirnya, jika mengaktifkan flag FLG_SHOW_LDR_SNAPS di PEB, jendela debug menunjukkan panggilan ke DbgPrint dari loader (jika tidak, panggilan DBGPrint lainnya akan muncul terlepas):
TBD TBD Tambahkan tautan
Pengembang telah menulis, dan memanfaatkan teknologi emulasi selama beberapa dekade, jadi mengapa menulis emulator lain?
Pertama, pengenalan API virtualisasi aktual di jantung Windows adalah pergeseran dramatis yang kurang dipublikasikan (dengan cara positif) ke sifat tertutup sebelumnya dari platform Hyper-V. Sementara ada API dan IOCTL yang tidak berdokumen melalui perpustakaan perangkat infrastruktur virtualisasi (VID), lapisan Win32 yang didukung dan stabil adalah peningkatan yang disambut baik. Sudah, QEMU sekarang mendukung menggunakan WHVP untuk akselerasinya, dan VirtualBox 6.0 kemungkinan akan dikirimkan dengan dukungan ini juga (sudah diimplementasikan dalam repositori). Hanya VMware yang berdiri sendiri dan menantang. Pada topik ini, belajar bagaimana memanfaatkan API baru ini belum tentu merupakan topik yang mudah, jadi saya ingin belajar - dan berbagi dengan orang lain - bagaimana antarmuka baru ini bekerja.
Kedua, saat melihat teknologi emulasi, biasanya ada tiga kekuatan pendorong modern untuk digunakan:
Ketertarikan utama saya adalah melihat peluru ketiga-yang sejauh ini telah dicapai dengan emulasi sistem penuh, dengan beberapa implementasi khusus yang menggunakan model-model berlangganan berlebih, tetapi masih membawa banyak kompleksitas-sebuah contohnya adalah sebagian besar emulator antivirus, seperti yang diterapkan pada bek windows (lihat beberapa penelitian hebat [di sini] dan [di sini]). Selain itu, para peneliti yang akrab dengan Qilin mungkin telah melihat banyak binding python sederhana yang dengan mudah dibangun di atasnya untuk dengan cepat 'spin-up' proses Windows menggunakan model over-subscription dengan memanfaatkan QEMU sebagai emulator sistem penuh tetapi tanpa gambar OS utama.
I decided to pursue another avenue -- a sort of 'user-mode Windows' implementation, where the only binaries mapped in the guest address space would be the host's OS loader (Ntdll.dll) and the target binary, and where a 256 GB address space would be provided that would have native 1:1 access between guest virtual mappings and host virtual mappings, in a 'sandboxed' process (NOTE: I have not yet implemented the AppContainer-based Sandboxing). Selama emulator akan memberikan struktur data dasar yang dikonstruksi kernel untuk loader dan sistem DLL, host dapat berjalan pada kecepatan asli, dengan hanya transisi cincin istimewa yang menyebabkan keluar.
Kemudian, untuk kesederhanaan, penyedia panggilan sistem mencegat panggilan sistem yang dilakukan oleh VM tamu, dan dapat beroperasi dalam salah satu dari tiga cara:
Bergantung pada di mana kebutuhan berada di antara kinerja, kompleksitas, kompatibilitas dan keamanan, kurang dari 500 baris kode diperlukan untuk menerapkan cukup banyak peluru 1 dan 2 di atas untuk mendapatkan aplikasi pengujian sederhana untuk memuat, menampilkan pesan "Hello World", dan keluar, dengan banyak masalah keamanan potensial dalam menangani panggilan sistemnya. Ganda basis kode mungkin secara realistis dapat mengurangi sebagian besar masalah keamanan dalam panggilan sistem (dikurangi kerentanan aktual dalam kernel OS host - yang dapat dikurangi oleh kotak pasir).
Tetapi bahkan pada 1000 baris kode, karena semua panggilan sistem pada akhirnya dikirim secara alami ke sistem operasi, Simpleator berperilaku lebih seperti implementasi 'SECCOMP' di atas cgroup di Linux, daripada emulator yang jauh lebih kompleks yang kita lihat saat ini.
Akhirnya, perlu ditunjukkan bahwa ada minat baru pada ruang komputasi/kontainerisasi awan untuk meminimalkan sumber daya yang dibutuhkan untuk menjalankan beban kerja seperti Amazon Lambdas atau fungsi Azure, yang merupakan potongan kode tanpa server yang berjalan dalam wadah, yang masih membutuhkan pemintalan seluruh sistem operasi tamu. Dengan kontrol yang lebih ketat dari batas -batas keamanan yang disediakan Simpleator, orang dapat membayangkan kemampuan untuk menjalankan inti JVM atau .NET sebagai aplikasi khusus tanpa memerlukan OS tamu penuh.
TBD TBD
Ada 3 bagian menarik utama (bagi saya) tentang bagaimana Simpleator mencapai lingkungan eksekusi tamu yang unik yang membuatnya lebih sederhana untuk menjalankan aplikasi Windows:
Penciptaan PEB dan TEB dengan jenis data yang sama dengan fungsi MiCreatePebOrTeb kernel akan diatur, tetapi dengan bendera tertentu untuk membuatnya lebih mudah dijalankan di bawah lingkungan tamu, termasuk
Membuat pemetaan 1: 1 antara alamat tamu dan host, dan memanfaatkan fitur "persyaratan alamat" baru untuk mengunci alokasi ke kisaran itu. Perhatikan bahwa saat ini, Simpleator memetakan wilayah KUSER_SHARED_DATA yang otentik di 0x7FFE0000 yang berarti bahwa berlalunya waktu 'dilihat' oleh VM tamu berkat pembaruan bidang SystemTime dan InterruptTime yang dipertahankan saat ini oleh tuan rumah. Mengisolasi wilayah ini akan membutuhkan pengatur waktu berkala untuk meniru memperbarui nilai ini.
Memetakan gambar Ntdll.dll otentik dan memanfaatkan panggilan sistem OS host untuk secara alami menjalankan sebagian besar proses pemuatan, menyediakan akses ke transisi INT 2E , SYSCALL dan INT 2C .
Selain itu, dari basis modularitas, Simpleator terdiri dari tiga binari:
Simpleator.exe yang mengimplementasikan monitor debug. Komponen ini bertanggung jawab untuk menampilkan UI untuk monitor, debug, dan mendaftar jendela, menampung pipa bernama yang memungkinkan emulator untuk berkomunikasi dengannya, dan memuat emulator dengan lingkungan yang tepat (hari ini, ini berarti pengaturan reservasi ruang alamat 256 GB, di masa depan, ini juga berarti Sandbox).Provider.dllEmulator.exe yang mengimplementasikan kode emulator yang dipercepat WHVP yang sebenarnya. Ini terutama bertanggung jawab untuk berkomunikasi dengan monitor debug di atas pipa, menangani kode transisi cincin untuk diajak bicara dan dari penyedia panggilan sistem, dan melakukan pengaturan ruang alamat awal dan pemuatan PE dari perpustakaan loader Ntdll.dll dan biner aplikasi target. Pertama, Anda harus menginstal platform Windows Hypervisor, yang juga mengharuskan Hyper-V diinstal dan diaktifkan. Anda dapat melakukannya dengan menggunakan baris perintah berikut:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
Atau dengan meluncurkan GUI seperti di bawah ini:
OptionalFeatures.exe
Dan kemudian memeriksa kotak centang "Hyper-V" dan "Windows Hypervisor Platform", seperti yang terlihat pada tangkapan layar di bawah ini.
Anda harus memiliki hak administratif untuk penggunaan perintah ini.
Jelas, pastikan bahwa perangkat keras Anda mendukung teknologi virtualisasi perangkat keras (seperti Intel VT-X).
Jika Anda ingin tahu lebih banyak tentang penelitian atau pekerjaan saya, saya mengundang Anda memeriksa blog saya di http://www.alex-sionescu.com serta perusahaan pelatihan & konsultasi saya, Winsider-Seminars & Solutions Inc., di http://www.windows-internals.com.
TBD TBD
Simpleator dirancang untuk meminimalkan ukuran dan kompleksitas kode - ini memang datang dengan biaya ketahanan dan yang paling penting, keamanan. Misalnya, dalam implementasi saat ini, NtCreateFile , NtOpenFile dan NtWriteFile sepenuhnya diteruskan ke kernel OS host, yang berarti bahwa muatan 'jahat' dapat menimpa file apa pun pada disk yang memiliki proses emulator host, karena tidak ada kotak pasir tambahan di sekitar host.
Selain itu, perhatikan bahwa hanya jumlah minimum yang ketat dari panggilan sistem yang diimplementasikan untuk mendapatkan aplikasi Testapp.exe untuk meluncurkan, mencetak teksnya, dan keluar. Menjalankan aplikasi yang lebih kompleks seperti Cmd.exe akan membutuhkan lebih banyak pekerjaan, terutama karena API tertentu mengharapkan koneksi ke CSRSS akan dibuat melalui LPC dan untuk data tertentu akan dikembalikan kembali. Saat ini, Simpleator berpura-pura bahwa itu adalah proses yang dilindungi VTL-1 yang aman, yang membatasi secara signifikan apa yang beberapa API tamu coba lakukan, dan oleh karena itu, panggilan tertentu secara langsung (seperti, misalnya, beberapa dari mereka di sekitar lokal).
Emulasi yang lebih kompleks dan modifikasi ruang alamat tamu akan diperlukan untuk membuka blokir penggunaan API tersebut.
Simpleator tidak melakukan banyak pemeriksaan kesalahan, validasi, dan penanganan pengecualian. Ini bukan perangkat lunak yang kuat yang dirancang untuk penggunaan produksi, melainkan basis kode referensi .
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.