1 poin oleh GN⁺ 2025-05-13 | 1 komentar | Bagikan ke WhatsApp
  • defendnot, yang dibuat saat perjalanan ke Seoul, adalah alat yang mencoba menonaktifkan Windows Defender dengan memanggil langsung API layanan Windows Security Center (WSC), dan berujung pada beberapa hari reverse engineering
  • Alat sebelumnya, no-defender, menggunakan kode antivirus yang sudah ada untuk mendaftarkan bahwa ada antivirus lain di WSC; setelah meraih sekitar 1,5 ribu star GitHub, alat itu dihapus karena permintaan DMCA dari pengembang antivirus
  • Awalnya, pemanggilan COM API WSC berhasil direproduksi dalam sekitar 1 jam, tetapi WSC memverifikasi proses pemanggil sehingga akses dari proses biasa ditolak
  • Dari hasil analisis, WSC memeriksa WinDefend SID, hak administrator, tanda tangan, serta flag ForceIntegrity pada DllCharacteristics PE, dan implementasi akhirnya menggunakan Taskmgr.exe
  • Implementasi diselesaikan sambil memperbaiki error path ctx.bin dan masalah kondisi daya autorun, dalam lingkungan yang melibatkan MacBook arm64, PC jarak jauh di AS, latensi Parsec 210 ms, hingga VM Shadow.tech

Latar belakang pembuatan defendnot

  • defendnot adalah alat yang menggunakan langsung API layanan Windows Security Center untuk menonaktifkan Windows Defender
  • Inti dari proses implementasinya bukan pada pemanggilan WSC itu sendiri, melainkan pada upaya melewati satu per satu kondisi verifikasi yang menghalanginya serta lingkungan kerja yang merepotkan
  • Dokumentasi teknis WSC yang lebih detail akan dipublikasikan nanti oleh orang lain

no-defender dan DMCA setahun lalu

  • no-defender, yang dirilis sekitar setahun lalu, menggunakan Windows API untuk antivirus guna mematikan Windows Defender
  • API ini digunakan untuk memberi tahu sistem bahwa “sudah ada antivirus lain, jadi pemeriksaan Defender tidak perlu dijalankan”
  • Komponen sistem yang mengelola area tersebut adalah Windows Security Center (WSC)
  • no-defender bekerja dengan memakai kode pihak ketiga dari antivirus yang sudah ada untuk memaksa antivirus tersebut terdaftar di WSC
  • Dalam beberapa minggu setelah dirilis, proyek itu mendapat sekitar 1,5k stars, lalu setelah pengembang antivirus yang kodenya digunakan mengajukan permintaan DMCA takedown, isi repositori dihapus dan proyeknya diakhiri

Analisis WSC dimulai lagi saat perjalanan ke Seoul

  • Saat menginap di Airbnb di Seoul, MrBruh melihat-lihat no-defender lalu mengirim pesan bahwa ia sedang meneliti apakah implementasi yang “bersih” tanpa binary antivirus memungkinkan
  • Biasanya untuk CTF atau pekerjaan reversing x86, penulis membawa laptop x86 terpisah, tetapi dalam perjalanan kali ini hanya membawa M4Pro MacBook
  • Meski kondisinya kurang menguntungkan karena tidak ada perangkat x86 untuk reversing, analisis WSC dimulai dengan memanfaatkan waktu sebelum teman-teman bangun

Hari 1: Mereproduksi COM API WSC dan penolakan akses pertama

  • MrBruh menyediakan binary WSC terbaru, dan implementasi pendaftaran WSC dari antivirus yang sebelumnya digunakan dijadikan implementasi referensi
  • Di WSC ada COM API yang digunakan antivirus, dan pemanggilan yang dilakukan antivirus lama berhasil direproduksi dalam sekitar 1 jam
  • Pengujian dilakukan dengan mem-boot Windows arm64 di Parallels, tetapi hasilnya adalah access denied
  • Berdasarkan pengalaman sebelumnya, diketahui bahwa WSC memverifikasi proses pemanggil API, dan pada awalnya verifikasi tanda tangan diduga sebagai kemungkinan penyebab
  • Setelah kode diinjeksikan ke proses yang digunakan antivirus lama untuk pekerjaan WSC, pemanggilan COM untuk pendaftaran antivirus baru dan pembaruan status berjalan normal

