
Drltrace एक लाइब्रेरी कॉल्स ट्रेसर है जो विंडोज और लिनक्स अनुप्रयोगों के लिए है।
विंडोज परीक्षण बिल्ड
Drltrace विंडोज और लिनक्स अनुप्रयोगों के लिए एक गतिशील API कॉल ट्रेसर है। Drltrace DynamoRIO गतिशील बाइनरी इंस्ट्रुमेंटेशन फ्रेमवर्क पर आधारित है। Drltrace को मूल रूप से Derek Bruening द्वारा कार्यान्वित किया गया था और DynamoRIO और DrMemory फ्रेमवर्क के साथ वितरित किया गया था। इस रिपॉजिटरी में drltrace का एक स्वतंत्र संस्करण है जिसमें मैलवेयर विश्लेषण के लिए इसका उपयोग करने के लिए अतिरिक्त स्क्रिप्ट और सामग्री शामिल है। रिलीज़ बिल्ड यहाँ से डाउनलोड किया जा सकता है।
drltrace का उपयोग बहुत सरल है। उपयोगकर्ता को एक लॉग निर्देशिका और एक लक्ष्य प्रक्रिया का नाम निम्नलिखित तरीके से निर्दिष्ट करना होगा:
drltrace -logdir . -- calc.exe
बस इतना ही, उपकरण लक्ष्य प्रक्रिया में आवश्यक DLLs इंजेक्ट करेगा, इंस्ट्रुमेंटेशन शुरू करेगा और समानांतर में लक्ष्य प्रक्रिया में निष्पादित सभी लाइब्रेरी कॉल के बारे में जानकारी लॉग करेगा:
~~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]
-grepable तर्क का उपयोग करने पर grep के साथ पार्सिंग की जा सकती है; यह फ़ंक्शन नाम और तर्कों को एक पंक्ति में प्रिंट करता है:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:\Windows\Fonts\staticcache.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:\Windows\SysWOW64\calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:\Users\Max\Downloads\drltrace\drltrace\dynamorio\lib32\release\dynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:\Users\Max\Downloads\drltrace\drltrace\bin\release/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:\Windows\System32\CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:\Windows\System32\SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:\Windows\System32\GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:\Windows\System32\RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:\Windows\System32\IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:\Windows\System32\advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:\Windows\System32\cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:\Windows\System32\SHELL32.dll
Drltrace आसानी से अंतर-लाइब्रेरी कॉल को फ़िल्टर कर सकता है और केवल मुख्य मॉड्यूल (या हीप) से किए गए API कॉल को प्रिंट कर सकता है, -only_from_app विकल्प निर्दिष्ट करके, जो उन अनुप्रयोगों के लिए बहुत उपयोगी है जो बड़े लॉग उत्पन्न करते हैं। अधिक सूक्ष्म नियंत्रण के लिए, -filter विकल्प उपयोगकर्ता को एक फ़िल्टर कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करने की अनुमति देता है ताकि विशिष्ट श्वेतसूचीबद्ध फ़ंक्शनों को फ़िल्टर किया जा सके, या कालीसूचीबद्ध फ़ंक्शनों को अनदेखा किया जा सके (उदाहरण के लिए filter.config फ़ाइल देखें)। Drltrace में कुछ उपयोगी बाहरी स्क्रिप्ट भी हैं जो किसी विशेष लाइब्रेरी के लिए API कॉल को फ़िल्टर करने, केवल संभावित रूप से दिलचस्प API कॉल और स्ट्रिंग को प्रिंट करने के लिए हैं।
Drltrace के मुख्य मॉड्यूल BSD के तहत वितरित किए जाते हैं।
Drltrace के लिए आवश्यक कुछ फाइलें LGPL के तहत वितरित की जाती हैं। अधिक जानकारी के लिए स्रोत फ़ाइलें देखें।
मैलवेयर विश्लेषण एक आसान काम नहीं है। Themida और Armadillo जैसे परिष्कृत सॉफ़्टवेयर पैकर्स और निश्चित रूप से मैलवेयर लेखकों द्वारा लिखे गए दर्जनों अनाम पैकर्स, साथ ही कोड और डेटा एन्क्रिप्शन, ऐसे नमूनों के स्थैतिक रिवर्स इंजीनियरिंग को काफी कठिन (कुछ मामलों में पूरी तरह से असंभव) बना देते हैं, जिससे मैलवेयर विश्लेषकों का जीवन जटिल हो जाता है। ऐसे मामले में, API कॉल ट्रेसिंग वास्तविक दुर्भावनापूर्ण इरादे को समझने में लगने वाले समय को काफी कम कर सकती है और संरक्षित दुर्भावनापूर्ण कोड के बारे में कई तकनीकी विवरण प्रकट कर सकती है।
जबकि API-हुकिंग की पारंपरिक तकनीक को कई समाधानों में सफलतापूर्वक लागू किया गया है, इस दृष्टिकोण का मैलवेयर लेखकों द्वारा अच्छी तरह से अध्ययन किया गया है और इसे आसानी से पता लगाया और/या बायपास किया जा सकता है। इसके अलावा, ये उपकरण स्वतंत्र भारी-भरकम GUI अनुप्रयोगों (मालिकाना उत्पादों के रूप में) के रूप में वितरित किए जाते हैं, जिन्हें अक्सर मौजूदा मैलवेयर विश्लेषण कार्यप्रवाह में एकीकृत करना आसान नहीं होता है।
यदि हम लिनक्स दुनिया को देखें, तो वहाँ ltrace नामक एक अद्भुत उपकरण है। एक एकल bash कमांड का उपयोग करके, हम आसानी से किसी निश्चित निष्पादन योग्य के API कॉल का पूरा ट्रेस प्राप्त कर सकते हैं।
हमारे पास विंडोज के लिए ऐसा उपकरण (लिनक्स में ltrace की तरह) क्यों नहीं है जो आधुनिक मैलवेयर द्वारा उपयोग की जाने वाली एंटी-रिसर्च चालों के प्रति भी पारदर्शी हो?
यह पता चलता है कि एक तकनीक है जो हमें विंडोज के लिए ऐसा उपकरण रखने और निष्पादित प्रोग्राम के प्रति पारदर्शी रूप से API कॉल को ट्रेस करने में मदद कर सकती है। इस तकनीक को डायनेमिक बाइनरी इंस्ट्रुमेंटेशन या DBI कहा जाता है। DBI इंस्ट्रुमेंटेशन कोड के इंजेक्शन के माध्यम से रनटाइम पर बाइनरी एप्लिकेशन के व्यवहार का विश्लेषण करने की एक तकनीक है।
हालांकि, मैलवेयर विश्लेषण के लिए DBI का अनुप्रयोग अनपैकिंग ऑटोमेशन और निर्देशों, बुनियादी ब्लॉकों और फ़ंक्शन कॉल ट्रेसिंग के लिए कई प्रमाण-अवधारणाओं तक सीमित है। जहाँ तक हम जानते हैं, drltrace DBI पर आधारित API कॉल ट्रेसिंग के लिए पहला उपकरण है जिसका उपयोग व्यवहार में मैलवेयर विश्लेषण के लिए किया जा सकता है। हमने अपने wiki में कई मैलवेयर विश्लेषण उदाहरण प्रदान किए हैं जहां हमने वर्णन किया है कि कैसे drltrace ने IDA या डीबगर शुरू किए बिना कुछ ही मिनटों में परिष्कृत दुर्भावनापूर्ण नमूनों के बारे में कई आंतरिक तकनीकी विवरण प्रकट करने की अनुमति दी।
-logdir [ .] लाइब्रेरी कॉल डेटा प्रिंट करने के लिए लॉग निर्देशिका
-only_from_app [ false] केवल ऐप से लाइब्रेरी कॉल की रिपोर्ट करता है
-follow_children [ true] चाइल्ड प्रक्रियाओं को ट्रेस करता है
-print_ret_addr [ false] लाइब्रेरी कॉल का रिटर्न पता प्रिंट करता है
-num_unknown_args [ 2] प्रिंट करने के लिए अज्ञात लिबकॉल तर्कों की संख्या
-num_max_args [ 6] प्रिंट करने के लिए तर्कों की अधिकतम संख्या
-default_config [ true] डिफ़ॉल्ट कॉन्फ़िग फ़ाइल का उपयोग करें।
-config [ ""] कस्टम कॉन्फ़िग फ़ाइल का पथ।
-filter [filter.config] श्वेतसूची/कालीसूची फ़ाइल का पथ।
-ignore_underscore [ false] "_" से शुरू होने वाले लाइब्रेरी रूटीन नामों को अनदेखा करता है।
-help [ false] यह संदेश प्रिंट करें।
-version [ false] संस्करण संख्या प्रिंट करें।
-verbose [ 1] वर्बोसिटी बदलें।
-use_config [ true] कॉन्फ़िग फ़ाइल का उपयोग करें
-grepable [ false] Grep के अनुकूल आउटपुट
Drltrace बाहरी कॉन्फ़िगरेशन फ़ाइलों का समर्थन करता है जहाँ उपयोगकर्ता बता सकता है कि drltrace को कुछ API कॉल के लिए तर्क कैसे प्रिंट करने चाहिए।
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
प्रत्येक फ़ंक्शन तर्क को | द्वारा अलग किया जाना चाहिए। पहला तर्क रिटर्न प्रकार है, दूसरा तर्क स्वयं फ़ंक्शन का नाम है और बाकी फ़ंक्शन तर्क हैं। आउटपुट तर्कों को चिह्नित करने के लिए टोकन __out का उपयोग किया जाता है और इनपुट+आउटपुट तर्कों को चिह्नित करने के लिए ___inout का उपयोग किया जाता है।
आप हमारे Wiki पृष्ठ पर जटिल मैलवेयर के विश्लेषण के लिए drltrace का उपयोग करने के उदाहरण पा सकते हैं।
लॉग फ़ाइलों के साथ काम को आसान बनाने के लिए, हमने api_calls_viz.py नामक एक स्क्रिप्ट लागू की है जिसका उपयोग RGB इमेज उत्पन्न करने के लिए किया जा सकता है जहाँ प्रत्येक पिक्सेल रंग एक अद्वितीय API कॉल का प्रतिनिधित्व करता है। उदाहरण के लिए, नीचे दी गई तस्वीर WannaCry मैलवेयर की लॉग फ़ाइल का प्रतिनिधित्व करती है।

