1 पॉइंट द्वारा GN⁺ 2025-05-13 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • सियोल यात्रा के दौरान बनाया गया defendnot एक ऐसा टूल था जो Windows Security Center (WSC) service API को सीधे कॉल करके Windows Defender को disable करने की कोशिश करता था, और यह कई दिनों की reverse engineering में बदल गया
  • पिछला टूल no-defender मौजूदा antivirus code का उपयोग करके WSC में यह register कराता था कि कोई दूसरा antivirus मौजूद है, और लगभग 1.5k GitHub stars पाने के बाद antivirus vendor के DMCA अनुरोध पर हटा दिया गया
  • शुरुआत में WSC की COM API calls को लगभग 1 घंटे में reproduce कर लिया गया, लेकिन WSC calling process को verify करता था, इसलिए सामान्य process से access denied मिला
  • analysis में पता चला कि WSC WinDefend SID, admin privileges, signature, और PE के DllCharacteristics में ForceIntegrity flag की जांच करता है, और अंतिम implementation में Taskmgr.exe इस्तेमाल किया गया
  • arm64 MacBook, अमेरिका में remote PC, Parsec की 210ms latency, और Shadow.tech VM जैसे उलझे हुए environment में ctx.bin path error और autorun power condition की समस्या ठीक करके implementation पूरा किया गया

defendnot बनाने की पृष्ठभूमि

  • defendnot एक ऐसा टूल है जो Windows Security Center service API का सीधे उपयोग करके Windows Defender को disable करता है
  • implementation की असली चुनौती WSC call खुद नहीं थी, बल्कि उसे रोकने वाली verification conditions और असुविधाजनक work environment को एक-एक करके bypass करना था
  • WSC की अधिक तकनीकी documentation बाद में कोई और प्रकाशित करेगा

1 साल पहले no-defender और DMCA

  • लगभग 1 साल पहले जारी किया गया no-defender Windows Defender को बंद करने के लिए antivirus के लिए बने Windows API का उपयोग करता था
  • इस API का मकसद system को यह बताना था कि “दूसरा antivirus मौजूद है, इसलिए Defender scan चलाने की ज़रूरत नहीं है”
  • इस हिस्से को संभालने वाला system component Windows Security Center(WSC) है
  • no-defender मौजूदा antivirus के third-party code का उपयोग करके उस antivirus को WSC में register होने के लिए मजबूर करता था
  • रिलीज़ के कुछ ही हफ्तों में इसे लगभग 1.5k stars मिले, और इस्तेमाल किए गए antivirus vendor ने DMCA takedown अनुरोध भेजा तो repository की सामग्री हटाकर बात वहीं खत्म कर दी गई

सियोल यात्रा के दौरान फिर शुरू हुआ WSC analysis

  • सियोल के Airbnb में ठहरने के दौरान MrBruh ने no-defender को देखते हुए संदेश भेजा कि वह यह जांच रहा है कि क्या antivirus binary के बिना “clean” implementation संभव है
  • आम तौर पर CTF या x86 reversing के लिए अलग x86 laptop साथ लाया जाता था, लेकिन इस यात्रा में सिर्फ M4Pro MacBook था
  • x86 reversing hardware न होने जैसी प्रतिकूल स्थिति में भी, दोस्तों के उठने से पहले के समय का उपयोग करके WSC analysis शुरू किया गया

Day 1: WSC COM API reproduce करना और पहली access denial

  • MrBruh ने नवीनतम WSC binaries दीं, और पहले इस्तेमाल किए गए antivirus के WSC registration implementation को reference बनाया गया
  • WSC में antivirus vendors के लिए इस्तेमाल होने वाली COM API है, और मौजूदा antivirus जैसी calls को लगभग 1 घंटे में reproduce कर लिया गया
  • Parallels में arm64 Windows boot करके test किया गया, लेकिन नतीजा access denied था
  • पिछले अनुभव से पता था कि WSC API call करने वाले process को verify करता है, और शुरुआत में signature verification पर शक हुआ
  • जब मौजूदा antivirus द्वारा WSC काम के लिए इस्तेमाल किए जाने वाले process में code inject किया गया, तो नए antivirus registration और status update COM calls सही से काम करने लगे

