
dll को मेमोरी में लोड करने के लिए एक छोटी x64 लाइब्रेरी।
DLL को मेमोरी में लोड करने के लिए एक छोटी x64 लाइब्रेरी।
फ़्लैग्स को जोड़ा जा सकता है
LIBRARYEX_NONE: डिस्क से मॉड्यूल को मेमोरी में मैप करें और एंट्रीपॉइंट निष्पादित करें।
LIBRARYEX_BYPASS_LOAD_CALLBACK: डिस्क से मॉड्यूल को प्राइवेट मेमोरी (अनबैक्ड) में मैप करें जो इमेज लोड कॉलबैक (PsSetLoadImageNotifyRoutine) को बायपास करता है।
LIBRARYEX_NO_ENTRY: मॉड्यूल के एंट्रीपॉइंट को निष्पादित न करें।
LIBRARYEX_BUFFER: मॉड्यूल को डिस्क के बजाय मेमोरी से मैप करें।
LdrLibraryलाइब्रेरी को मेमोरी में लोड करने के लिए उपयोग में आसान फ़ंक्शन। पहला पैरामीटर, निर्दिष्ट फ़्लैग्स के आधार पर, या तो लोड करने के लिए एक वाइड स्ट्रिंग मॉड्यूल नाम हो सकता है या मेमोरी एड्रेस जहाँ PE स्थित है।
/*!
* @brief
* load library into memory
*
* @param Buffer
* buffer context to load library
* either a wide string or a buffer pointer
* the to PE file to map (LIBRARYEX_BUFFER)
*
* @param Library
* loaded library pointer
*
* @param Flags
* flags
*
* @return
* status of function
*/
NTSTATUS LdrLibrary(
_In_ PVOID Buffer,
_Out_ PVOID* Library,
_In_ ULONG Flags
);
यह उदाहरण दिखाता है कि डिस्क से (System32 पथ से) मॉड्यूल कैसे लोड करें:
PVOID Module = { 0 };
ULONG Flags = { 0 };
//
// mapping flags to be used by the library
//
Flags = LIBRARYEX_NONE;
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( L"advapi32.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", Module );
यह उदाहरण दिखाता है कि मेमोरी बफर से मॉड्यूल कैसे लोड करें:
PVOID Module = { 0 };
ULONG Flags = { 0 };
//
// mapping flags to be used by the library
//
Flags = LIBRARYEX_NONE |
LIBRARYEX_BUFFER;
//
// read file on disk into memory
//
if ( ! ( Image = ReadFileBuffer( L"C:\\Windows\\System32\\advapi32.dll", NULL ) ) ) {
puts( "[-] ReadFileBuffer Failed" );
return;
}
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( Image, &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", Module );
उनके एपीआई सेट के आधार पर मॉड्यूल लोड करना भी संभव है (केवल win10+ समर्थन):
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( L"api-ms-win-base-util-l1-1-0.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", );
LdrLibraryExLdrLibraryEx कुछ फ़ंक्शनों को हुक करने की अनुमति देता है ताकि यह संशोधित किया जा सके कि लाइब्रेरी को मेमोरी में कैसे मैप किया जाना चाहिए।
//
// mapping flags to be used by the library
// and insert the loaded module into Peb
//
Flags = LIBRARYEX_BYPASS_LOAD_CALLBACK |
LIBRARYEX_NO_ENTRY;
//
// init LibraryEx context
//
if ( ! NT_SUCCESS( Status = LdrLibraryCtx( &Ctx, Flags ) ) ) {
printf( "[-] LdrLibraryCtx Failed: %d\n", Status );
goto END;
}
//
// hook function
//
Ctx.LdrLoadDll = C_PTR( HookLdrLoadDll );
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibraryEx( &Ctx, L"cryptsp.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
यह कोडबेस x86_64-mingw के लिए लिखा और अनुकूलित किया गया है और संभवतः यह Visual Studio के तहत काम नहीं करेगा या कंपाइल नहीं होगा।
निम्नलिखित संसाधनों और परियोजनाओं को बहुत बड़ा श्रेय जाता है:
इस प्रोजेक्ट का उपयोग वास्तविक दुनिया के वातावरण या ऑपरेशन में नहीं किया जाना चाहिए। मैंने यह मुख्य रूप से यह समझने और सीखने के लिए लिखा था कि विंडोज लोडर कैसे काम करता है। मैंने इसे एक लाइब्रेरी के रूप में लिखा क्योंकि मैं इसे अन्य प्रकार की सार्वजनिक और निजी परियोजनाओं के लिए उपयोग करना चाहता था। मैंने अपना लक्ष्य हासिल कर लिया। अलविदा।