1 คะแนน โดย GN⁺ 2025-05-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แชร์ประสบการณ์ระหว่างพัฒนา defendnot เครื่องมือที่ปิดการทำงานของ Windows Defender โดยใช้งาน Windows Security Center(WSC) service API โดยตรง
  • โปรเจกต์นี้เริ่มต้นจากการพยายามก้าวข้ามข้อจำกัดทางเทคนิคและปัญหาทางกฎหมายของโปรเจกต์ no-defender ก่อนหน้า
  • ทำรีเวิร์สเอนจิเนียริงและดีบักท่ามกลางอุปสรรคหลายอย่าง เช่น สภาพแวดล้อมพิเศษ (MacBook arm64, การดีบักระยะไกล, latency สูง)
  • วิเคราะห์ทั้ง การหลบเลี่ยงการลงทะเบียน Defender และกลไกตรวจสอบโปรเซส และปรับปรุงให้ทำงานได้เสถียรหลังผ่านความล้มเหลวและการลองผิดลองถูกหลายครั้ง
  • สุดท้ายทำ ฟีเจอร์ autorun เสร็จ และเล่าย้อนถึงความยากลำบากตลอดทั้งโปรเจกต์

บทนำ

  • แชร์ประสบการณ์การเดินทางในการสร้างเครื่องมือ defendnot สำหรับปิดการทำงานของ Windows Defender
  • เนื้อหานี้ไม่ได้เน้นรายละเอียดทางเทคนิคเป็นหลัก แต่สรุปโดยเน้นที่ ปัญหาที่เจอในสภาพแวดล้อมจริงและประสบการณ์ลองผิดลองถูก
  • เอกสารอย่างเป็นทางการและคำอธิบายเชิงเทคนิคจะเผยแพร่แยกต่างหากในภายหลัง

ย้อนความเมื่อ 1 ปีก่อน

  • ราว 1 ปีก่อน ผู้เขียนได้เผยแพร่โปรเจกต์ชื่อ no-defender ซึ่งอาศัยโครงสร้างที่ทำให้ Windows Defender ถูกปิดผ่าน WSC API
  • โปรเจกต์นี้อ้างอิง โค้ดของบุคคลที่สาม จากผู้ให้บริการแอนติไวรัส เพื่อทำให้ระบบเข้าใจผิดว่ามีการลงทะเบียนแอนติไวรัสตัวอื่นอยู่
  • หลังเปิดตัว โปรเจกต์ได้รับความสนใจมากและมี Star ราว 1,500 ดาว แต่สุดท้ายตัดสินใจลบซอร์สและยุติโปรเจกต์เนื่องจากได้รับ คำขอลบแบบ DMCA จากบริษัทแอนติไวรัสที่เกี่ยวข้อง

จุดเริ่มต้นของโปรเจกต์

  • ขณะเขียนบทความนี้ ผู้เขียนกำลังพักอยู่ใน Airbnb ที่กรุงโซล
  • สภาพแวดล้อมหลักในการพัฒนาคือ M4Pro MacBook และไม่ได้พกอุปกรณ์สำหรับรีเวิร์สเอนจิเนียริง x86 ที่จำเป็นมาด้วย
  • เนื่องจากมีทั้ง การแข่งขัน CTF และตารางเดินทาง จึงต้องทำงานต่อโดยไม่มีอุปกรณ์ x86
  • ระหว่างตรวจสอบความเป็นไปได้ของการทำ no-defender แบบ “ปกติ” ก็เริ่มสำรวจด้วยว่าสามารถทำ อิมพลีเมนต์แบบแยกเดี่ยวโดยไม่ขึ้นกับ AV ได้หรือไม่

การสำรวจเบื้องต้น (วันที่ 1)

  • ด้วยความช่วยเหลือจากเพื่อน ผู้เขียนได้ไฟล์ wsc binary มา และพยายามทำการลงทะเบียน WSC ขึ้นใหม่ในโครงสร้างคล้ายกับโปรเจกต์ก่อนหน้า
  • มีการอิมพลีเมนต์โดยใช้ COM API ของ WSC แต่พบข้อผิดพลาด Access Denied
  • จากการตรวจสอบพบว่าสาเหตุเกิดจาก WSC มี การตรวจสอบลายเซ็นและกระบวนการยืนยันตัวตนของโปรเซสที่เรียก API
  • เมื่อทดลองฉีดโมดูลเข้าไปในโปรเซสของ AV แล้วพยายามลงทะเบียน ก็สามารถลงทะเบียน AV ได้สำเร็จ

