
Posting ini adalah versi teks dari
ceramah saya di Kongres Komputer ke-35 di akhir tahun 2018.
Jadi saya harus mengakui bahwa MS-DOS sedikit marah, meskipun fakta bahwa malware MS-DOS selalu membuat saya terpesona sampai batas tertentu, tetapi pertama-tama kita harus bertanya: "Apa itu DOS?"
- DOS adalah salah satu versi CP / M, sistem operasi lain yang sangat tua.
- Keluarga DOS mencakup berbagai pemasok, hanya karena itu DOS tidak berarti bahwa itu akan berjalan pada CPU 8086 atau lebih baik
- Beberapa penyedia DOS ini memiliki kompatibilitas API, yang berarti bahwa beberapa dari mereka menggunakan malware!
Video kinerja:
Posting ini ditulis dengan dukungan Perangkat Lunak EDISON, yang mengembangkan aplikasi untuk operator seluler virtual dan terlibat dalam pengembangan dan pemeliharaan situs-situs dengan Python .

Tetapi pada kenyataannya, sebagian besar ingatan kita tentang era DOS adalah estetika dari bagaimana komputer pada waktu itu terlihat:

Ini adalah era "komputasi beige" dan keyboard Model M, yang bisa terkenal atau terkenal tergantung pada apakah Anda suka keyboard yang berisik atau tidak.

Beberapa dari kita mungkin memiliki kenangan menggunakan DOS, dan beberapa mungkin masih menggunakan DOS!

Misalnya, George R. Martin, yang menulis The Game of Thrones, dikabarkan telah menggunakan Wordstar dalam DOS untuk menulis buku!

Kami juga tidak dapat melewatkan QBASIC, karena banyak yang akan menjadi kenalan pertama mereka dengan pemrograman!

Tetapi terkadang hidup menggunakan DOS tidak begitu baik, kadang-kadang Anda menggunakan DOS, dan hal-hal seperti itu tiba-tiba terjadi. Dalam contoh ini, melodi kecil dimainkan selama pencetakan, jadi ini bisa menjadi situasi yang sangat canggung di lingkungan kantor.

Beberapa dari mereka lebih "imut", dalam hal ini, misalnya, ambulan yang ditarik oleh simbol ascii lewat, dan kemudian program yang ingin Anda buka memulai, dalam kasus terburuk, dengan sedikit ketidaknyamanan.
Berkat sekelompok pengarsip malware yang menggunakan nama VX Heavens, kami memiliki arsip malware DOS historis yang baik, atau setidaknya sampai polisi Ukraina menggerebek situs tersebut:
Pada hari Jumat, 23 Maret, server ditangkap oleh polisi sehubungan dengan investigasi kriminal (pasal 361-1 KUHP Ukraina - menciptakan malware untuk tujuan menjual atau mendistribusikannya) berdasarkan permintaan seseorang. tentang "menempatkan dalam perangkat lunak berbahaya akses gratis yang dirancang untuk meretas komputer, sistem otomatis, dan jaringan komputer tanpa izin".
Untungnya, situs torrent populer masih memiliki salinan basis data situs yang dapat memberi kami dataset yang sangat baik:
$ tar -tvf viruses-20070914.tar | wc -l 66714 $ ls -alh viruses-20070914.tar 6.6G viruses-20070914.tar
Namun, untuk mulai mempelajari sampel-sampel ini, kita perlu terlebih dahulu memahami aliran distribusi tipikal dari sampel-sampel ini, mengingat bahwa program-program ini bekerja di era pra-Internet:

Setelah Anda menerima file yang terinfeksi pada sistem Anda dan menjalankannya, program jahat akan secara aktif mencari atau menginstal interseptor panggilan sistem untuk program yang Anda jalankan. Dia sering melakukan ini dengan cara yang halus dan tidak terlihat untuk menghindari deteksi. Pentingnya kehalusan adalah penting karena untuk mendistribusikan program jahat ini Anda harus mentransfernya ke sistem lain menggunakan media (floppy disk) atau mengunduhnya ke titik distribusi lain, seperti BBS.

