บิลด์ทดสอบ Windows
รุ่นทดสอบ Linux
Drltrace เป็นตัวติดตามการเรียก API แบบไดนามิกสำหรับแอปพลิเคชัน Windows และ Linux Drltrace สร้างขึ้นบนเฟรมเวิร์กเครื่องมือไบนารีแบบไดนามิกของ DynamoRIO Drltrace เริ่มต้นใช้งานโดย Derek Bruening และจัดจำหน่ายด้วยเฟรมเวิร์ก DynamoRIO และ DrMemory พื้นที่เก็บข้อมูลนี้มี drltrace เวอร์ชันสแตนด์อโลนพร้อมสคริปต์และเนื้อหาเพิ่มเติมเกี่ยวกับวิธีการใช้สำหรับการวิเคราะห์มัลแวร์ สามารถดาวน์โหลดรุ่นวางจำหน่ายได้ที่นี่
การใช้ drltrace นั้นง่ายมาก ผู้ใช้จำเป็นต้องระบุไดเร็กทอรีบันทึกและชื่อของกระบวนการเป้าหมายด้วยวิธีต่อไปนี้:
drltrace -logdir . -- calc.exe
เพียงเท่านี้ เครื่องมือจะแทรก DLL ที่จำเป็นในกระบวนการเป้าหมาย เริ่มเครื่องมือวัด และจะบันทึกข้อมูลเกี่ยวกับการเรียกไลบรารีทั้งหมดที่ดำเนินการในกระบวนการเป้าหมายพร้อมกัน:
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
รูปแบบของเอาต์พุตนั้นเรียบง่ายและสามารถแยกวิเคราะห์ได้ง่ายด้วยสคริปต์ภายนอก:
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
การแยกวิเคราะห์ด้วย grep
สามารถทำได้เมื่อใช้อาร์กิวเมนต์ -grepable
สิ่งนี้จะพิมพ์ชื่อฟังก์ชันและอาร์กิวเมนต์ทั้งหมดไว้ในบรรทัดเดียว:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:WindowsFontsstaticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
ตารางตัวระบุเฉพาะของโมดูลจะถูกพิมพ์ที่ส่วนท้ายของไฟล์บันทึก:
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:WindowsSysWOW64calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:UsersMaxDownloadsdrltracedrltracedynamoriolib32releasedynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:UsersMaxDownloadsdrltracedrltracebinrelease/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:WindowsSystem32CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:WindowsSystem32SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:WindowsSystem32GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:WindowsSystem32RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:WindowsSystem32IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:WindowsSystem32advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:WindowsSystem32cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:WindowsSystem32SHELL32.dll
Drltrace สามารถกรองการเรียกระหว่างไลบรารีได้อย่างง่ายดาย และพิมพ์เฉพาะการเรียก API ที่ดำเนินการจากโมดูลหลัก (หรือจากฮีป) ของแอปพลิเคชันเป้าหมาย โดยการระบุตัวเลือก -only_from_app
ซึ่งมีประโยชน์มากในกรณีของแอปพลิเคชันที่สร้างบันทึกขนาดใหญ่ สำหรับการควบคุมที่ละเอียดยิ่งขึ้น ตัวเลือก -filter
อนุญาตให้ผู้ใช้ระบุไฟล์การกำหนดค่าตัวกรองเพื่อกรองฟังก์ชันที่อนุญาตพิเศษเฉพาะ หรือละเว้นฟังก์ชันที่ขึ้นบัญชีดำ (ดูตัวอย่างในไฟล์ filter.config ) Drltrace ยังมีสคริปต์ภายนอกที่มีประโยชน์มากมายในการกรองการเรียก API สำหรับไลบรารีบางแห่ง พิมพ์เฉพาะการเรียกและสตริง API ที่น่าสนใจเท่านั้น
โมดูลหลักของ Drltrace มีการกระจายภายใต้ BSD
ไฟล์บางไฟล์ที่จำเป็นสำหรับ drltrace ได้รับการเผยแพร่ภายใต้ LGPL ดูไฟล์ต้นฉบับสำหรับรายละเอียดเพิ่มเติม
การวิเคราะห์มัลแวร์ไม่ใช่เรื่องง่าย โปรแกรมแพ็คซอฟต์แวร์ที่มีความซับซ้อน เช่น Themida และ Armadillo และแน่นอนว่าโปรแกรมแพ็คเกอร์นิรนามหลายสิบคนที่เขียนโดยผู้เขียนมัลแวร์ รวมถึงโค้ดและการเข้ารหัสข้อมูลช่วยอำนวยความสะดวกอย่างมาก (ในบางกรณีทำให้เป็นไปไม่ได้เลย) การทำวิศวกรรมย้อนกลับแบบคงที่ของกลุ่มตัวอย่างดังกล่าว ทำให้ชีวิตของนักวิเคราะห์มัลแวร์มีความซับซ้อน ในกรณีเช่นนี้ การติดตามการเรียก API สามารถลดระยะเวลาที่ต้องใช้ในการทำความเข้าใจเจตนาร้ายที่เกิดขึ้นจริงได้อย่างมาก และเปิดเผยรายละเอียดทางเทคนิคมากมายเกี่ยวกับโค้ดที่เป็นอันตรายที่ได้รับการป้องกัน
แม้ว่าเทคนิคดั้งเดิมของการเชื่อมต่อ API จะถูกนำมาใช้อย่างประสบความสำเร็จในโซลูชันต่างๆ มากมาย แต่แนวทางดังกล่าวได้รับการศึกษาอย่างดีจากผู้เขียนมัลแวร์ และสามารถตรวจจับและ/หรือข้ามได้อย่างง่ายดาย นอกจากนี้ เครื่องมือเหล่านี้ยังเผยแพร่เป็นแอปพลิเคชัน GUI เวอร์ชันหนักแบบสแตนด์อโลน (เป็นผลิตภัณฑ์ที่เป็นกรรมสิทธิ์) ซึ่งมักไม่ง่ายนักที่จะรวมเข้ากับขั้นตอนการวิเคราะห์มัลแวร์ที่มีอยู่
ถ้าเราดูในโลกของ Linux จะมีเครื่องมือที่ยอดเยี่ยมที่เรียกว่า ltrace การใช้คำสั่ง bash เดียวทำให้เราสามารถติดตามการเรียก API ของไฟล์ปฏิบัติการบางรายการได้อย่างง่ายดาย
เหตุใดเราจึงไม่มีเครื่องมือดังกล่าว (เช่น ltrace ใน Linux) สำหรับ Windows ซึ่งโปร่งใสต่อกลอุบายต่อต้านการวิจัยที่ใช้โดยมัลแวร์สมัยใหม่
ปรากฎว่ามีเทคนิคที่สามารถช่วยให้เรามีเครื่องมือดังกล่าวสำหรับ Windows และติดตามการเรียก API อย่างโปร่งใสไปยังโปรแกรมที่ดำเนินการ เทคนิคนี้เรียกว่าเครื่องมือวัดไบนารีแบบไดนามิกหรือที่รู้จักในชื่อ DBI DBI เป็นเทคนิคในการวิเคราะห์พฤติกรรมของแอปพลิเคชันไบนารี่ ณ รันไทม์ผ่านการแทรกโค้ดเครื่องมือวัด
อย่างไรก็ตาม การใช้ DBI สำหรับการวิเคราะห์มัลแวร์นั้นถูกจำกัดอย่างไม่สมควรโดยการแกะระบบอัตโนมัติและการพิสูจน์แนวคิดหลายประการสำหรับคำสั่ง บล็อกพื้นฐาน และการติดตามการเรียกใช้ฟังก์ชัน เท่าที่เราทราบ drltrace เป็นเครื่องมือแรกสำหรับการติดตามการเรียก API ตาม DBI ซึ่งสามารถนำมาใช้ในทางปฏิบัติสำหรับการวิเคราะห์มัลแวร์ เราได้จัดเตรียมตัวอย่างการวิเคราะห์มัลแวร์ไว้หลายตัวอย่างในวิกิของเรา ซึ่งเราได้อธิบายว่า drltrace อนุญาตให้มีรายละเอียดทางเทคนิคภายในจำนวนมากเกี่ยวกับตัวอย่างที่เป็นอันตรายที่ซับซ้อนในเวลาไม่กี่นาทีโดยไม่ต้องเริ่ม IDA หรือดีบักเกอร์เลย
-logdir [ .] Log directory to print library call data
-only_from_app [ false] Reports only library calls from the app
-follow_children [ true] Trace child processes
-print_ret_addr [ false] Print library call's return address
-num_unknown_args [ 2] Number of unknown libcall args to print
-num_max_args [ 6] Maximum number of arguments to print
-default_config [ true] Use default config file.
-config [ ""] The path to custom config file.
-filter [filter.config] The path of the whitelist/blacklist file.
-ignore_underscore [ false] Ignores library routine names starting with "_".
-help [ false] Print this message.
-version [ false] Print version number.
-verbose [ 1] Change verbosity.
-use_config [ true] Use config file
-grepable [ false] Grepable output
Drltrace รองรับไฟล์การกำหนดค่าภายนอกที่ผู้ใช้สามารถอธิบายว่า drltrace ควรพิมพ์อาร์กิวเมนต์สำหรับการเรียก API บางอย่างอย่างไร
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
อาร์กิวเมนต์ฟังก์ชันแต่ละรายการควรคั่นด้วย |
- อาร์กิวเมนต์แรกคือชนิดส่งคืน อาร์กิวเมนต์ที่สองคือชื่อฟังก์ชัน และส่วนที่เหลือคืออาร์กิวเมนต์ของฟังก์ชัน โทเค็น __out
ใช้เพื่อทำเครื่องหมายอาร์กิวเมนต์เอาต์พุต และ ___inout
ใช้เพื่อทำเครื่องหมายอาร์กิวเมนต์อินพุต+เอาต์พุต
คุณสามารถดูตัวอย่างวิธีใช้ drltrace เพื่อวิเคราะห์มัลแวร์ที่ซับซ้อนได้ที่หน้า Wiki ของเรา
เพื่อให้การทำงานกับไฟล์บันทึกง่ายขึ้น เราได้ใช้สคริปต์ชื่อ api_calls_viz.py
ซึ่งสามารถใช้เพื่อสร้างภาพ RGB โดยที่แต่ละสีพิกเซลแสดงถึงการเรียก API ที่ไม่ซ้ำกัน ตัวอย่างเช่น รูปภาพด้านล่างแสดงถึงไฟล์บันทึกของมัลแวร์ WannaCry
พื้นที่สีเขียวขนาดใหญ่บนรูปภาพแสดงถึงการเรียก API ( wcscmp/wcsicmp
) ซึ่งใช้เพื่อเลือกไฟล์ที่มีนามสกุลที่น่าสนใจ (เช่น docx, xls, py) เพื่อเข้ารหัสไฟล์เหล่านั้น พื้นที่สีม่วงแสดงถึงการเรียก API ( FindFirstFile/FindNextFile/CryptEncrypt
) ซึ่งใช้ในการระบุและเข้ารหัสไฟล์และโฟลเดอร์บนดิสก์
สคริปต์ยังสามารถสร้างการแสดง HTML ของภาพ RGB ที่สร้างขึ้น โดยสามารถเลือกแต่ละองค์ประกอบเพื่อแสดงชื่อของการเรียก API
ไฟล์ HTML ดิบ
ดูไดเรกทอรี api_calls_viz
สำหรับรายละเอียดเพิ่มเติม
คุณสามารถดูคู่มือโดยละเอียดได้ที่หน้า Wiki นี้
Windows, Linux (macOS ในอนาคต)
x86, x64 (ARM ในรายการ)
ไลบรารีมาตรฐาน C และ C++ (และสคริปต์การจัดการบันทึกที่เขียนด้วย Python)
เราตัดสินใจใช้ตัวติดตามการเรียก API ของเราบนเฟรมเวิร์กเครื่องมือไบนารีแบบไดนามิก DynamoRIO Drltrace ขอให้ DynamoRIO ดำเนินการควบคุมการเรียก LoadLibrary เพื่อให้สามารถจัดการกับไลบรารีใหม่ที่โหลดโดยกระบวนการเป้าหมายได้ เมื่อกระบวนการพยายามโหลดไลบรารีใหม่ DynamoRIO จะเปลี่ยนเส้นทางโฟลว์การควบคุมไปที่ drltracelib.dll
ในทางกลับกัน drltrace จะระบุฟังก์ชันที่ส่งออกใน DLL ที่เพิ่งโหลดใหม่และลงทะเบียนการโทรกลับพิเศษสำหรับแต่ละฟังก์ชัน ดังนั้น หากมัลแวร์เรียกใช้ฟังก์ชันที่ส่งออกบางส่วน การเรียกกลับของ drltrace จะถูกดำเนินการก่อนฟังก์ชันนี้ และเครื่องมือจะสามารถบันทึกข้อมูลที่จำเป็นทั้งหมด เช่น ชื่อฟังก์ชันและอาร์กิวเมนต์ได้ การโทรกลับอื่นอาจถูกลงทะเบียนหลังจากฟังก์ชันเพื่อบันทึกผลลัพธ์ของการดำเนินการ
ทำไมไม่ใช้พิน Intel? เราตัดสินใจใช้ DynamoRIO โดยมีเหตุผลดังต่อไปนี้:
-syswide_on
ของ drrun.exe
) อย่างไรก็ตาม ในอนาคต มีความจำเป็นที่จะต้องดำเนินการสนับสนุนพิเศษใน drltrace สำหรับสถานการณ์ดังกล่าวตัวติดตามปัญหาของเรามีรายละเอียดเพิ่มเติมเกี่ยวกับอนาคตของ drltrace
มักซิม ชูดราก https://github.com/mxmssh
ดีเร็ก บรุนนิ่ง https://github.com/derekbruening
โจ เทสต้า https://github.com/jtesta