Halo semuanya! Sehubungan dengan peluncuran kursus "Teknik Reverse", kami mengadakan pelajaran terbuka yang direncanakan. Ini membongkar algoritma operasi bootkit pada berbagai tahap pemuatannya.
Dosen -
Arthur Pakulov , analis virus di Kaspersky Lab.
Artikel berikut ini merupakan pengantar dan merupakan versi teks dari hanya sebagian dari pelajaran, yang dikhususkan untuk installer bootkit. Analisis terperinci atas bootkit itu sendiri, lihat videonya. Bootkit adalah program jahat yang memodifikasi Master Boot Record, sektor pertama dari disk fisik atau sektor boot, VBR. Program semacam ini, pada dasarnya, memiliki fungsi Trojan dan digunakan untuk melakukan tindakan tersembunyi apa pun dalam sistem. Dalam contoh kami, bootkit melakukan peningkatan privilege ke tingkat proses, yang namanya dimulai dengan urutan huruf: "inte". Bahkan, bootkit adalah rootkit yang mulai bekerja di cincin perlindungan 0, yang dimulai bahkan sebelum sistem operasi mulai memuat. Karena inilah dia sangat tertarik untuk penelitian.
Untuk mengembangkan program seperti itu, keterampilan reverse engineering yang biasa tidak cukup. Tidak cukup hanya dengan bisa membaca daftar, Anda juga perlu memahami hal-hal seperti arsitektur prosesor, pengalamatan memori, dll. Kami melihat tempat-tempat utama dari bootkit dalam pelajaran terbuka.
Untuk pekerjaan, contoh bootkit-xp.exe khusus disiapkan, bekerja di bawah Windows XP. Oleh karena itu, selain mempelajari bootkit, kami sedikit nostalgia untuk sistem operasi ini. Tetapi secara umum, OS XP dipilih untuk membuatnya lebih mudah untuk dibalik, karena XP adalah visualisasi yang baik dan tidak adanya komplikasi yang tidak perlu. Nah, sampel ditulis khusus untuk OS ini, dilihat dari kodenya.
Beginilah
bentuk penginstal bootkit :

Hanya dengan melihatnya, Anda bisa menarik kesimpulan tertentu. Sebagai contoh, segera terbukti bahwa file ini memiliki bobot yang kecil. Jika Anda melihat titik entri, Anda dapat melihat bahwa kode tersebut menerima deskriptor file dengan nama tautan simbolis ke disk fisik pertama - "PhysicalDrive0":

Selanjutnya, untuk kenyamanan persepsi kode, kami
beralih ke IDA . Menjadi jelas bahwa untuk trojan khas, fungsionalitas yang tersedia cukup kecil. Bahkan tabel impor mencurigakan kecil:

Gambaran seperti itu biasanya muncul ketika menganalisis sampel yang dikemas. Tapi, dalam kasus kami, file tersebut tidak terlihat penuh. Ternyata sampel tersebut ditutupi oleh beberapa pelindung / cryptor dan dalam proses kerjanya menerima alamat fungsi secara dinamis, setelah itu disebut fungsional yang diinginkan, atau semuanya baik-baik saja, dan sampel seperti apa adanya.
Kami terus menjelajahi kodenya.

Seperti yang kita lihat di HIEW, fungsi
CreateFileA dipanggil dengan argumen yang menarik sebagai parameter pertama. Apa sebenarnya yang dilakukan di sini? Di sini tepat untuk mengingat hal-hal seperti
objek kernel . Mereka tidak dapat dimanipulasi secara langsung dari mode pengguna, mereka dikendalikan oleh kernel sistem operasi. Dari mode pengguna, sebuah program hanya dapat membuat permintaan untuk menerima / mengubah status objek kernel apa pun. Untuk menunjukkan ke sistem dengan objek kernel tertentu mana program akan bekerja, diperlukan untuk menangani objek kernel yang diperlukan. Atas permintaan tanda terima, jika semua cek lulus, OS akan mengembalikan
gagang OA yang diminta kepada kami. Dan sudah menggunakan pegangan, kita bisa bekerja dengan OA terkait.
Jadi, pada gambar di atas, menggunakan CreateFile, tautan simbolik diakses ke hard disk fisik pertama yang terhubung. Jika akses diberikan, maka Anda dapat bekerja dengan "file" seperti dengan file sederhana lainnya. Artinya, seluruh hard disk akan disajikan sebagai satu file besar.
Jadi, mari kita lanjutkan. Handle sudah kembali, dan kami menemukan diri kami di sini:

