
एक PE लोडर और Windows API ट्रेसर। मैलवेयर विश्लेषण में उपयोगी।
यह प्रोजेक्ट मैलवेर विश्लेषण प्रक्रिया को आसान बनाने के लिए बनाया गया था। उद्देश्य एक एक्टिवेटर बाइनरी बनाना है जिसका काम उपयोगकर्ता द्वारा परिभाषित बाइनरी को लोड करना और Win32 API हुक का उपयोग करके निष्पादन की निगरानी करना है। प्रासंगिक डेटा तब डिस्क पर सहेजा जाता है। कोड x86 और x64 दोनों बाइनरी को सपोर्ट करता है।
मैंने एक ब्लॉग पोस्ट लिखा है जिसमें बताया गया है कि यह कैसे काम करता है: http://antonioparata.blogspot.com/2022/06/thematrix-process-inspection-tool-aimed.html
नई बाइनरी की निगरानी करने के लिए एक activator बनाना आवश्यक है। एक्टिवेटर उपयोगकर्ता इनपुट बाइनरी को लोड और मॉनिटर करेगा। एक्टिवेटर बनाने के लिए -add विकल्प का उपयोग करें। उपयोग का एक उदाहरण निम्नलिखित है:
c:\>TheMatrix.exe -add c:\path\to\my\binary.dll
Activator file created
c:\>regsvr32.exe TheMatrix.build.dll
यह कमांड एक नई PE फ़ाइल बनाएगा जो एक्टिवेटर का प्रतिनिधित्व करता है। एक्टिवेटर इनपुट बाइनरी के समान फ़ॉर्मेट (DLL या EXE) होगा।
एक बार बन जाने पर, आप इसे अपने पसंदीदा तरीके से चला सकते हैं (DLL के लिए सुझाया गया तरीका rundll32.exe उपयोगिता का उपयोग करना है)।
निष्पादन के दौरान, निगरानी किए गए फ़ंक्शन द्वारा उत्पन्न डेटा ./Desktop/thematrix/[process ID]/ पर सहेजा जाता है (यह utility.c में लागू log_data फ़ंक्शन पर निर्भर करता है)।
सीमाएं:
प्रोजेक्ट विशिष्ट APIs (जैसे GetModuleHandle, ...) को सही ढंग से काम करने की अनुमति देने के लिए PEB.Ldr संरचना को संशोधित करता है। यदि आप WOW64 सिस्टम (x64 OS पर x86 बाइनरी) पर एक्टिवेटर चलाते हैं, तो केवल x86 PEB.Ldr संशोधित होता है (WOW64 प्रक्रियाओं में x86 और x64 दोनों PEB होते हैं)। जब CPU x64 पर स्विच करता है, तो Windows Native APIs (ntdll.dll) PEB.Ldr के x64 संस्करण का उपयोग करेंगे। इसका तात्पर्य है कि एक्टिवेटर ठीक से काम नहीं कर सकता है। सुनिश्चित करने के लिए कि x86 काम करता है, बाइनरी को x86 OS पर चलाएँ।
नवनिर्मित फ़ाइल सभी विधियों को निर्यात नहीं करती है और इसमें मूल फ़ाइल संसाधन शामिल नहीं हैं। इससे संभावित त्रुटियाँ हो सकती हैं, उदाहरण के लिए यदि कोई DLL GetModuleFileName -> LoadLibrary -> FindResource कॉल करता है। यह कोड पथ मूल TheMatrix DLL को लोड करेगा जिसमें वांछित संसाधन नहीं है।
मॉनिटर में नए फ़ंक्शन जोड़ना एक आसान काम है, कृपया hooks.c फ़ाइल में Kernel32.dll और bcrypt.dll हुक के कुछ उदाहरण देखें। नया हुक जोड़ने के लिए hook_add फ़ंक्शन को कॉल करना पर्याप्त है। नीचे हुक निर्माण का एक उदाहरण दिखाया गया है:
LPVOID __stdcall hook_BCryptEncrypt(BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput, VOID* pPaddingInfo, PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG* pcbResult, ULONG dwFlags)
{
// save plain data
if (cbInput) {
char name[MAX_PATH] = { 0 };
snprintf(name, sizeof(name), "BCryptEncrypt_%llx_%d", (uint64_t)pbInput, cbInput);
log_data(cbInput, pbInput, name);
}
LPVOID ret = call_original(
hKey,
pbInput,
cbInput,
pPaddingInfo,
pbIV,
cbIV,
pbOutput,
cbOutput,
pcbResult,
dwFlags
);
return ret;
}
hook_add("Bcrypt.dll", "BCryptEncrypt", hook_BCryptEncrypt);
फ़ंक्शन का हुक किए गए फ़ंक्शन के समान हस्ताक्षर होना चाहिए। फ़ंक्शन call_original का उपयोग मूल फ़ंक्शन को कॉल करने के लिए किया जाता है। मूल फ़ंक्शन इनपुट पैरामीटर के साथ इस फ़ंक्शन को कॉल करना पर्याप्त है, फ्रेमवर्क आपके लिए सही फ़ंक्शन को कॉल करने का सारा भारी काम करेगा ;) call_original फ़ंक्शन का कॉल उसी थ्रेड में किया जाना चाहिए जो हुक को निष्पादित कर रहा है, अन्यथा प्रक्रिया क्रैश हो जाएगी।