Pembuatan uji Windows
Pembuatan uji Linux
Drltrace adalah pelacak panggilan API dinamis untuk aplikasi Windows dan Linux. Drltrace dibangun di atas kerangka instrumentasi biner dinamis DynamoRIO. Drltrace awalnya diimplementasikan oleh Derek Bruening dan didistribusikan dengan kerangka kerja DynamoRIO dan DrMemory. Repositori ini berisi drltrace versi mandiri dengan skrip dan materi tambahan tentang cara menggunakannya untuk analisis malware. Versi rilis dapat diunduh di sini.
Penggunaan drltrace sangat sederhana. Pengguna perlu menentukan direktori log dan nama proses target dengan cara berikut:
drltrace -logdir . -- calc.exe
Itu saja, alat ini akan memasukkan DLL yang diperlukan dalam proses target, memulai instrumentasi dan secara paralel akan mencatat informasi tentang semua panggilan perpustakaan yang dijalankan dalam proses target:
~~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
Format keluarannya sederhana dan dapat dengan mudah diuraikan dengan skrip eksternal:
~~[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]
Parsing dengan grep
dapat dilakukan ketika argumen -grepable
digunakan; ini mencetak nama fungsi dan argumen semuanya dalam satu baris:
~~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)}
Tabel pengidentifikasi unik modul dicetak di akhir file log:
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 dapat dengan mudah memfilter panggilan antar perpustakaan dan hanya mencetak panggilan API yang dilakukan dari modul utama (atau dari heap) aplikasi target dengan menentukan opsi -only_from_app
yang sangat berguna dalam kasus aplikasi yang menghasilkan log besar. Untuk kontrol yang lebih terperinci, opsi -filter
memungkinkan pengguna menentukan file konfigurasi filter untuk memfilter fungsi tertentu yang masuk daftar putih, atau mengabaikan fungsi yang masuk daftar hitam (lihat file filter.config untuk contohnya). Drltrace juga memiliki beberapa skrip eksternal yang berguna untuk memfilter panggilan API untuk perpustakaan tertentu, hanya mencetak panggilan dan string API yang berpotensi menarik.
Modul utama Drltrace didistribusikan di bawah BSD.
Beberapa file yang diperlukan untuk drltrace didistribusikan di bawah LGPL. Lihat file sumber untuk lebih jelasnya.
Analisis malware bukanlah tugas yang mudah. Pengemas perangkat lunak yang canggih seperti Themida dan Armadillo dan tentu saja lusinan pengemas tanpa nama yang ditulis oleh pembuat malware ditambah kode & enkripsi data secara signifikan memfasilitasi (dalam beberapa kasus membuatnya sama sekali tidak mungkin) rekayasa balik statis dari sampel tersebut membuat kehidupan analis malware menjadi rumit. Dalam kasus seperti itu, pelacakan panggilan API dapat secara signifikan mengurangi jumlah waktu yang diperlukan untuk memahami maksud jahat yang sebenarnya dan mengungkap banyak detail teknis tentang kode berbahaya yang dilindungi.
Meskipun teknik tradisional pengaitan API berhasil diterapkan di beberapa solusi, pendekatan ini dipelajari dengan baik oleh pembuat malware dan dapat dengan mudah dideteksi dan/atau dilewati. Selain itu, alat-alat ini didistribusikan sebagai aplikasi GUI kelas berat yang berdiri sendiri (sebagai produk berpemilik) yang seringkali tidak mudah untuk diintegrasikan ke dalam alur kerja analisis malware yang ada.
Jika kita melihat di dunia Linux, ada alat luar biasa yang disebut ltrace. Dengan menggunakan satu perintah bash, kita dapat dengan mudah mendapatkan jejak lengkap panggilan API dari executable tertentu.
Mengapa kita tidak memiliki alat seperti itu (seperti ltrace di Linux) untuk Windows yang juga transparan terhadap trik anti-penelitian yang digunakan oleh malware modern?
Ternyata ada teknik yang dapat membantu kita memiliki alat tersebut untuk Windows dan melacak panggilan API secara transparan terhadap program yang dijalankan. Teknik ini disebut instrumentasi biner dinamis alias DBI. DBI adalah teknik menganalisis perilaku aplikasi biner saat runtime melalui injeksi kode instrumentasi.
Namun, penerapan DBI untuk analisis malware dibatasi secara tidak wajar dengan membongkar otomatisasi dan beberapa bukti konsep untuk instruksi, blok dasar, dan pelacakan panggilan fungsi. Sejauh yang kami tahu, drltrace adalah alat pertama untuk pelacakan panggilan API berdasarkan DBI yang dalam praktiknya dapat digunakan untuk analisis malware. Kami menyediakan beberapa contoh analisis malware di wiki kami di mana kami menjelaskan bagaimana drltrace memungkinkan untuk menikmati banyak detail teknis internal dalam beberapa menit tentang sampel jahat yang canggih bahkan tanpa memulai IDA atau debugger.
-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 mendukung file konfigurasi eksternal di mana pengguna dapat menjelaskan bagaimana drltrace harus mencetak argumen untuk panggilan API tertentu.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
Setiap argumen fungsi harus dipisahkan oleh |
. Argumen pertama adalah tipe kembalian, argumen kedua adalah nama fungsi itu sendiri dan sisanya adalah argumen fungsi. Token __out
digunakan untuk menandai argumen keluaran dan ___inout
digunakan untuk menandai argumen masukan+keluaran.
Anda dapat menemukan contoh cara menggunakan drltrace untuk analisis malware kompleks di halaman Wiki kami.
Untuk mempermudah pekerjaan dengan file log, kami telah menerapkan skrip bernama api_calls_viz.py
yang dapat digunakan untuk menghasilkan gambar RGB di mana setiap warna piksel mewakili panggilan API unik. Misalnya, gambar di bawah mewakili file log malware WannaCry.
Area hijau besar pada gambar mewakili panggilan API ( wcscmp/wcsicmp
) yang digunakan untuk memilih file dengan ekstensi menarik (misalnya docx, xls, py) untuk mengenkripsinya. Area ungu mewakili panggilan API ( FindFirstFile/FindNextFile/CryptEncrypt
) yang digunakan untuk menghitung dan mengenkripsi file dan folder pada disk.
Script juga dapat menghasilkan representasi HTML dari gambar RGB yang dihasilkan dimana setiap elemen dapat dipilih untuk menampilkan nama panggilan API.
File HTML Mentah.
Lihat direktori api_calls_viz
untuk lebih jelasnya.
Anda dapat menemukan manual rinci di halaman Wiki ini.
Windows, Linux (macOS di masa depan).
x86, x64 (ARM dalam daftar).
Pustaka standar C dan C++ (dan skrip penanganan log yang ditulis dengan Python).
Kami memutuskan untuk mengimplementasikan pelacak panggilan API kami di atas kerangka instrumentasi biner dinamis DynamoRIO. Drltrace meminta DynamoRIO untuk melakukan instrumentasi panggilan LoadLibrary agar dapat menangani perpustakaan baru yang dimuat oleh proses target. Saat proses mencoba memuat perpustakaan baru, DynamoRIO mengalihkan aliran kontrol ke drltracelib.dll
. Pada gilirannya, drltrace menghitung fungsi yang diekspor dalam DLL yang baru dimuat dan mendaftarkan panggilan balik khusus untuk masing-masing fungsi tersebut. Jadi, jika beberapa fungsi yang diekspor dipanggil oleh malware, panggilan balik drltrace akan dieksekusi sebelum fungsi ini dan alat akan dapat mencatat semua informasi yang diperlukan seperti nama fungsi dan argumen. Callback lain mungkin didaftarkan setelah fungsi untuk menyimpan hasil eksekusi.
Mengapa bukan Intel Pin? Kami memutuskan untuk menggunakan DynamoRIO dilatarbelakangi oleh alasan berikut:
-syswide_on
opsi drrun.exe
). Namun, di masa depan, perlu diterapkan dukungan khusus di drltrace untuk situasi seperti itu.Pelacak masalah kami berisi rincian lebih lanjut tentang masa depan drltrace.
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Joe Testa https://github.com/jtesta