1 puan yazan GN⁺ 2025-05-13 | 1 yorum | WhatsApp'ta paylaş
  • Seul seyahati sırasında yapılan defendnot, Windows Security Center (WSC) servis API’sini doğrudan çağırarak Windows Defender’ı devre dışı bırakmayı amaçlayan bir araçtı ve bu çalışma birkaç günlük bir tersine mühendislik sürecine dönüştü
  • Önceki araç no-defender, mevcut antivirüs kodunu kullanarak WSC’ye başka bir antivirüs varmış gibi kayıt yaptırıyordu; yaklaşık 1.5k GitHub yıldızına ulaştıktan sonra bir antivirüs üreticisinin DMCA talebiyle kaldırıldı
  • İlk etapta WSC’nin COM API çağrıları yaklaşık 1 saat içinde yeniden üretildi, ancak WSC çağrıyı yapan süreci doğruladığı için normal süreçlerde erişim reddedildi
  • Analiz sonucunda WSC’nin WinDefend SID, yönetici yetkisi, imza ve PE içindeki DllCharacteristics alanında yer alan ForceIntegrity bayrağını kontrol ettiği görüldü; nihai uygulamada Taskmgr.exe kullanıldı
  • arm64 MacBook, ABD’deki uzak PC, Parsec’te 210 ms gecikme ve Shadow.tech VM’in iç içe geçtiği bir ortamda ctx.bin yol hatası ile autorun güç koşulu sorunları düzeltilerek uygulama tamamlandı

defendnot’u yapmaya götüren arka plan

  • defendnot, Windows Security Center servis API’sini doğrudan kullanarak Windows Defender’ı devre dışı bırakan bir araçtır
  • Uygulama sürecinin asıl zorluğu WSC çağrısının kendisinden çok, bunu engelleyen doğrulama koşullarını ve elverişsiz çalışma ortamını tek tek aşmaktı
  • WSC hakkında daha ayrıntılı teknik dokümantasyon daha sonra başka biri tarafından yayımlanacak

1 yıl önceki no-defender ve DMCA

  • Yaklaşık 1 yıl önce yayımlanan no-defender, Windows Defender’ı kapatmak için antivirüslere yönelik Windows API’sini kullanıyordu
  • Bu API, sisteme “başka bir antivirüs var, bu yüzden Defender taraması çalıştırmaya gerek yok” bilgisini vermek için tasarlanmıştı
  • Bu alanı yöneten sistem bileşeni Windows Security Center (WSC) idi
  • no-defender, mevcut bir antivirüsün üçüncü taraf kodunu kullanarak o antivirüsün WSC’ye kaydolmasını zorlayacak şekilde çalışıyordu
  • Yayımlandıktan sonraki birkaç hafta içinde yaklaşık 1.5k stars aldı; kullanılan antivirüs geliştiricisi bir DMCA takedown talebi gönderince depo içeriği silinip konu kapatıldı

Seul seyahati sırasında yeniden başlayan WSC analizi

  • Seul’de bir Airbnb’de kalırken MrBruh, no-defender’a baktığını ve antivirüs ikilileri olmadan “temiz” bir uygulamanın mümkün olup olmadığını araştırdığını mesajla iletti
  • Normalde CTF ya da x86 reverse mühendislik işleri için ayrı bir x86 dizüstü bilgisayar taşınsa da bu seyahatte yalnızca M4Pro MacBook vardı
  • x86 reverse mühendislik için uygun donanım olmamasına rağmen, arkadaşlar uyanmadan önceki zaman kullanılarak WSC analizi başlatıldı

Day 1: WSC COM API’nin yeniden üretilmesi ve ilk erişim reddi

  • MrBruh en güncel WSC ikililerini sağladı ve daha önce kullanılan antivirüsün WSC kayıt uygulaması referans olarak alındı
  • WSC’de antivirüslerin kullandığı bir COM API vardı ve mevcut antivirüsün yaptığı çağrılar yaklaşık 1 saat içinde yeniden üretildi
  • Test için Parallels üzerinde arm64 Windows başlatıldı, ancak sonuç access denied oldu
  • Önceki deneyimlerden WSC’nin API çağrısı yapan süreci doğruladığı biliniyordu ve ilk şüphe imza doğrulaması yönündeydi
  • Mevcut antivirüsün WSC işlemleri için kullandığı sürece kod enjekte edildiğinde, yeni antivirüs kaydı ve durum güncelleme COM çağrıları düzgün çalıştı