Saat runtime, malware memiliki dua opsi; itu bisa tetap tersembunyi dan menginfeksi file baru, atau menampilkan muatan.
Beberapa muatan cukup cantik! Contoh di bawah ini menggunakan fungsi yang tidak biasa, seperti 256 warna:

Atau yang ini bermain dengan penyangga layar Anda:


Namun, sebagian besar, malware akan tetap diam dan mencoba mencari file untuk infeksi. Infeksi sebagian besar file sangat sederhana, misalnya, jika Anda melihat file COM sebagai rekaman panjang kode mesin:

Kemudian "yang harus Anda lakukan" adalah memasukkan JMP di awal program dan menambahkan data ke akhir program. Akan terlihat seperti ini:

Beberapa kode lebih pintar dan menemukan "ruang kosong" dalam file biner dan menulis sendiri di sana, yang mencegah file biner dari peningkatan ukuran, yang, mungkin, berarti antivirus dapat menggunakan bendera merah.

Namun, sebelumnya, saya juga menyebutkan panggilan sistem intersepsi. Terlepas dari kenyataan bahwa runtime MS-DOS sangat sederhana dan praktis tidak terlindungi (Anda dapat dengan mudah memuat Linux dari file COM). Itu masih berisi API lengkap sehingga aplikasi tidak perlu memiliki implementasi sistem file sendiri. Berikut adalah beberapa fitur syscalls:

Mereka bekerja dengan menyebabkan gangguan perangkat lunak, di mana program meminta prosesor untuk pindah ke bagian lain dari memori sistem untuk memproses sesuatu:

Namun, MS-DOS juga menawarkan kemampuan untuk menambah / memodifikasi panggilan ini (menggunakan panggilan lain), memungkinkan Anda untuk memperluas sistem sehingga driver baru dapat memuat pada saat dijalankan. Namun, ini juga merupakan tempat yang ideal untuk menambahkan intersepsi malware:

Itu adalah trik yang digunakan dengan baik, karena Anda dapat mencegat panggilan "Buka File" dan kemudian menggunakannya untuk mendeteksi file yang dapat dieksekusi baru dalam sistem ... dan menginfeksi mereka.
Sebagai contoh singkat bagaimana mereka digunakan, mari kita lihat program Hello World yang sederhana:

Seperti yang bisa kita lihat, ada dua panggilan bertipe
int
. Kami menggunakan
21h
(h = hex) sebagai nomor panggilan sistem utama, dan kami dapat menentukan tindakan apa yang kami inginkan untuk dilakukan MS-DOS berdasarkan nilai
Ah

Dalam hal ini, program membuat panggilan untuk mencetak saluran, dan kemudian keluar dengan kode pengembalian 0 (tidak ditentukan).
Seperti yang disebutkan sebelumnya. Ketika Anda memanggil int 21h, prosesor pusat akan melihat di tabel IVT ke mana harus pergi, di dalam handler ini sering ada segmen seperti router yang merutekan berbagai panggilan utama, dalam kasus Int 21h mengarahkan ke berbagai fungsi berdasarkan nilai ah. Segera setelah kami sampai di tempat itu, penangan panggilan yang sebenarnya akan menangani tugas tersebut, maka dia akan menjalankan iret untuk kembali ke program utama, sering meninggalkan register hasil panggilan:

Jadi Jika kita ingin melihat semua panggilan sistem ketika program dimulai, kita dapat mengatur breakpoint di awal interrupt handler dan memeriksa apa ah:

Kami melakukan ini karena interrupt handler selalu berada di tempat yang tetap di MS-DOS (ini jauh lebih awal dari era ASLR dan Kernel ASLR), dan lokasi program tidak.