Upaya menghapus binary antivirus

  • Agar proyek baru tidak kembali dipermasalahkan oleh vendor antivirus lama, binary antivirus ingin diganti dengan binary yang disediakan sistem
  • Proses target pertama yang dipilih adalah cmd.exe, tetapi pemanggilan API WSC ditolak
  • Saat memeriksa wscsvc.dll, ditemukan kode yang memeriksa apakah proses pemanggil adalah PPL
  • Proses yang dibuat dengan CreateProcessA biasa bukan proses terlindungi PPL, dan pada dini hari itu pekerjaan tidak bisa dilanjutkan lebih jauh

Hari 2: Membangun lingkungan remote debugging yang merepotkan

  • Di MacBook arm64, Windows x86 sulit ditangani dengan baik, dan penulis ingin menghindari bekerja di lingkungan arm64 atau tidak bisa memakai x64dbg
  • Teman penulis, pindos, memberi akses ke PC, lalu koneksi jarak jauh dilakukan dengan Parsec
  • Karena koneksinya dari Korea ke PC di Amerika Serikat, latensi rata-ratanya sekitar 210 ms
  • Alur kerja saat itu sangat merepotkan
    • Membangun modul dengan MSVC di Windows arm64 pada Parallels
    • Membagikan hasil build ke host melalui folder bersama
    • Menyalin hasil build ke VM di PC pindos melalui AnyDesk
    • Men-debug layanan WSC di lingkungan Parsec dengan latensi 210 ms
  • Lingkungan ini begitu tidak nyaman sampai sangat menurunkan kecepatan pengembangan dan analisis

Debugging layanan WSC dan WinDefend SID

  • Layanan WSC adalah DLL yang dijalankan oleh svchost, dan faktor utama yang menghalangi pemasangan debugger adalah perlindungan PPL
  • Di VM, test mode diaktifkan, lalu digunakan driver yang menghapus PPL dari proses target dengan beberapa baris kode di kernel mode
  • Titik kegagalan saat cmd.exe meminta pendaftaran antivirus ke WSC adalah WscServiceUtils::CreateExternalBaseFromCaller
  • Fungsi tersebut menyamar sebagai RPC client, lalu memeriksa apakah token proses pemanggil memiliki SID WinDefend
  • Karena saat itu penulis belum begitu memahami cara kerja token Windows, ia menyimpulkan bahwa pemeriksaan bisa dilewati dengan menyamar sebagai WinDefend
  • Dalam kondisi kurang tidur, ia juga keliru menafsirkan bahwa binary antivirus lama lolos pemeriksaan IsMember ini

Percobaan menyamar sebagai WinDefend dan kegagalan

  • Setelah mempelajari token Windows selama beberapa jam, implementasi diarahkan pada menjalankan proses dengan token yang berisi WinDefend SID agar pemeriksaan WSC bisa dilewati
  • Kode dicoba dijalankan dengan WinDefend SID ditempelkan ke cmd, tetapi meski pemanggilan COM mengembalikan STATUS_SUCCESS, pendaftaran antivirus baru sebenarnya tidak terjadi
  • Pendekatan ini pada akhirnya tidak berguna, dan perlu diverifikasi ulang keesokan harinya

Hari 3: Merekonstruksi algoritme verifikasi yang sebenarnya

  • Setelah diperiksa lagi, binary antivirus lama ternyata tidak lolos pemeriksaan WinDefend SID
  • Jika pemeriksaan itu lolos, yang bisa ditangani adalah objek WSC milik Windows Defender, tetapi Defender tidak bisa langsung dinonaktifkan hanya dengan pemanggilan WSC, sehingga tidak berguna
  • Kode penyamaran WinDefend dihapus, lalu cabang lain pada conditional dianalisis
  • Pada cabang tersebut, hal-hal berikut diperiksa terhadap binary pemanggil
    • Apakah proses dalam status elevated
    • Apakah tanda tangan binary valid
    • Apakah ada flag tertentu pada DllCharacteristics PE
  • Flag DllCharacteristics yang diperiksa di CSecurityVerificationManager::CreateExternalBaseFromPESettings adalah ForceIntegrity
  • Kode yang mereproduksi pemeriksaan binary oleh WSC dibuat di folder wsc-binary-check pada repositori defendnot, lalu diuji terhadap binary System32