तस्वीर पर बड़े हरे क्षेत्र API कॉल (wcscmp/wcsicmp) का प्रतिनिधित्व करते हैं जिनका उपयोग दिलचस्प एक्सटेंशन (जैसे docx, xls, py) वाली फ़ाइलों का चयन करने के लिए किया जाता है। बैंगनी क्षेत्र API कॉल (FindFirstFile/FindNextFile/CryptEncrypt) का प्रतिनिधित्व करते हैं जिनका उपयोग डिस्क पर फ़ाइलों और फ़ोल्डरों की गणना और एन्क्रिप्ट करने के लिए किया जाता है।
स्क्रिप्ट उत्पन्न RGB इमेज का एक HTML प्रतिनिधित्व भी उत्पन्न कर सकती है जहाँ प्रत्येक तत्व को API कॉल का नाम दिखाने के लिए चुना जा सकता है।

अधिक जानकारी के लिए api_calls_viz निर्देशिका देखें।
आप इस Wiki पृष्ठ पर एक विस्तृत मैनुअल पा सकते हैं।
विंडोज, लिनक्स (भविष्य में macOS)।
x86, x64 (सूची में ARM)।
C और C++ मानक पुस्तकालय (और Python में लिखी गई लॉग हैंडलिंग स्क्रिप्ट)।
हमने अपने API कॉल ट्रेसर को डायनेमिक बाइनरी इंस्ट्रुमेंटेशन फ्रेमवर्क DynamoRIO के शीर्ष पर लागू करने का निर्णय लिया। Drltrace DynamoRIO से लोडलाइब्रेरी कॉल का इंस्ट्रुमेंटेशन करने के लिए कहता है ताकि लक्ष्य प्रक्रिया द्वारा लोड की जा रही नई लाइब्रेरी को संभाल सके। जब प्रक्रिया एक नई लाइब्रेरी लोड करने का प्रयास करती है, तो DynamoRIO नियंत्रण प्रवाह को drltracelib.dll पर रीडायरेक्ट करता है। बदले में, drltrace नए लोड किए गए DLL में निर्यात किए गए फ़ंक्शनों की गणना करता है और उनमें से प्रत्येक के लिए एक विशेष कॉलबैक पंजीकृत करता है। इस प्रकार, यदि कोई निर्यात किया गया फ़ंक्शन मैलवेयर द्वारा कॉल किया जाता है, तो इस फ़ंक्शन से पहले drltrace का कॉलबैक निष्पादित किया जाएगा और उपकरण फ़ंक्शन नाम और तर्क जैसी सभी आवश्यक जानकारी लॉग करने में सक्षम होगा। निष्पादन के परिणामों को सहेजने के लिए फ़ंक्शन के बाद एक और कॉलबैक पंजीकृत किया जा सकता है।
Intel Pin क्यों नहीं? हमने निम्नलिखित कारणों से DynamoRIO का उपयोग करने का निर्णय लिया:
drrun.exe का -syswide_on विकल्प)। हालांकि, भविष्य में ऐसी स्थितियों के लिए drltrace में विशेष समर्थन लागू करना आवश्यक है।हमारा इश्यू ट्रैकर drltrace के भविष्य के बारे में अधिक विवरण शामिल करता है।
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Joe Testa https://github.com/jtesta