การแทนที่ AV binary และการทดลองเพิ่มเติม (วันที่ 1)

  • ทดลองรันเครื่องมือผ่านโปรเซสระบบที่มีการเซ็นรับรองแล้ว (เช่น cmd.exe) แต่ล้มเหลวที่การตรวจสอบ PPL(Protected Process Light)
  • จึงหยุดไว้ชั่วคราวและตั้งใจว่าจะกลับมาดูการดิแอสเซมบลีและการติดตามแบบละเอียดเพื่อวิเคราะห์ต่อ

การตั้งค่าสภาพแวดล้อม (วันที่ 2)

  • ด้วยข้อจำกัดของ MacBook แบบ arm64 การดีบัก Windows x86 จึงทำได้ยากมาก
  • ผู้เขียนใช้พีซีของเพื่อนที่อยู่ในสหรัฐฯ แบบรีโมต (Parasec, Anydesk ฯลฯ) เพื่อทำการดีบักและทดลองภายใต้ สภาพแวดล้อม latency สูง
  • กระบวนการที่ต้องสลับไปมาระหว่างการบิลด์โค้ดกับการดีบัก VM อย่างซับซ้อน ทำให้ทั้งช้าลงและสับสนมาก

การดีบักบริการ WSC (วันที่ 2)

  • ยืนยันได้ว่าบริการ WSC เป็น DLL ที่ รันโดย svchost
  • ใช้ไดรเวอร์พิเศษเพื่อหลบเลี่ยง การป้องกัน PPL และยืนยันการเข้าไปถึงฟังก์ชันด้วยดีบักเกอร์
  • พบว่าภายในบริการมีการตรวจสอบ WinDefend SID token
  • จากนั้นจึงตั้งสมมติฐานว่าน่าจะหลบเลี่ยงขั้นตอนยืนยันตัวตนได้ หากเลียนแบบโปรเซสที่มี WinDefend SID

การเลียนแบบ WinDefend SID (วันที่ 2)

  • ศึกษาเพิ่มเติมเกี่ยวกับโครงสร้าง token และหลักการทำงานของ Windows
  • หลังอิมพลีเมนต์และรันโค้ดสำหรับเลียนแบบ WinDefend SID พบว่าทุก COM call ส่งกลับเป็น SUCCESS แต่ในความเป็นจริงกลับไม่ได้มีการลงทะเบียน AV เกิดขึ้น

การสร้างอัลกอริทึมตรวจสอบขึ้นใหม่ (วันที่ 3)

  • กลับไปวิเคราะห์ AV binary อย่างระมัดระวังอีกครั้งเพื่อดูว่าการตรวจสอบ SID ผ่านจริงหรือไม่
  • พบว่าเมื่อ SID check ไม่ผ่าน บริการจะตรวจสอบเพิ่มเติมทั้งสถานะสิทธิ์ยกระดับของบริการ, ลายเซ็นของ binary และแฟลก DllCharacteristics (ForceIntegrity) ของ PE
  • จากนั้นจึงสร้างฟังก์ชันที่ทำงานแบบเดียวกันขึ้นมาใหม่ และทดลองใช้กับ core binary ภายในระบบ

การใช้โปรเซส Taskmgr (วันที่ 3)

  • ทดลองใหม่โดยใช้ Taskmgr.exe เป็นโปรเซสเป้าหมาย แต่เจอปัญหาที่ WSC ปฏิเสธคำขอเนื่องจาก ข้อผิดพลาดในกระบวนการส่งชื่อและบั๊ก IPC
  • หลังปรับปรุงการอนุมานพาธไฟล์และวิธีส่งชื่อ AV ก็ยืนยันได้ว่าสามารถทำงานได้ตามปกติ

การจัดระเบียบโค้ด (วันที่ 3)

  • เริ่มจัดระเบียบฟังก์ชันต่าง ๆ และพยายามอิมพลีเมนต์ ฟีเจอร์ autorun
  • ระหว่างจัดการ autorun พบอาการล้มเหลวเป็นครั้งคราว จึงต้องวนกลับไปตรวจสอบทั้งโค้ดและสภาพแวดล้อมซ้ำหลายรอบเพื่อหาสาเหตุ