antivirus binary हटाने की कोशिश

  • ताकि नया project फिर से पुराने antivirus vendor की आपत्ति का शिकार न हो, antivirus binary की जगह system-provided binary इस्तेमाल करने की कोशिश की गई
  • पहले target process के रूप में cmd.exe चुना गया, लेकिन WSC API calls फिर भी reject हो गईं
  • wscsvc.dll देखने पर ऐसा code मिला जो calling process के PPL होने की जांच करता था
  • साधारण CreateProcessA से बना process PPL protected process नहीं था, और उस रात तड़के इससे आगे प्रगति नहीं हो सकी

Day 2: असुविधाजनक remote debugging environment बनाना

  • arm64 MacBook पर x86 Windows को ठीक से संभालना मुश्किल था, और arm64 environment में काम करने या x64dbg न इस्तेमाल कर पाने वाली स्थिति से बचना था
  • दोस्त pindos ने PC access दिया, और Parsec से remote connection किया गया
  • कोरिया से अमेरिका में मौजूद PC से जुड़ने के कारण औसत latency लगभग 210ms थी
  • उस समय workflow बहुत झंझट भरा था
    • Parallels के Windows arm64 में MSVC से modules build करना
    • shared folder से build outputs host के साथ share करना
    • AnyDesk से outputs को pindos के PC पर चल रहे VM में copy करना
    • Parsec की 210ms latency में WSC service debug करना
  • environment इतना असुविधाजनक था कि development और analysis की गति काफी धीमी हो गई

WSC service debugging और WinDefend SID

  • WSC service, svchost द्वारा चलाया जाने वाला DLL है, और debugger attach होने से रोकने वाला मुख्य तत्व PPL protection था
  • VM में test mode चालू किया गया, और kernel mode में कुछ lines के code वाले driver से target process का PPL हटाया गया
  • जब cmd.exe WSC से antivirus registration मांगता था, तो failure point WscServiceUtils::CreateExternalBaseFromCaller था
  • यह function RPC client का impersonation करने के बाद calling process token में WinDefend SID होने की जांच करता था
  • उस समय Windows token behavior की समझ कम थी, इसलिए लगा कि WinDefend का impersonation करने से check pass हो जाएगा
  • नींद की कमी की हालत में यह भी गलत समझ लिया गया कि मौजूदा antivirus binary भी इस IsMember check को pass करती है

WinDefend impersonation की कोशिश और विफलता

  • Windows tokens के बारे में कुछ घंटे सीखने के बाद, ऐसा implementation बनाया गया जिसमें WinDefend SID वाले token के साथ चलने पर WSC check pass हो जाए
  • cmd पर WinDefend SID जोड़कर code चलाया गया, लेकिन COM call STATUS_SUCCESS लौटाने के बावजूद असली नए antivirus registration नहीं हुआ
  • यह तरीका आखिरकार बेकार साबित हुआ, और अगले दिन फिर से verification करनी पड़ी

Day 3: असली verification algorithm का पुनर्निर्माण

  • दोबारा जांच करने पर पता चला कि मौजूदा antivirus binary WinDefend SID check pass नहीं करती थी
  • उस check को pass करने पर Windows Defender के WSC object तक पहुंच मिलती थी, लेकिन सिर्फ WSC call से Defender को तुरंत disable नहीं किया जा सकता था, इसलिए इसका कोई उपयोग नहीं था
  • WinDefend impersonation code हटाकर conditional की दूसरी branch का analysis किया गया
  • उस branch में calling binary के लिए यह जांचा जाता था
    • process elevated है या नहीं
    • binary signature valid है या नहीं
    • PE के DllCharacteristics में कोई specific flag है या नहीं
  • CSecurityVerificationManager::CreateExternalBaseFromPESettings में जांचा जाने वाला DllCharacteristics flag ForceIntegrity था
  • WSC द्वारा किए जाने वाले binary checks को reproduce करने वाला code defendnot repository के wsc-binary-check folder में बनाया गया, और इसे System32 binaries पर test किया गया

