BluePill เป็นกรอบการวิเคราะห์แบบไดนามิกโอเพ่นซอร์สสำหรับการจัดการมัลแวร์แบบ evasive เป้าหมายคือการกระทบยอดคุณสมบัติความโปร่งใสที่จำเป็นสำหรับการวิเคราะห์อัตโนมัติด้วยการตรวจสอบการดำเนินการอย่างละเอียดและความสามารถในการแก้ไขที่จำเป็นสำหรับการวิเคราะห์ด้วยตนเอง
BluePill เป็นต้นแบบเชิงวิชาการที่เรารักษาไว้ในเวลาว่าง: คำติชมของคุณมีค่า!
BluePill สามารถตอบโต้ยาเม็ดสีแดงจำนวนมากที่มีเป้าหมายไฮเปอร์ไวเซอร์, debuggers, เครื่องมือของบุคคลที่สามและสิ่งประดิษฐ์เวลา มันสร้างบนเครื่องมือไบนารีแบบไดนามิก (DBI) เพื่อตรวจสอบการสืบค้นว่ามัลแวร์สามารถสร้างสภาพแวดล้อมที่มองหาสิ่งประดิษฐ์การเปลี่ยนแปลงผลลัพธ์ของพวกเขาเมื่อพวกเขาอาจเปิดเผยการปรากฏตัวของระบบการวิเคราะห์อัตโนมัติหรือตัวแทนมนุษย์ BluePill เสนออินเทอร์เฟซระยะไกล GDB เพื่อแก้ไขข้อบกพร่องตัวอย่างในขณะที่ดูแลการหลีกเลี่ยงในนามของนักวิเคราะห์พร้อมกับกลไกการปะทุใหม่เพื่อซ่อนการเปลี่ยนแปลงรหัสที่เกิดขึ้นในดีบักเกอร์จากแผนการตรวจสอบตนเอง
เราทดสอบ bluepill บนมัลแวร์ Windows PE32 ที่ต่างกันซึ่งทำงานบน Windows 7 SP1 32 บิต: ตัวอย่างเราสามารถเรียกใช้งานที่ได้รับการปกป้องด้วย VMProtect รุ่นล่าสุดและตัวอย่างและตัวอย่างที่หลีกเลี่ยงได้เช่น Furtim
BluePill ได้รับการนำเสนอใน:
ในการตอบโต้การหลบหลีก DBI Bluepill ใช้ห้องสมุดของการบรรเทาที่เราเขียนสำหรับ Intel Pin เป็นส่วนหนึ่งของบทความของเรา : การใช้เครื่องมือไบนารีแบบไดนามิกเพื่อความปลอดภัย (และวิธีที่คุณจะได้รับมือแดง) จาก ASIACCS 2019 ใน BluePill คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการหลีกเลี่ยง DBI ในกระดาษ ประเมินระบบเครื่องมือไบนารีแบบไดนามิกสำหรับคุณสมบัติที่เห็นได้ชัดเจนและสิ่งประดิษฐ์ ที่เพิ่งปรากฏใน ACM DTRAP (preprint)
ด้านล่างรายการบางส่วนของ Evasions Bluepill ตอบโต้ในการทดสอบของเราในเครื่อง VirtualBox 5.2 Windows 7 SP1 32 บิตสำหรับเครื่องป้องกันที่ใช้งานได้และตัวอย่างหุ้มเกราะขนาดใหญ่:
| หมวดหมู่ | อินสแตนซ์ |
|---|---|
| ไฮเปอร์ไวเซอร์ | การเพิ่มเติมแขก, ไฟล์, รายการรีจิสทรี, ไลบรารีและไดรเวอร์จาก VirtualBox |
| ฮาร์ดแวร์ | สตริง BIOS และเฟิร์มแวร์, ที่อยู่ MAC, cpuid , ขนาดดิสก์, ความสามารถในการใช้พลังงาน/ความร้อน |
| เวลา | การตรวจจับช้าลงโดยใช้ rtdsc และ API ที่เกี่ยวข้องกับเวลา Windows |
| ซอฟต์แวร์ | สิ่งประดิษฐ์ของเครื่องมือตรวจสอบทั่วไป (กระบวนการทำงาน, Windows GUI), กระบวนการหลัก, เค้าโครงแป้นพิมพ์ HKL, เคอร์เซอร์เมาส์แช่แข็ง |
| การดีบัก | NtQueryInformationProcess ยกเว้นขั้นตอนเดียว, int 2d , Queries OS สำหรับ debuggers ที่ใช้งานอยู่ |
| คำค้นหา WMI | CPU, ขนาดดิสก์, ที่อยู่ MAC, ACPI, ภาษา MUI, VirtualBox VBOXVIDEO |
| DBI | ตัวชี้รั่วไหลด้วยคำแนะนำ FPU เนื้อหาหน่วยความจำและสิทธิ์ (เช่นหน้าป้องกัน, การบังคับใช้ NX) |
หมายเหตุ: ก่อนที่จะเปิดเผยต่อสาธารณะเพื่อ BH Europe 2019 เราทำการเปลี่ยนแปลงที่รุนแรงซึ่งทำลายการจัดการรหัส 64 บิตและ (เล็กน้อย) ของระบบย่อย WOW64: โปรดพิจารณาสถานการณ์เหล่านี้ทดลองในขณะที่เราทำการทดสอบการถดถอยและรู้สึกอิสระที่จะรายงานปัญหา
BluePill สร้างบน Intel Pin (V3.16 แนะนำ) และต้องใช้ Visual Studio 2015 หรือสูงกว่าสำหรับการรวบรวม
PIN มีการพึ่งพาบางอย่างที่ต้องมีการรวมด้วยตนเองในโครงการ เราสร้างไฟล์ Locals.props ที่ทำให้การกำหนดค่าโครงการง่ายขึ้น ค่าเริ่มต้นของมันคือ PIN ที่ติดตั้งใน C:Pin316 และส่วนหัว SDK 8.1 ที่ใช้งานอยู่:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
ตัวอย่างเช่นหากคุณต้องการใช้ส่วนหัว SDK 10.0.17763.0 หลังจากแก้ไขการตั้งค่าโครงการใน Visual Studio คุณควรเปลี่ยนค่าของคุณสมบัติ WinHPath เป็น C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um SIMILARY แก้ไขค่าคุณสมบัติหากส่วนหัว SDK 8.1 ของคุณติดตั้งใน C:/Program Files/ แทน C:/Program Files (x86)/ จุดประสงค์ของฟิลด์นี้คือการช่วยเหลือ PIN เมื่อมีเส้นทางที่แน่นอนของ Windows.h จากส่วนหัว CRT
ตอนนี้คุณควรจะรวบรวม Bluepill เมื่อการรวบรวมสิ้นสุดลงคุณจะพบไลบรารี bluepill32.dll ในไดเรกทอรี PIN หากคุณพบข้อผิดพลาด msvc_compat.h ที่หายไปตรวจสอบให้แน่ใจว่า $(PinFolder)extrascrtinclude เป็นเส้นทางที่ถูกต้อง
ในการเรียกใช้ปฏิบัติการภายใต้การใช้งาน BluePill:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
BluePill รองรับตัวเลือกบรรทัดคำสั่งต่อไปนี้:
| ตัวเลือก | ความหมาย |
|---|---|
-evasions | ตรวจจับและจัดการกับการหลบหนีส่วนใหญ่ (ดูด้านล่างสำหรับ DBI) |
-debugger | เปิดใช้งานโหมดดีบักเกอร์ผ่านอินเตอร์เฟสระยะไกล GDB |
-leak | DBI Evasions: แก้ไขการรั่วไหลของ EIP จริง (เช่นคำแนะนำ FPU) |
-nx | DBI Evasions: ตรวจสอบว่าหน้ารหัสสามารถเรียกใช้งานได้ |
-rw | การหลีกเลี่ยง DBI: ซ่อนหน้าเว็บที่เป็นของเครื่องยนต์ DBI |
ตัวอย่างเช่นในการเรียกใช้โปรแกรม evasive ชื่อ sample.exe ในโหมดอัตโนมัติเหมือนแซนด์บ็อกซ์ลอง:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
การเปิดใช้งาน -leak Mitigation มีผลกระทบต่อประสิทธิภาพน้อยที่สุดในขณะที่ -nx และในที่สุด -rw สามารถช่วยด้วย packers ที่ซับซ้อนที่พยายามตรวจสอบความสอดคล้องในพื้นที่ที่อยู่ของโปรแกรม
BluePill จะสร้างไฟล์ชื่อ evasions.log ภายใต้โฟลเดอร์ของ PIN C:Pin316 (แก้ไขตัวแปร LOGPATH ภายใน pintoolsrclogging.h
BluePill สนับสนุนการใช้ดีบั๊กเพื่อควบคุมการดำเนินการและดำเนินการผ่ามัลแวร์ เราพึ่งพาอินเตอร์เฟสระยะไกล GDB ของ PIN: BluePill สามารถใช้เป็นแบ็กเอนด์ระยะไกลจากเครื่องมือดีบักเกอร์ของคุณหากรองรับโปรโตคอล GDB ในต่อไปนี้เรามีคำแนะนำในการตั้งค่าเซสชันการดีบักกับ IDA Pro
ในการเปิดใช้งานอินเตอร์เฟสดีบั๊กคุณจะต้องระบุตัวเลือกบรรทัดคำสั่งเพิ่มเติมให้กับทั้ง PIN ( -appdebug -appdebug_server_port <port> ) และ BluePill ( -debugger ) ดังนี้:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
เราจะใช้ 10000 เป็นหมายเลขพอร์ตในคู่มือนี้ แอปพลิเคชันจะหยุดชั่วคราวจนกว่าคุณจะเชื่อมต่อดีบักเกอร์กับซ็อกเก็ต: อย่างไรก็ตามถ้าคุณลอง แนบ ดีบักเกอร์ท้องถิ่นเข้ากับกระบวนการคุณจะต้องทำการดีบักเครื่องยนต์พินทั้งหมดแทนแอปพลิเคชัน ผลลัพธ์ที่คาดหวังบนหน้าจอจะเป็นเช่น:

ตอนนี้คุณสามารถเปิดการทำงานใน IDA และเลือกแบ็กเอนด์ดี บั๊ก GDB ระยะไกล จาก Debugger->Switch debugger ตรวจสอบว่าตัวเลือก (เช่นหมายเลขพอร์ต) ถูกต้องโดยใช้ Debugger->Process options เช่นในภาพหน้าจอด้านล่าง:

ณ จุดนี้จะช่วยแทรกเบรกพอยต์ในที่อยู่บางอย่างในส่วนปฏิบัติการหลักเช่นบนจุดเข้าใช้งาน จากนั้นคุณสามารถเริ่มต้นเซสชันการดีบักด้วย Debugger->Start process IDA จะแจ้งให้คุณทราบว่า "มีกระบวนการที่ถูกดีบักโดยระยะไกลคุณต้องการแนบกับมันหรือไม่" - เพียงคลิก ใช่ และเซสชันการดีบักจะเริ่มขึ้นโดย EIP อยู่ที่ไหนสักแห่งใน ntdll.dll
เนื่องจากข้อมูลการแมปหน่วยความจำไม่สามารถใช้งานได้ตามค่าเริ่มต้นผ่านโปรโตคอลระยะไกล GDB เราจึงเพิ่มคำสั่งดีบักเกอร์แบบกำหนดเอง vmmap ที่สั่งให้ BluePill สร้างแผนที่ดังกล่าว เราดำเนินกระบวนการนี้โดยอัตโนมัติด้วยสคริปต์ addSegments.py ที่มีอยู่ใน scripts/ โฟลเดอร์: เพียงโหลดใน IDA ด้วย File->Script file สคริปต์จะเติมส่วนย่อยของ เซ็กเมนต์ ของ IDA ด้วยข้อมูลเค้าโครงหน่วยความจำ (เช่นส่วนและการอนุญาต) สำหรับแต่ละโมดูลรหัส หมายเหตุ: เราจะเพิ่มโค้ดในไม่ช้าเพื่ออัปเดตมุมมองย่อยโมดูลซึ่งปัจจุบันยังคงค้างอยู่
ตอนนี้คุณสามารถดีบักตัวอย่างของคุณเป็น Bluepill Shields คุณจากการหลบหลีกมากมาย :-)
โปรดทราบว่าการจัดการข้อยกเว้นต้องใช้วิธีแก้ปัญหาสำหรับการสนับสนุนเซิร์ฟเวอร์ GDB ปัจจุบันใน PIN เมื่อข้อยกเว้นไม่ควรส่งผ่านไปยังแอปพลิเคชัน (เช่น 0xc0000008 สำหรับด้ามจับที่ไม่ถูกต้องส่งผ่านไปยัง CloseHandle) ส่งคำสั่ง wait ในคอนโซล GDB ทันทีหลังจากที่คุณได้รับข้อความยกเว้นจากนั้นตัดการเชื่อมต่อและเชื่อมต่อ IDA ไปยัง BluePill ในระหว่างนี้ผู้ช่วยดีบักเกอร์จะทำการเรียกใช้งานเพื่อตอบสนองต่อคำสั่ง
หมายเหตุ: เดิมเราพึ่งพาเคล็ดลับการขาดการเชื่อมต่อสำหรับข้อยกเว้นอื่น ๆ สำหรับพวกเขาการเปลี่ยนแปลงที่เพิ่งเปิดตัวใหม่ในการเปิดตัว PIN หลังจาก 3.5 หนึ่งนำไปสู่ความล้มเหลวในการยืนยันภายในเมื่อทำการปรับแต่งตัวดีบัก ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID 1004 ดังนั้นเมื่อคุณเผชิญกับข้อยกเว้น 0xc0000005 จาก Opcode int 3 หรือการหลีกเลี่ยง int 2d คุณจะส่งข้อยกเว้นไปยังแอปพลิเคชัน อินเทอร์เฟซดีบักเกอร์ของ PIN จะไม่ถูกตรวจพบโดยตรง แต่ฝ่ายตรงข้ามอาจยังคงทำเช่นนั้นโดยใช้นาฬิกาเขียน ขณะนี้เรากำลังคิดถึงวิธีแก้ปัญหาเพื่อป้องกันสิ่งประดิษฐ์เช่นนี้
BluePill ใช้ฟังก์ชันการทำงานที่ไม่ซ้ำกันเพื่อแก้ไขส่วนโค้ดเมื่อทำการดีบักในขณะที่ซ่อนมันจากรหัสการดำเนินการ แพทช์ที่ใช้ยังคงมองไม่เห็นสำหรับแผนการต่อต้านการแวะการปรับเปลี่ยน (เช่นลำดับการตรวจสอบด้วยตนเอง) เนื่องจากมีกลไก JIT ของ PIN โดยสรุปเราทำการรวบรวม JIT ซ้ำเพื่อเพิ่มแทรมโพลีนที่แทนที่คำแนะนำ (ต้นฉบับ) ที่รวบรวมและไม่มีการสังเกตโดยกลไกการป้องกันรหัสเนื่องจากหน่วยความจำอ่านต่อไปได้ตามคำแนะนำโปรแกรมดั้งเดิม
การสร้างแพทช์แบ่งออกเป็นสามขั้นตอน:
พิจารณาบล็อกรหัสในภาพด้านล่างและสมมติว่าเราต้องการเขียนทับ mov ebp, esp ที่ที่อยู่ 0x771X37A5 ด้วย mov eax, esp ( 89 e0 ในไบนารี) จากนั้นทำการดำเนินการดำเนินการตามที่อยู่ 0x771X37A8

เมื่อ BluePill ทำงานในโหมดดีบักเกอร์เราสามารถสอน PIN สำหรับแพตช์ผ่านคำสั่ง GDB ที่กำหนดเอง: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> โดยมีที่อยู่ที่แสดงเป็นเลขฐานสิบหก สำหรับตัวอย่างด้านบนเราสามารถใช้: set_771c37a6_771c37a6_771c37a8_89,e0
แพตช์สามารถลบออกได้โดยใช้คำสั่ง GDB ที่กำหนดเองอื่น: rm_<START_ADDR>_<END_ADDR>
หากคุณใช้ BluePill ในโครงการวิชาการหรือคุณเชื่อว่ามันจะพอดีกับส่วนการสนทนาในบทความของคุณเราจะขอบคุณถ้าคุณสามารถอ้างอิงงานของเราโดยใช้รายการ BIBTEX ต่อไปนี้:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}