การอิมพลีเมนต์ autorun (วันที่ 4)

  • ในที่สุดก็พบว่าสาเหตุมาจากตัวเลือกใน Task Scheduler ที่ตั้งเครื่องหมายไว้ว่า ห้ามรันงานเมื่อโน้ตบุ๊กไม่ได้เสียบไฟ AC
  • หลังยกเลิกการตั้งค่านั้น autorun ก็ทำงานได้ตามปกติ
  • จากนั้นจึงเก็บกวาดโค้ดและทำการทดสอบปิดท้าย

บทสรุป

  • งานรีเวิร์สเอนจิเนียริงภายใต้สภาพแวดล้อมที่จำกัดและไม่สะดวกนั้นเป็น ประสบการณ์ที่หนักมากทั้งทางจิตใจและร่างกาย
  • ในอนาคตจะมีการเผยแพร่เอกสารที่อธิบายการอิมพลีเมนต์ WSC แบบละเอียดเพิ่มเติมแยกต่างหาก

คำขอบคุณ

  • Pindos: เพื่อนที่ให้ใช้พีซีในตอนกลางคืนเพื่อช่วยดีบัก และยังทำให้ห้องอุ่นขึ้น
  • MrBruh: เพื่อนร่วมงานที่กระตุ้นให้เริ่มสำรวจโปรเจกต์นี้ พร้อมให้ไอเดียและฟีดแบ็ก
  • ขอบคุณคนรู้จักที่คอยติดต่อและเป็นกำลังใจตลอดช่วงทำโปรเจกต์
  • ขอยอมรับว่ารักกิมจิ
  • และขอบคุณศิลปินที่ทิ้งกราฟฟิตีไว้บนกำแพงของเรา