Begitu kita meluncurkannya, kita bisa melihat tantangan yang dibuat oleh pola ini. Sementara kita bisa melihat di layar bahwa dia baru saja mencetak pemberitahuan tentang file Kambing (Kambing adalah file yang dirancang untuk menginfeksi, seperti kambing kurban). Kami juga melihat bahwa program ini melakukan lebih dari sekedar mencetak garis. Ia memeriksa versi DOS (mungkin untuk memeriksa kompatibilitasnya) dan kemudian membuka, membaca dan menulis data!

Ini menarik! Tetapi kami ingin tahu lebih banyak tentang apa yang panggilan sistem disorot dengan warna merah, karena mereka harus memiliki input untuk hal-hal seperti nama file dan data untuk ditulis ke file / output ke layar.
Untuk melakukan ini, kita perlu melihat register lain selama panggilan sys:

Menggunakan "Print String" sebagai contoh sederhana, kita dapat melihat seperti apa tampilannya:

Apa itu DS: DX? Mengapa ada dua register di sini, dan bagaimana kita mendapatkan data dari mereka?
Untuk melakukan ini, kita perlu memahami sedikit tentang prosesor 8086.

Prosesor 8086 adalah CPU 16-bit, tetapi dengan pengalamatan memori 20-bit. Ini berarti bahwa prosesor hanya dapat menyimpan nilai yang mengindikasikan 64 KB, ini merupakan masalah ketika kapasitas memori hingga 1 MB.
Untuk menyiasatinya, kita perlu memahami register segmentasi:

Prosesor 8086 memiliki 4 register segmentasi yang perlu kita tangani:
- Segmen kode - CS
- DS - segmen data
- Segmen SS - stack
- ES - segmen tambahan (jika Anda membutuhkan satu lagi untuk mengatasi situasi yang berbeda)
Ada sejumlah register tujuan umum lainnya yang menyelamatkan Anda dari penggunaan memori yang berlebihan dan memungkinkan Anda meneruskan parameter ke fungsi lain.
Segmentasi mendaftarkan pekerjaan dengan mengubah blok dalam RAM:

Ini memungkinkan 16-bit CPU untuk melihat semua 20 bit RAM, memastikan bahwa untuk setiap nilai DS blok diimbangi oleh 16 byte.

Dalam hal ini, panggilan DS digunakan sebagai penunjuk di dalam jendela 16-bit mengenai di mana awal baris. Kemudian printer baris akan memindai sampai menemukan karakter $, dan kemudian berhenti. Ini mirip dengan sistem lain yang menggunakan byte nol, bukan $.

Dengan usia ISA x86, sedikit yang berubah, bukannya fakta bahwa ukuran bit prosesor telah meningkat, register yang sama telah menjadi lebih luas.
Jadi, dengan pengetahuan ini, kita dapat membuat daftar "tugas" untuk melacak program-program ini:

Dengan pengaturan ini, kita dapat melempar beberapa komputer besar ke masalah selama beberapa jam dan mengumpulkan hasilnya!

Dan kita mendapatkan ...

Tidak ada yang seperti itu.
Ini mengecewakan.
Kami membakar setidaknya hamster dengan kekuatan dan hampir tidak ada aktivasi keren!
(Xs cara menerjemahkan ini)
Jika kita melihat beberapa sampel, kita akan melihat pistol merokok di sini. Sepotong sampel yang layak memeriksa tanggal atau waktu.
Jika kita melihat dokumentasi untuk panggilan ini, kita akan melihat bahwa panggilan sistem mengembalikan nilai dalam bentuk register untuk program:

Jadi kita bisa dengan kasar memaksa mereka! Yang perlu kita lakukan adalah sesuatu seperti ini:

Tetapi ada satu masalah dengan metode ini.