Penggunaan Taskmgr.exe dan bug ctx.bin

  • Karena teman penulis perlu memakai PC-nya lagi, koneksi Parsec dilakukan langsung ke VM, tetapi dengan tambahan software encoding, lingkungan menjadi semakin lambat
  • Taskmgr.exe digunakan menggantikan cmd.exe, tetapi error RPC masih terjadi
  • Karena latensi dan masalah input membuat debugging di VM yang sama menjadi sulit, atas rekomendasi, penulis membayar $30 untuk berlangganan shadow.tech
  • VM Shadow.tech memiliki versi Windows yang lebih lama, sehingga kode wscsvc tidak banyak di-inline ke satu fungsi seperti versi terbaru, dan hasil dekompilasinya juga lebih mudah dibaca
  • Penyebab error sebenarnya adalah nama AV yang diberikan ke WSC salah
    • defendnot-loader menggunakan ctx.bin, yang berisi parameter terserialisasi, untuk meneruskan data ke defendnot.dll
    • IPC untuk pelacakan status diimplementasikan terpisah, tetapi untuk pengiriman konfigurasi masih tersisa cara ctx.bin dari kode no-defender lama
    • Fungsi yang mencari path ctx.bin menjadikan folder dasar modul Taskmgr.exe, bukan nodefend.dll, sebagai acuan
    • Akibatnya, null byte dikirim sebagai nama AV, dan WSC menolak buffer tersebut
  • Setelah masalah path diperbaiki, pengujian berhasil

Perapian kode dan masalah autorun

  • Agar bisa selesai pada hari yang sama, perapian kode dan implementasi fitur tambahan dikerjakan hingga pukul 8 pagi
  • Fitur tambahan mencakup kemampuan untuk menambahkan dirinya sendiri ke autorun
  • Pada pukul 8 pagi, hanya autorun yang belum berjalan dengan benar; setelah mencoba berbagai cara dan gagal, penulis tidur
  • Saat diperiksa lagi keesokan harinya, penyebabnya adalah dua checkbox terkait daya saat membuat tugas Task Scheduler
  • Karena laptop tidak terhubung ke daya AC, tugas tidak dijalankan; setelah flag tersebut dimatikan, autorun berfungsi
  • Setelah itu, kode dirapikan beberapa jam lagi dan pekerjaan diselesaikan

Penutup

  • Pekerjaan itu sendiri menyenangkan, tetapi masalah lingkungan dan alur remote debugging yang berulang selama beberapa hari adalah pengalaman yang tidak ingin diulangi
  • Terutama MacBook arm64, VM x86 jarak jauh, latensi tinggi, encoding lambat, serta bug path file yang baru ketahuan belakangan sangat meningkatkan tingkat kesulitan implementasi
  • Dokumentasi WSC yang lebih teknis akan dipublikasikan secara terpisah nanti