Apa yang terjadi selanjutnya? Dan kemudian fungsi
ReadFile membaca 0x200 byte pertama. Dan kami memiliki sektor pertama dari disk fisik pertama.

Seperti yang mungkin sudah Anda duga, ini adalah
Master Boot Record (MBR). MBR terdiri dari 3 bagian: bagian kode, tabel partisi dan tanda tangan. Dalam situasi normal, bios membaca MBR ke memori di alamat 0: 0x7c00h, melewati kontrol ke sana. Jadi, bagian kode MBR mulai dijalankan. Selama eksekusi, ia mem-parsing tabel partisi, menemukan sektor boot dan memuatnya. Dalam hal bootkit, jika MBR ditimpa, kodenya sekarang akan menerima kontrol.
Oke, MBR sudah dibaca, dan
selanjutnya apa ? Dan kemudian bootkit membuka PhysicalDrive0 lagi, tetapi dengan mode akses tulis.

Selanjutnya, sebuah pointer diatur pada offset ke-600. Artinya,
sektor asli dibaca dan disalin ke sektor ketiga .
Mengapa mencadangkan suatu sektor? Jelas, ini perlu untuk fakta bahwa itu akan dibutuhkan di masa depan.
Kemudian siklus dimulai. Tentu saja, melihat kode, orang tidak bisa tidak memperhatikan konstanta seperti var_1C,
1BEh dan lainnya. Dan, pada saat yang sama, struktur MBR yang terletak di atas harus di-refresh dalam memori. Secara khusus, kami tertarik pada kolom "Offset".

Lihat, buffer baca dari sektor pertama ada di
lpBuffer . Kemudian
1BEh ditambahkan ke dalamnya, bahkan pointernya menuju ke awal tabel partisi. Semua data dari tabel hingga akhir sektor dimasukkan ke dalam
_marked_bytes , mulai dari offset yang sama - 1BE.

Yaitu, bagian kedua dan ketiga dari MBR asli dimasukkan ke
_marked_bytes .
Apa yang terjadi selanjutnya? Dan
kemudian SetFilePointer menetapkan pointer ke awal "file" kami, yaitu, ke MBR.

Lalu ada tulisan (WriteFile) membentuk
_marked_bytes dan membebaskan memori. Mengenai hal ini, fungsionalitas penginstal bootkit berakhir.
Tapi alangkah baiknya untuk
melihat apa yang sebenarnya ada di bagian pertama dari
_marked_bytes . Untuk melakukan ini, buang ke disk dan analisis. Hal pertama yang menarik perhatian Anda adalah penurunan 2 dari isi variabel pada 0x413.

Jika Anda melihat dokumentasi teknis, Anda dapat menemukan bahwa variabel pada 0X413 berisi jumlah memori fisik yang dipasang dalam kilobyte. Karenanya, kode bootkit "memotong" dua kilobyte memori:

Sekarang, agar tidak dilakukan lebih lanjut, itu akan dianggap bahwa ada 2 kilobyte memori kurang dari itu. Kenapa - belum jelas.
Selanjutnya, alamat fisik dihitung ke bagian "bit off" dari memori menggunakan shift kiri bitwise 6 bit:

Pergeseran 6 melakukan dua tindakan sekaligus - mengubah kilobyte menjadi byte (mengalikan nilai variabel dengan 2 ^ 10), dengan demikian memperoleh alamat fisik potongan memori yang digigit, dan mengekstraksi nomor segmen darinya, membagi hasilnya dengan 0x10 (2 ^ 4).
Setelah itu, tubuh Anda akan disalin ke bagian memori ini, dan, karena kode bootkit ada di bagian "digigit",
tidak ada yang akan mengganggunya lebih lanjut . Selain itu, tidak ada gangguan tidak akan mengubah apa yang tertulis di area memori ini. Kita dapat mengatakan bahwa
kode tersebut menjadi hampir tidak terlihat oleh sistem , seolah-olah tidak ada memori di sana.
Ini baru permulaan dari bootkit. Kemudian akan ada interupsi intersepsi, pelacakan tanda tangan ntldr, modifikasi modul kernel OS, dll.
Karena itu, kami tidak akan merusaknya, lebih baik
tonton webinar sampai akhir agar tidak ketinggalan apa pun.