Langkah pengujian contoh ini memakan waktu sekitar 15 detik, karena menggunakan proses emulasi qemu penuh, dan mungkin butuh hingga 15 detik untuk sepenuhnya menjalankan program di mesin virtual. Karena DOS tidak memiliki fitur hemat daya, ini berarti bahwa ketika DOS dalam mode siaga, ia dalam
siklus sibukJadi kita dapat melihat masalah ini secara berbeda dengan melihat kode apa yang akan dieksekusi setelah permintaan tanggal / waktu.
Karena pelacak kami ada di interrupt handler, kami tidak tahu dari kotak di mana program berada:

Untuk melakukan ini, kita perlu melihat tumpukan di mana register CS dan IP menunggu kita!

Segera setelah kami mengambil dua register ini dari tumpukan, kami dapat menggunakannya untuk mendapatkan kode kembali sehingga daftar periksa kami terlihat seperti ini:

Setelah kita melakukan ini dan berulang kali menguji dataset, kita akan melihat seperti apa bagian dari kode pengembalian!

Berikut adalah contohnya. Di sini kita melihat bahwa perbandingan dibuat untuk DL dan 0x1e.

Jika kita melihat dokumentasi kita, kita akan melihat bahwa DL adalah hari dalam sebulan, yaitu, kita dapat menganalisis tiga kode operasi teratas sebagai berikut:

Kita bisa melihat secara manual semua ini, tetapi ada banyak dari sampel ini yang memeriksa waktu, sekitar 4700:

Jadi alih-alih kita perlu melakukan sesuatu yang lain. Kita perlu menulis sesuatu ... Kita perlu menulis ...

Emulator x86 terburuk di dunia, disebut BenX86, adalah emulator yang dirancang khusus untuk kebutuhan kita, dan tidak lebih dari itu:

Tetapi ia memiliki beberapa kelebihan dalam kecepatannya.


Kami menambahkan 10.000 tes eksekusi berbeda berdasarkan jalur yang kami temukan menggunakan brute force menggunakan BenX86. Jadi, saya akan mengakhiri dengan beberapa penemuan favorit saya yang diaktifkan waktu:

Pola ini aktif pada Hari Tahun Baru dan menutup sistem Anda setelah salam ditampilkan. Ini bisa baik jika Anda terjebak di kantor untuk tahun baru, atau bisa buruk jika Anda benar-benar perlu melakukan sesuatu pada Hari Tahun Baru.

Contoh ini sangat mengejutkan saya. Ini diaktifkan pada awal 1995 dan memberi tahu pengguna tentang semua file yang terinfeksi itu terinfeksi, dan kemudian menghapus virus (menghapus transisi di awal) dan kemudian tidak melakukan hal lain. Meskipun untuk beberapa alasan dikatakan Anda harus membeli McAfee, pesan ini jelas tidak ketinggalan zaman.

Ini, terus terang, benar-benar membingungkan saya, pada 8 November setiap tahun, itu akan mengubah semua 0s dalam sistem menjadi mesin terbang kecil "benci". Itu benar-benar mengganggu saya jika Anda tahu mengapa Anda membutuhkannya, beri tahu saya ...

Ini mungkin mimpi buruk saya ketika, setelah memulai program apa pun, ini menampilkan pesan bahwa dia tidak dapat memakan drive utama Anda. Akan sangat mengganggu untuk melihat tiba-tiba.

Sebagai kesimpulan, kami memiliki apa itu malware malware versi DOS Seal Copypasta. Saya tidak yakin penulis ini tidak menyukai Aladdin, tetapi apa pun yang Anda lakukan, Anda adalah seseorang.
Jika Anda tertarik dengan kode yang berjalan di artikel ini, saya
merilis toolkit saya di github , tanpa jaminan apa pun. Jika Anda ingin membuat kode ini sendiri, Anda perlu bekerja untuk memastikan bahwa kode itu berfungsi dengan instalasi MS-DOS Anda (memperbaiki breakpoint handler)
Namun, jika Anda hanya melihat untuk melihat apa yang saya lihat saat melihat proyek ini, saya telah mengarsipkan antarmuka web di sini:
dosv.benjojo.co.ukSampai ketemu lagi!