Antivirüs ikililerinden kurtulma girişimi

  • Yeni projenin önceki antivirüs satıcısının itirazlarıyla yeniden karşılaşmaması için, antivirüs ikilileri yerine sistem tarafından sağlanan ikililerin kullanılması hedeflendi
  • İlk hedef süreç olarak cmd.exe seçildi, ancak WSC API çağrısı reddedildi
  • wscsvc.dll incelendiğinde, çağrıyı yapan sürecin PPL olup olmadığını denetleyen kod görüldü
  • Basit bir CreateProcessA ile başlatılan süreç PPL korumalı süreç değildi ve o gece daha fazla ilerlenemedi

Day 2: Kullanışsız uzak hata ayıklama ortamının kurulması

  • arm64 MacBook üzerinde x86 Windows ile düzgün çalışmak zordu; arm64 ortamında ilerlemek ya da x64dbg kullanamamak istenmiyordu
  • Arkadaş pindos PC erişimi açtı ve Parsec ile uzaktan bağlanıldı
  • Kore’den ABD’deki bir PC’ye bağlanıldığı için ortalama gecikme yaklaşık 210ms idi
  • O sıradaki çalışma akışı son derece hantaldı
    • Parallels içindeki Windows arm64 ortamında MSVC ile modül derleme
    • Derleme çıktılarının paylaşımlı klasör üzerinden ana sistemle paylaşılması
    • AnyDesk ile çıktıları pindos’un PC’sindeki VM’e kopyalama
    • Parsec’te 210 ms gecikmeyle WSC servisini hata ayıklama
  • Ortam o kadar elverişsizdi ki geliştirme ve analiz hızı ciddi biçimde düştü

WSC servisini hata ayıklama ve WinDefend SID

  • WSC servisi, svchost tarafından çalıştırılan bir DLL’di ve hata ayıklayıcı bağlanmasını engelleyen temel unsur PPL korumasıydı
  • VM’de test modu açıldı ve çekirdek modunda birkaç satırlık kodla hedef sürecin PPL’ini kaldıran bir sürücü kullanıldı
  • cmd.exe, WSC’ye antivirüs kaydı talebi gönderdiğinde başarısız olan nokta WscServiceUtils::CreateExternalBaseFromCaller idi
  • Bu fonksiyon, RPC istemcisini taklit ettikten sonra çağrıyı yapan sürecin token’ında WinDefend SID bulunup bulunmadığını kontrol ediyordu
  • O sırada Windows token davranışı iyi bilinmediğinden, WinDefend kimliğine bürünmenin bu kontrolü geçmeye yeteceği düşünüldü
  • Uykusuzluk halinde, mevcut antivirüs ikilisinin de bu IsMember kontrolünü geçtiği yanlış yorumlandı

WinDefend kimliğine bürünme denemesi ve başarısızlık

  • Windows token’ları birkaç saat incelendikten sonra, içinde WinDefend SID bulunan bir token ile çalıştırmanın WSC kontrolünü geçirebileceği yönünde bir uygulama yapıldı
  • cmd sürecine WinDefend SID eklenmiş halde kod çalıştırıldı, ancak COM çağrısı STATUS_SUCCESS döndürse de gerçekte yeni antivirüs kaydı oluşmadı
  • Sonuç olarak bu yaklaşım işe yaramadı ve ertesi gün yeniden doğrulanması gerekti

Day 3: Gerçek doğrulama algoritmasının yeniden kurulması

  • Tekrar kontrol edildiğinde, mevcut antivirüs ikilisi WinDefend SID kontrolünü geçmiyordu
  • Bu kontrol geçilse bile Windows Defender’ın WSC nesnesiyle çalışılıyor, ancak yalnızca WSC çağrılarıyla Defender doğrudan devre dışı bırakılamıyordu; bu yüzden yararsızdı
  • WinDefend kimliğine bürünme kodu kaldırıldı ve koşul ifadesinin diğer dalı analiz edildi
  • Bu dalda çağrıyı yapan ikili için şunlar kontrol ediliyordu
    • Sürecin elevated olup olmadığı
    • İkili imzasının geçerli olup olmadığı
    • PE içindeki DllCharacteristics alanında belirli bir bayrağın bulunup bulunmadığı
  • CSecurityVerificationManager::CreateExternalBaseFromPESettings içinde kontrol edilen DllCharacteristics bayrağı ForceIntegrity idi
  • WSC’nin yaptığı ikili doğrulamasını yeniden üreten kod, defendnot deposundaki wsc-binary-check klasöründe oluşturuldu ve System32 ikilileri üzerinde test edildi

