Selamat siang, para pembaca yang budiman.
Registri adalah salah satu sistem Windows yang paling terlihat dan signifikan. Hampir tidak ada orang yang belum pernah mendengarnya. Setelah pemrograman di Windows selama sekitar 20 tahun, saya pikir saya tahu segalanya tentang dia. Tetapi dari waktu ke waktu, sesuatu yang baru muncul yang menunjukkan betapa salahnya saya. Karena itu, hari ini saya ingin memberi tahu Anda tentang cara-cara tidak biasa bekerja dengan registri yang saya temui saat meneliti rootkit dan yang mengejutkan saya.
Kisah pertama. Nama nilai dan kunci registri
Kita semua tahu bahwa di Windows ada beberapa aturan untuk penamaan objek, apakah itu file, direktori, atau kunci registri. Nama file tidak boleh mengandung karakter "\". Nama tidak boleh kosong. Nama memiliki batasan panjang, dll.
Secara tidak sengaja kami memperluas pembatasan ini untuk semua sistem Windows dan mengamatinya ketika bekerja dengan registri. Dan di sinilah letak kesalahan kita. Ada beberapa batasan mengejutkan pada registri saat membuat nama. Misalnya, atas nama nilai, Anda dapat menggunakan karakter "\"
Terkejut? Tidak Lalu apa yang akan Anda katakan jika saya menunjukkan kepada Anda bahwa simbol "\ 0" dapat digunakan atas nama suatu nilai? Ya, ya, persis karakter nol. Salah satu yang secara tradisional digunakan untuk menunjukkan akhir suatu garis.
Untuk ini, kita memerlukan fungsi NtSetValueKey yang diekspor dari ntdll.dll
HKEY hKey = 0; RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey); UNICODE_STRING uName; uName.Buffer = L"Test\0Zero"; uName.MaxLen = uName.Length = 9 * sizeof(wchar_t); NTSTATUS status = 0; status = NtSetValueKey( hKey, &uName, 0, REG_SZ, (void*)lpData, DataSize); RegCloseKey(hKey);
Untuk menjalankan fungsi NtSetValueKey, Anda memerlukan hak administrator. Akibatnya, nilai dengan nama Test \ 0Zero akan muncul di registri Anda.
Beberapa pengembang Microsoft juga akan terkejut, karena editor registri standar tidak dapat menampilkan nilai registri yang tidak biasa.
Cerita kedua
Kisah kedua yang akan saya ceritakan hari ini terjadi pada tahun 2013.
Pada awalnya penyimpangan kecil. Di Kaspersky Lab, saya adalah anggota tim yang, antara lain, menciptakan Kaspersky Rescue Disk. Untuk menyembuhkan Windows dari Linux, kita perlu mem-parsing sendiri file registri. Dan untuk memeriksa operasi yang benar dari mekanisme ini, kami menggunakan banyak tes. Di antara mereka, ada satu yang cukup sederhana:
- Di bawah Windows, kami menulis nilai tes di registri.
- Salin file kumpulan registri ke direktori tes.
- Kami memulai program yang melakukan penghapusan nilai tes.
- Kami memuat semak yang dimodifikasi dalam registri untuk memverifikasi penghapusan.
Dan suatu hari, kami memperbarui bangku tes Windows ke versi 8.1, dan tes berhenti menghapus nilai tes. Betapa begitu, saya terkejut. Saya menyalin file dengan kumpulan registri ke komputer saya yang berfungsi - tidak ada nilai! Pikiran pertama saya: Saya perlu menambahkan kunci yang diubah ke tes Flush. Menambahkan panggilan ke RegFlushKey, memulai kembali tes - tidak ada nilai!
Apakah RegFlushKey tidak berfungsi, saya pikir. Tetapi, ternyata, saya hanya sebagian yang benar.
Kuncinya adalah bahwa di Windows 8.1, Microsoft mengubah mekanisme untuk menyimpan perubahan ke registri. Sebelumnya, semua perubahan registri diakumulasi dalam memori, dan kemudian, ketika kunci ditutup, ketika RegFlushKey dieksekusi atau setelah beberapa waktu sistem menyimpan perubahan ke file kumpulan registri. Di Windows 8.1, perubahan bukan file bush registri disimpan dalam file dengan nama yang sama dengan ekstensi .LOG, .LOG1 dan .LOG2, dan kode saya mengabaikan file-file ini pada masa itu.
Dalam file-file ini, perubahan menumpuk selama sekitar satu jam. Dan hanya setelah itu, Windows memulai tugas mengintegrasikan perubahan ke file utama. Tugas ini disebut Rekonsiliasi, dan dimulai setiap 40 menit, atau ketika Windows dimatikan. Memanggil fungsi RegFlushKey tidak memicu tugas Rekonsiliasi. Untuk memaksa memulai tugas integrasi perubahan, Anda perlu memanggil ZwSetSystemInformation dengan argumen tidak berdokumen SystemRegistryReconciliationInformation.
ZwSetSystemInformation( 0x9b,
Untuk menjalankan fungsi ZwSetSystemInformation, Anda memerlukan hak administrator. Dan arsitektur file yang dapat dieksekusi harus cocok dengan arsitektur sistem. Memanggil fungsi ini dari program 32-bit pada Windows 64-bit akan gagal.
Cerita ketiga
Beberapa waktu yang lalu, kami menemukan rootkit yang mengatur peluncuran drivernya di registri. Produk kami menghapus kunci registri yang sesuai, tetapi setelah reboot kunci berada di tempatnya. Sepertinya dia meletakkan fungsi callback pada perubahan registri dan mengembalikan kuncinya setelah perubahan kami, saya pikir. Tapi ternyata tidak. Lebih tepatnya, ya. Rootkit mengatur fungsi-fungsi Callback, tetapi tidak ada hubungannya dengan tugas pemulihan kunci. Semuanya dibuat lebih sederhana dan lebih elegan.
Driver rootkit, saat startup, berganti nama menjadi file sarang registri SISTEM menjadi HARDWARE. Saya membuat file SISTEM saya dan secara berkala menyimpan cabang HKLM / Sistem ke sana menggunakan fungsi RegSaveKey. Saat menyimpan, dia mengembalikan kuncinya. Saat memulai ulang Windows, sistem memuat file SYSTEM dan meluncurkan driver rootkit. Apakah itu indah Bagus
Dicari
PS Di sini kami mencari
pengembang-peneliti dalam tim yang menggergaji mesin anti-spam, dan kami juga membutuhkan
insinyur pengujian .