- แชร์ประสบการณ์ระหว่างพัฒนา 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
C:\ProgramData\Microsoft\Windows Defenderจากนั้นสร้างไฟล์ว่างไว้ที่ตำแหน่งเดิมnetcat.exeไม่ได้หรืออะไรทำนองนั้น