Taskmgr.exe kullanımı ve ctx.bin hatası

  • Arkadaşın PC’yi yeniden kullanması gerektiği için doğrudan VM’e Parsec ile bağlanıldı, ancak yazılımsal kodlama da devreye girince ortam daha da yavaşladı
  • cmd.exe yerine Taskmgr.exe kullanıldı, fakat yine RPC hatası alındı
  • Gecikme ve giriş sorunları nedeniyle aynı VM’de hata ayıklama zorlaştı; öneri üzerine shadow.tech aboneliği için $30 ödendi
  • Shadow.tech VM’inde Windows sürümü daha eskiydi; bu nedenle wscsvc kodu güncel sürümdeki kadar tek bir fonksiyona yoğun biçimde inline edilmemişti ve decompile çıktısı daha okunurdu
  • Asıl hata nedeni, WSC’ye iletilen AV adının yanlış olmasıydı
    • defendnot-loader ile defendnot.dll arasında veri aktarmak için serileştirilmiş parametreleri içeren ctx.bin kullanılıyordu
    • Durum takibi için ayrı bir IPC uygulanmış olsa da yapılandırma aktarımında eski no-defender kodundan kalan ctx.bin yöntemi sürüyordu
    • ctx.bin yolunu bulan fonksiyon, nodefend.dll yerine Taskmgr.exe modülünün temel klasörünü esas alıyordu
    • Sonuç olarak AV adı olarak null byte gönderiliyor ve WSC bu buffer’ı reddediyordu
  • Yol sorunu düzeltildikten sonra test başarıyla geçti

Kodun toparlanması ve autorun sorunu

  • Aynı gün bitirmek için sabah 8’e kadar kod toparlandı ve ek özellikler geliştirildi
  • Ek özellikler arasında kendini autorun listesine ekleme işlevi de vardı
  • Sabah 8 itibarıyla yalnızca autorun düzgün çalışmıyordu; çeşitli yöntemler denendikten sonra başarısız olunup uyundu
  • Ertesi gün tekrar bakıldığında, görev zamanlayıcı görevi oluşturulurken güçle ilgili iki onay kutusunun sorun çıkardığı görüldü
  • Dizüstü bilgisayar AC güce bağlı olmadığı için görev çalışmıyordu; bu bayraklar kapatılınca autorun çalıştı
  • Ardından birkaç saat daha kod düzenlendi ve iş tamamlandı

Kapanış

  • Çalışmanın kendisi eğlenceliydi, ancak birkaç gün boyunca tekrarlanan ortam sorunları ve uzaktan hata ayıklama akışı tekrar yaşamak istenmeyecek bir deneyimdi
  • Özellikle arm64 MacBook, uzak x86 VM, yüksek gecikme, yavaş kodlama ve sonradan ortaya çıkan dosya yolu hatası uygulamanın zorluk seviyesini ciddi biçimde artırdı
  • WSC ile ilgili daha teknik bir doküman daha sonra ayrıca yayımlanacak