1 komentar

 
GN⁺ 2025-05-13
Komentar Hacker News
  • Cara paling invasif tetapi efektif untuk mematikan Defender adalah boot dari live Linux USB, mengganti nama C:\ProgramData\Microsoft\Windows Defender, lalu membuat file kosong di lokasi tersebut

    • Group Policy masih bekerja sangat baik, jadi di homelab saya menaruh domain controller lokal dan membuatnya otomatis hanya mengubah kebijakan Defender untuk semua pengguna
    • Satu produk populer juga bekerja dengan cara yang hampir sama, lalu ikut menjatuhkan kira-kira 25% dari seluruh internet
    • Aneh bahwa Windows tidak mendeteksi perubahan seperti itu lewat manifes bertanda tangan
  • Sebagai referensi, WSC adalah singkatan dari Windows Security Center

  • Saya cukup bingung karena ungkapan the antivirus I was using. Saya tidak paham kenapa vendor antivirus itu punya alasan untuk mengirim permintaan takedown DMCA kepada penulis
    Mungkin maksudnya penulis merekayasa balik antivirus lain dan memasukkan sebagian darinya ke proyek open source. Tapi karena ada juga judul seperti Impersonating WinDefend, saya jadi penasaran apakah pada akhirnya penulis memang melanggar hukum hak cipta dengan cara tertentu

    • Sejauh yang saya pahami, ia memakai cangkang alat antivirus lain untuk mengakali persyaratan tanda tangan. Saya paham ini area abu-abu, dan menurut saya masih ada ruang untuk melihatnya sebagai penggunaan transformatif, tapi saya bukan ahli hukum
    • Benar. Ia melanggar hukum hak cipta dengan menyalin sebagian program antivirus yang sudah ada
      Tepat sebelum paragraf yang dikutip ada penjelasan bahwa “proyek ini menggunakan kode pihak ketiga dari antivirus yang sudah ada, dan memaksa antivirus itu terdaftar sebagai antivirus di WSC”
  • Kode ini terasa terkutuk:
    https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
    Kalau ingin tahu apa yang sebenarnya terjadi, lihat di sini:
    https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...

    • Ada yang jago sihir C++ bisa menjelaskan apa yang terjadi, dan kenapa disebut terkutuk?
    • Karena keterbatasan waktu, saya tidak ingin mengimplementasikan RAII sendiri untuk objek-objek terkait COM. Meski begitu, saya berencana mengubahnya di update berikutnya
    • Saya tidak tahu apa yang dianggap terkutuk. Signature di sisi pemanggil memang agak beda sesuai selera pribadi, tapi saya juga memakai pola ini di banyak tempat dalam kode saya
      Misalnya, bahasa D punya konsep statement yang dieksekusi di akhir scope sebagai fitur bawaan bahasa
    • “Kode adalah cara kita memperlakukan rekan kerja” - Michael Feather, https://x.com/mfeathers/status/1031176879577780224
      Ringkasnya, ini bukan ditulis AI. Kode ini menunda pemanggilan fungsi sampai objek keluar dari scope. Implementasinya memakai makro C untuk membuat sintaks yang lebih pendek dengan menghilangkan sebagian definisi lambda/fungsi anonim C yang diperlukan, serta membuat nama variabel unik untuk mengelola pemanggilan tertunda
      Namun sintaks hasilnya menghindari konvensi umum penulisan huruf besar yang biasanya menandai makro C, dan sekilas terlihat seperti pemanggilan fungsi pada pointer objek. Kalau tidak terbiasa dengan pola ini, atau berharap makro ditampilkan berbeda, ini bisa membingungkan
      Bagi sebagian orang, pola ini cukup umum dan berguna sehingga dalam konteks tertentu hampir bisa dianggap idiom. Penjelasan teknis di https://news.ycombinator.com/item?id=43959403#43960905 menguraikan cara kerja makronya dengan baik
  • Saat liburan, saya merekayasa balik virtual desktop Windows, dan itu membuat liburan saya jauh lebih menyenangkan. Kenangan terbaik tahun lalu adalah menyadari bahwa reverse engineering benar-benar menyenangkan
    Saya juga belajar banyak hal menarik; di bawah RPC Windows ada lapisan messaging yang tidak terdokumentasi: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....

  • Setiap kali melihat foto profil karakter anime, saya tahu tulisannya bakal bagus. Saya simpan untuk nanti kalau harus kembali ke lingkungan Windows yang kurang menyenangkan

  • Untuk yang penasaran: WSC adalah singkatan dari Windows Security Center. Saya juga harus mencarinya

    • Di dalam artikel tertulis, “bagian sistem yang mengelola kekacauan ini disebut Windows Security Center, disingkat WSC”
  • Kenapa ada yang ingin mematikan WSC?

    • Bisa jadi karena performa, bisa juga untuk pengembangan malware atau hacking
    • Kalau Anda penyerang, Anda bisa berharap pada situasi beruntung ketika tidak ada produk endpoint detection and response lain yang terpasang. Kalau ada, hampir pasti akan mencegatnya
      Kalau Anda vendor EDR, ini adalah pemanggilan API yang diobfuscate yang bisa dipakai untuk menekan atau menonaktifkan Windows Firewall. Misalnya, saya rasa CrowdStrike bisa memakai Windows Firewall atau memakai implementasi sendiri
    • Ini hardware saya, jadi saya hanya melakukan apa yang ingin saya lakukan
    • Semua software antivirus setidaknya adalah powervirus. Saya tidak mau diperlakukan seperti anak kecil oleh sesuatu yang bilang netcat.exe tidak boleh
    • Karena tidak ada alasan untuk sengaja menanam rootkit pada diri sendiri
  • Baru-baru ini saya membaca https://nostarch.com/windows-security-internals, dan artikel ini membuatnya jauh lebih terasa relevan
    Saya sudah sedikit tahu kira-kira bagaimana mekanisme backend seperti ini berjalan di Windows, tapi waktunya pas. Bab terakhir buku itu juga membahas token dan SID dengan cukup mendalam, mirip dengan yang dibahas penulis artikel ini