Taskmgr.exe का उपयोग और ctx.bin bug

  • दोस्त को फिर से PC इस्तेमाल करना था, इसलिए VM में सीधे Parsec से connect किया गया, लेकिन software encoding जुड़ने से environment और भी धीमा हो गया
  • cmd.exe की जगह Taskmgr.exe इस्तेमाल किया गया, लेकिन फिर भी RPC error आया
  • latency और input समस्याओं के कारण उसी VM में debugging मुश्किल हो गई, और सिफारिश पर shadow.tech subscription के लिए $30 चुकाए गए
  • Shadow.tech VM में Windows version पुराना था, इसलिए wscsvc code नवीनतम version की तरह एक function में बहुत ज़्यादा inline नहीं था, और decompilation भी पढ़ने में आसान थी
  • असली error का कारण WSC को दिया गया AV name गलत होना था
    • defendnot-loader से defendnot.dll तक data भेजने के लिए serialized parameters वाले ctx.bin का उपयोग किया जाता था
    • status tracking के लिए IPC अलग से लागू किया गया था, लेकिन settings pass करने में पुराने no-defender code का ctx.bin तरीका बचा रह गया था
    • ctx.bin path खोजने वाला function nodefend.dll नहीं, बल्कि Taskmgr.exe module के base folder को आधार बना रहा था
    • नतीजतन AV name के रूप में null byte pass हुआ, और WSC ने उस buffer को reject कर दिया
  • path समस्या ठीक करने के बाद test सफल रहा

code cleanup और autorun समस्या

  • उसी दिन काम खत्म करने के लिए सुबह 8 बजे तक code cleanup और अतिरिक्त features पर काम किया गया
  • अतिरिक्त features में खुद को autorun में जोड़ने की सुविधा भी शामिल थी
  • सुबह 8 बजे तक सिर्फ autorun सही से काम नहीं कर रहा था, और कई तरीके आज़माने के बाद असफल होकर सो गए
  • अगले दिन दोबारा देखने पर पता चला कि task scheduler task बनाते समय power से जुड़े दो checkboxes इसकी वजह थे
  • laptop AC power से connected नहीं था, इसलिए task run नहीं हुआ, और वे flags हटाते ही autorun काम करने लगा
  • इसके बाद कुछ और घंटे code साफ़ किया गया और काम पूरा किया गया

समापन

  • काम खुद में मजेदार था, लेकिन कई दिनों तक दोहराई गई environment समस्याएँ और remote debugging workflow ऐसा अनुभव था जिसे दोबारा नहीं झेलना चाहेंगे
  • खास तौर पर arm64 MacBook, remote x86 VM, high latency, slow encoding, और बाद में सामने आया file path bug ने implementation की कठिनाई बहुत बढ़ा दी
  • WSC पर अधिक तकनीकी documentation बाद में अलग से प्रकाशित की जाएगी