1 yorum

 
GN⁺ 2025-05-13
Hacker News yorumları
  • Defender’ı kapatmanın en müdahaleci ama etkili yollarından biri, canlı Linux USB ile önyükleme yapıp C:\ProgramData\Microsoft\Windows Defender klasörünün adını değiştirmek, ardından yerine boş bir dosya oluşturmaktı

    • Grup İlkesi hâlâ çok iyi çalışıyor; bu yüzden ev laboratuvarımda yerel bir etki alanı denetleyicisi tutup tüm kullanıcılar için yalnızca Defender ilkelerini otomatik olarak değiştirecek şekilde ayarladım
    • Popüler ürünlerden biri de neredeyse aynı şekilde çalışırken, sonuçta tüm internetin yaklaşık %25’ini beraberinde çökertmiş oldu
    • Windows’un imzalı bir manifest ile bu tür değişiklikleri algılamaması tuhaf
  • Bu arada WSC, Windows Security Center’ın kısaltmasıdır

  • the antivirus I was using ifadesi yüzünden epey kafam karıştı. O antivirüs şirketinin yazara neden DMCA kaldırma talebi göndermek için bir gerekçesi olduğunu anlayamadım
    Muhtemelen yazarın başka bir antivirüsü tersine mühendislik edip bunun bir kısmını açık kaynak projeye koyduğu anlamına geliyor. Ama Impersonating WinDefend gibi bir başlık da görünüyor; sonuçta yazarın bir şekilde telif hakkı yasasını ihlal edip etmediğini merak ediyorum

    • Anladığım kadarıyla imza gereksinimini aşmak için başka bir antivirüs aracının kabuğunu kullanmış. Bunun gri bir alan olduğunu anlıyorum ve dönüştürücü kullanım olarak görülebilecek bir tarafı da olduğunu düşünüyorum, ama hukukçu değilim
    • Evet. Mevcut bir antivirüs programının bir kısmını kopyalayarak telif hakkı yasasını ihlal etmiş
      Alıntılanan paragrafın hemen öncesinde, “proje zaten var olan bir antivirüsün üçüncü taraf kodunu kullandı ve o antivirüsün WSC’ye antivirüs olarak kaydedilmesini zorladı” açıklaması var
  • Bu kod lanetli gibi duruyor:
    https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
    Gerçekte ne olduğunu merak ediyorsanız burası:
    https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...

    • C++ büyüsüne hâkim biri ne olduğunu ve neden lanetli dendiğini açıklayabilir mi?
    • Zaman kısıtı yüzünden COM ile ilgili nesneler için doğrudan RAII uygulamak istemedim. Yine de bir sonraki güncellemede değiştireceğim
    • Neyin lanetli olduğunu anlamadım. Çağrı tarafındaki imza kişisel zevke göre biraz farklı olabilir ama ben de kodumda bu deseni birçok yerde kullanıyorum
      Örneğin D dilinde kapsamın sonunda çalışan statement kavramı dile yerleşik olarak bulunuyor
    • “Kod, iş arkadaşlarınıza davranma biçiminizdir” - Michael Feather, https://x.com/mfeathers/status/1031176879577780224
      Özetle, yapay zeka tarafından yazılmış değil. Bu kod, nesne kapsam dışına çıkana kadar fonksiyon çağrısını erteliyor. Uygulama, C makrolarıyla gerekli C lambda/anonim fonksiyon tanımının bir kısmını atlayan daha kısa bir sözdizimi oluşturuyor ve ertelenmiş çağrıyı yönetecek benzersiz bir değişken adı üretiyor
      Ancak ortaya çıkan sözdizimi, C makrolarını belirtmek için yaygın gelenek olan büyük harf kullanımından kaçınıyor ve ilk bakışta nesne işaretçisi üzerinden fonksiyon çağrısı gibi görünüyor. Bu desene aşina değilseniz veya makroların farklı görünmesini bekliyorsanız kafa karıştırıcı olabilir
      Bazıları için yeterince yaygın ve kullanışlı olduğundan belirli bağlamlarda neredeyse deyimleşmiş bir kullanım sayılabilir. Teknik açıklama için https://news.ycombinator.com/item?id=43959403#43960905 makronun nasıl çalıştığını iyi açıklıyor
  • Tatilde Windows’un sanal masaüstlerini tersine mühendislik yaptım ve tatilim çok daha iyi hâle geldi. Geçen yılın en iyi anısı, tersine mühendisliğin gerçekten eğlenceli olduğunu fark etmekti
    Bir sürü ilginç şey de öğrendim; Windows’un RPC’sinin altında belgelenmemiş bir mesajlaşma katmanı var: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....

  • Profil fotoğrafı anime karakteriyse yazının iyi olacağını her seferinde anlıyorum. İleride berbat bir Windows ortamına geri dönmek zorunda kalırsam diye kaydettim

  • Merak edenler için: WSC, Windows Security Center’ın kısaltmasıdır. Benim de bakmam gerekti

    • Yazının içinde “Bu karmaşayı yöneten sistem parçasına Windows Security Center, kısaca WSC denir” diye geçiyor
  • Neden WSC’yi kapatmak istesinler ki?

    • Performans yüzünden olabilir; zararlı yazılım geliştirme veya hacking için de olabilir
    • Saldırgansanız, başka bir uç nokta algılama ve yanıt ürünü kurulu olmayan şanslı bir durumu hedefleyebilirsiniz. Böyle bir ürün varsa neredeyse kesinlikle araya girecektir
      Bir EDR tedarikçisiyseniz bu, Windows Firewall’u bastırmak veya devre dışı bırakmak için kullanılabilecek gizlenmiş bir API çağrısıdır. Örneğin CrowdStrike’ın hem Windows Firewall’u kullanabildiğini hem de kendi uygulamasını kullanabildiğini varsayıyorum
    • Donanım benim, istediğimi yaparım
    • Tüm antivirüs yazılımları en azından power virus sayılır. Birinin netcat.exe olmaz diye dadı gibi karışmasını umursamak istemiyorum
    • Çünkü insanın kendisine bilerek rootkit yerleştirmek istemesi için bir neden yok
  • Yakın zamanda https://nostarch.com/windows-security-internals okudum; bu yazı sayesinde çok daha iyi oturdu
    Windows’ta bu arka plandaki işlerin kabaca nasıl döndüğünü biraz biliyordum, ama zamanlaması iyi oldu. O kitabın son bölümü de bu yazının yazarının ele aldığı gibi token’lar ve SID’ler konusuna oldukça ayrıntılı giriyor