1 ความคิดเห็น

 
GN⁺ 2025-05-13
ความคิดเห็นจาก Hacker News
  • วิธีที่ทรงพลังที่สุดแต่ก็ล่วงล้ำที่สุดในการปิด Defender คือบูตด้วย live Linux USB แล้วเปลี่ยนชื่อโฟลเดอร์ C:\ProgramData\Microsoft\Windows Defender จากนั้นสร้างไฟล์ว่างไว้ที่ตำแหน่งเดิม
    • Group Policy ทำงานได้ดีมากเสียจนมีคนตั้งค่า local domain environment โดยมี controller อยู่ใน homelab เพื่อสลับนโยบาย Defender อัตโนมัติให้ผู้ใช้ทุกคน
    • แปลกดีที่ Windows ไม่มี signed manifest สำหรับตรวจจับการดัดแปลงแบบนั้น
    • ผลิตภัณฑ์ยอดนิยมก็ทำแบบนั้นเหมือนกัน และครั้งหนึ่งเคยทำให้อินเทอร์เน็ตเกือบ 25% ล่มมาแล้ว
  • โปรเจ็กต์นี้ดังมากและได้ประมาณ 1.5k stars แต่หลังจากนั้นนักพัฒนาแอนติไวรัสที่ฉันใช้อยู่ก็ส่งคำขอ DMCA มาให้ ฉันไม่เข้าใจว่า "แอนติไวรัสที่ฉันใช้อยู่" คืออะไร และทำไมคนนี้ถึงส่ง DMCA มาให้ น่าจะเป็นไปได้ว่าผู้เขียนไปรีเวิร์สเอนจิเนียร์แอนติไวรัสอีกตัวแล้วเอาเข้าโอเพนซอร์ส หรืออย่างน้อยก็เกี่ยวข้องกับการเลียนแบบ WinDefend ดูเหมือนจะมีปัญหาเรื่องลิขสิทธิ์
    • เท่าที่ฉันเข้าใจ ดูเหมือนว่าเขาใช้ shell ของเครื่องมือแอนติไวรัสตัวอื่นเพื่อหลบข้อกำหนดเรื่อง signature ซึ่งอาจถือว่าเป็นงานดัดแปลงที่พอฟังขึ้นได้ (ฉันไม่ใช่ผู้เชี่ยวชาญด้านกฎหมาย) แต่มันอยู่ในพื้นที่สีเทา
    • ใช่ เขาคัดลอกบางส่วนของโปรแกรมแอนติไวรัสที่มีอยู่เดิมและละเมิดกฎหมายลิขสิทธิ์ ย่อหน้าก่อนหน้าที่ถูกอ้างถึงก็อธิบายตรง ๆ ว่าโปรเจ็กต์นี้ใช้โค้ด third-party จากแอนติไวรัสเดิมเพื่อให้ AV ไปลงทะเบียนกับ WSC ได้
  • เผื่อใครสงสัย WSC ย่อมาจาก Windows Security Center
    • ขอบคุณที่ช่วยบอก ยิ่งเวลาเจอตัวย่อครั้งแรกแล้วไม่มีคำอธิบายนี่ยิ่งน่าหงุดหงิดจริง ๆ
  • อันนี้แปลกมากจริง ๆ: https://github.com/es3n1n/defendnot/… ถ้าอยากรู้ว่ามันเกิดอะไรขึ้นจริง ๆ ดูที่นี่: https://github.com/es3n1n/defendnot/…
    • อยากรู้ว่ามีใครที่อธิบาย CPP magic ได้เก่งพอจะอธิบายได้ไหมว่าทำไมโค้ดนี้ถึงแปลก
    • ฉันไม่เห็นว่ามันแปลกตรงไหน ฉันใช้แพตเทิร์นนี้บ่อยมากในหลายจุดของโค้ด แม้ที่จุดเรียกใช้ signature จะต่างกันอยู่บ้างก็ตาม (เป็นความชอบส่วนตัว) อนึ่ง ภาษา D มีไวยากรณ์ในตัวสำหรับทริกเกอร์เมื่อ scope จบอยู่แล้ว
    • ตอนนั้นเวลาน้อยเกินกว่าจะไปทำ RAII pattern เองสำหรับคอมโพเนนต์ COM ทุกตัว เดี๋ยวอัปเดตหน้าจะเปลี่ยน
    • "โค้ดก็เหมือนวิธีที่คุณปฏิบัติต่อเพื่อนร่วมงาน" - Michael Feather สรุปคือ มันไม่ใช่ AI โค้ดนี้มีหน้าที่หน่วงการเรียกฟังก์ชันไว้จนกว่า scope ของอ็อบเจ็กต์บางตัวจะสิ้นสุดลง มันใช้ C macro เพื่อย่อการนิยาม C lambda/anonymous function ที่ซับซ้อนและการสร้างชื่อตัวแปรไม่ซ้ำ อย่างไรก็ตาม macro นี้ไม่ได้เขียนเป็นตัวพิมพ์ใหญ่และหน้าตาเหมือนการเรียกฟังก์ชัน จึงอาจทำให้คนที่ไม่คุ้นเคยสับสนได้ สำหรับบางคน แพตเทิร์นนี้มีประโยชน์มากพอจนถือว่าเป็นสำนวนที่ใช้กันได้ ดูคำอธิบายเชิงเทคนิคได้จากลิงก์ในคอมเมนต์อื่น
  • ปีที่แล้วฉันใช้วันหยุดไปกับการรีเวิร์สเอนจิเนียร์ virtual desktop ของ Windows และมันเป็นความทรงจำที่ยอดเยี่ยมมาก การรีเวิร์สเอนจิเนียร์สนุกจริง ๆ ฉันได้เรียนรู้อะไรน่าสนใจหลายอย่าง เช่น ภายใน Windows RPC มีรูปแบบการสื่อสารแบบ message ที่ไม่มีเอกสารกำกับอยู่ด้วย: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC.html
  • ฉันเพิ่งอ่าน https://nostarch.com/windows-security-internals มาไม่นาน และมันทำให้ฉันอินกับโพสต์นี้ยิ่งขึ้น ใน Windows ฉันพอรู้ระดับหนึ่งอยู่แล้วว่า backend ทำงานอย่างไร แต่บทสุดท้ายของหนังสือเล่มนั้นอธิบายเรื่อง token และ SID ได้ละเอียดมากเท่าที่ผู้เขียนนำเสนอไว้
  • สงสัยว่าทำไมถึงอยากปิด WSC
    • อาจเป็นเพราะประสิทธิภาพ, การพัฒนามัลแวร์, การแฮ็ก ฯลฯ
    • ถ้าเป็นผู้ไม่หวังดี ก็อาจโชคดีที่ไม่มีผลิตภัณฑ์ EDR (endpoint detection and response) อื่นติดตั้งอยู่ แต่ถ้ามี ก็น่าจะถูกบล็อกแทบแน่นอน ถ้าเป็นผู้ผลิต EDR นี่อาจใช้เป็นการเรียก API แบบทำให้อ่านยากเพื่อปิด Windows Firewall ได้ด้วย ผลิตภัณฑ์อย่าง CrowdStrike ก็อาจใช้ไฟร์วอลล์ของตัวเองหรือแทนที่ Windows Firewall ได้
    • ซอฟต์แวร์แอนติไวรัสทุกตัวอย่างน้อยก็เป็น powervirus หมด ฉันไม่ชอบให้มีใครมาคอยจับตาว่าฉันใช้ netcat.exe ไม่ได้หรืออะไรทำนองนั้น
    • ก็ฮาร์ดแวร์ของฉัน ฉันจะใช้แบบที่ฉันต้องการ แค่นั้นเอง
    • ฉันสงสัยว่าทำไมใครถึงอยากฝัง rootkit ลงในระบบของตัวเอง
  • สิ่งที่แย่กว่าสำหรับฉันคือ Check Point Harmony ไม่ได้ใช้ interface ที่สร้างมาเพื่อ Defender เลย แต่กลับแนะนำผู้ใช้ผ่านบทความ knowledge base ให้ไปปิด Defender ด้วยตัวเองโดยตรง
  • เผื่อใครอยากรู้: WSC ย่อมาจาก Windows Security Center ฉันเองก็ต้องไปค้นเหมือนกัน
    • ในบทความมีประโยคว่า "สิ่งที่จัดการทั้งหมดนี้คือ Windows Security Center-WSC"
  • มีคนถามเรื่องข้อความที่ว่า "ฉันกำลังทำงานบน arm64 macbook อยู่ ดังนั้นตอนนี้ยังไม่มีวิธีที่โอเคจริง ๆ ในการอีมูเลต x86 Windows บน arm macbook" โดยถามว่า UTM เป็นอย่างไร และเสริมว่า Parallels เพิ่งเริ่มรองรับ Intel VM เมื่อไม่นานนี้
    • ฉันลอง UTM แล้ว และสำหรับ x86 Windows มันช้าจนใช้ไม่ได้ อาจพอทนได้สำหรับ Linux แบบ command line แต่ใน GUI นี่แทบเป็นไปไม่ได้ arm64 Windows ทำงานได้ดี แต่ก็ไม่ใช่ x86 Windows ดังนั้นจึงไม่มีประโยชน์สำหรับการรีเวิร์สเอนจิเนียร์ system component ของ x86
    • ระบบ dynamic recompilation ของ QEMU ไม่มีประสิทธิภาพเท่าระบบเนทีฟอย่างบน Windows หรือ macOS (Rosetta 2) UTM รัน x86 Windows ได้ก็จริง แต่ประสิทธิภาพแย่มาก ในทางปฏิบัติฉันรู้สึกว่าการรันแอป x86 ผ่านตัว dynamic recompiler ของ Windows ภายใน ARM Windows VM หรือใช้ WINE ที่มี subsystem บน native code จะดีกว่า ถ้าจะใช้แบบรีบด่วนง่าย ๆ ก็อาจพอได้ ถ้าสิ่งที่ OP เรียกว่า "โอเคจริง ๆ" รวมเรื่องประสิทธิภาพด้วย ฉันก็เข้าใจมุมมองนั้น
    • ถ้าฉันเข้าใจผิดก็ช่วยแก้ที แต่ดูเหมือนว่าการอีมูเลต CPU ที่มี MMU จะช้าโดยพื้นฐานและปรับแต่งให้เร็วได้ยาก Rosetta ของ Apple และเทคโนโลยีฝั่ง Microsoft เร็วได้เพราะรันแค่โค้ดใน user space เท่านั้น จึงเลี่ยงการอีมูเลต MMU ของทั้งระบบ