1 टिप्पणियां

 
GN⁺ 2025-05-13
Hacker News की टिप्पणियां
  • Defender को बंद करने का सबसे invasive लेकिन असरदार तरीका था live Linux USB से boot करके C:\ProgramData\Microsoft\Windows Defender का नाम बदलना, और फिर उसी जगह एक खाली file बना देना

    • Group Policy अब भी बहुत अच्छी तरह काम करती है, इसलिए मैंने अपने homelab में एक local domain controller रखा है जो सभी users के लिए सिर्फ Defender policy अपने-आप बदल देता है
    • एक लोकप्रिय product भी लगभग इसी तरह काम कर रहा था और उसने साथ में पूरे internet के करीब 25% को गिरा दिया
    • अजीब है कि Windows signed manifest के जरिए ऐसे बदलाव detect नहीं करता
  • संदर्भ के लिए, WSC का मतलब Windows Security Center है

  • the antivirus I was using वाली अभिव्यक्ति से काफी confusion हुआ। समझ नहीं आया कि उस antivirus company के पास लेखक को DMCA takedown request भेजने की क्या वजह होगी
    शायद मतलब यह है कि लेखक ने किसी दूसरे antivirus को reverse engineer करके उसका कुछ हिस्सा open-source project में डाल दिया। लेकिन Impersonating WinDefend जैसे title भी दिख रहे थे, इसलिए अंत में यह जानने की उत्सुकता है कि क्या लेखक ने किसी तरह copyright law तोड़ा था

    • मेरी समझ में, signature requirements को bypass करने के लिए उसने किसी दूसरे antivirus tool का shell इस्तेमाल किया। समझता हूं कि यह gray area है, और इसे transformative use मानने की गुंजाइश भी हो सकती है, लेकिन मैं lawyer नहीं हूं
    • सही। उसने मौजूदा antivirus program के कुछ हिस्से copy करके copyright law तोड़ा
      उद्धृत paragraph से ठीक पहले लिखा है कि “project ने पहले से मौजूद antivirus का third-party code इस्तेमाल किया, और उस antivirus को WSC में antivirus के रूप में register होने के लिए force किया”
  • यह code cursed-सा लगता है:
    https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
    अगर सच में जानना है कि क्या हो रहा है, तो यहां देखें:
    https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...

    • क्या C++ magic में माहिर कोई बता सकता है कि क्या हो रहा है और इसे cursed क्यों कहा जा रहा है?
    • time constraints की वजह से COM से जुड़े objects के लिए खुद RAII implement नहीं करना चाहता था। फिर भी अगले update में इसे बदलने वाला हूं
    • समझ नहीं आया कि इसमें cursed क्या है। call-site signature में मेरी personal preference थोड़ी अलग है, लेकिन अपने code में भी मैं यह pattern जगह-जगह use करता हूं
      उदाहरण के लिए D language में scope के अंत में execute होने वाले statement का concept language में built-in है
    • “Code is how we treat our colleagues” - Michael Feather, https://x.com/mfeathers/status/1031176879577780224
      संक्षेप में, यह AI ने नहीं लिखा है। यह code function call को तब तक defer करता है जब तक object scope से बाहर नहीं निकलता। implementation में C macros का इस्तेमाल करके आवश्यक C lambda/anonymous function definition के कुछ हिस्सों को छोड़ने वाला छोटा syntax बनाया गया है, और deferred call को manage करने के लिए unique variable name generate किया गया है
      लेकिन resulting syntax C macros के लिए आम convention यानी uppercase notation से बचता है, और पहली नजर में object pointer के function call जैसा दिखता है। अगर आप इस pattern से परिचित नहीं हैं या उम्मीद करते हैं कि macro अलग तरह से दिखेगा, तो यह confusing हो सकता है
      कुछ लोगों के लिए यह इतना common और useful है कि खास contexts में इसे लगभग idiom माना जा सकता है। technical explanation के लिए https://news.ycombinator.com/item?id=43959403#43960905 macro के काम को अच्छी तरह समझाता है
  • छुट्टी के दौरान Windows के virtual desktops को reverse engineer किया और छुट्टी बहुत बेहतर हो गई। पिछले साल की सबसे अच्छी memory यह महसूस करना था कि reverse engineering सच में मजेदार है
    कई interesting चीजें भी सीखीं; Windows के RPC के नीचे एक undocumented messaging layer है: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....

  • अगर profile picture anime character हो, तो हर बार पता चल जाता है कि post अच्छी होगी। बाद में जब किसी खराब Windows environment में लौटना पड़े, उसके लिए save कर लिया

  • जिन्हें जानना है: WSC का मतलब Windows Security Center है। मुझे भी search करना पड़ा था

    • article में लिखा है, “इस पूरी अव्यवस्था को manage करने वाले system हिस्से को Windows Security Center, short में WSC, कहा जाता है”
  • कोई WSC बंद क्यों करना चाहेगा?

    • performance की वजह से हो सकता है, या malware development/hacking की वजह से
    • अगर attacker हैं, तो आप उस lucky situation को target कर सकते हैं जहां कोई दूसरा endpoint detection and response product installed न हो। अगर ऐसा product है, तो वह लगभग पक्का intercept करेगा
      अगर आप EDR vendor हैं, तो यह Windows Firewall को suppress या disable करने के लिए इस्तेमाल की जा सकने वाली obfuscated API call है। उदाहरण के लिए, मेरा मानना है कि CrowdStrike Windows Firewall इस्तेमाल कर सकता है या अपना implementation—दोनों possible हैं
    • मेरा hardware है, इसलिए जो चाहूं वही कर रहा हूं
    • सभी antivirus software कम से कम powervirus होते हैं। कोई netcat.exe चलाने से मना करके nanny की तरह दखल दे, यह मुझे मंजूर नहीं
    • क्योंकि जानबूझकर खुद पर rootkit install करना चाहने की कोई वजह नहीं है
  • हाल ही में https://nostarch.com/windows-security-internals पढ़ी, और इस post की वजह से वह बात काफी ज्यादा समझ आई
    Windows में ऐसी backend चीजें मोटे तौर पर कैसे चलती हैं, यह थोड़ा जानता था, लेकिन timing अच्छी थी। उस book का last chapter भी, इस post के लेखक ने जैसे cover किया है, tokens और SID में काफी detail से जाता है