Поиск/выгрузка DLL библиотек

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 4 Jun 2009.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Можно как то определить была ли загружена опредленная DLL(по имени DLL)а потом принудительно выгрузить её из всех процессов ?
     
  2. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    получаешь список модулей каждого процесса (например с помощью EnumProcessModules)
    внедряешься в адресное пространство процессов(например с помощью CreateRemoteThread), в которыхъ есть нужная тебе dll и вызываешь там freelibrary. Естественно если у твоей программы нет соответствующих прав. то ничего не получится.
    и вообще вряд ли это хорошо повлияет на стабильность оскверненных процессов ;)
     
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    доказательство от противного =)

    Code:
     
    
    
    #define LOAD_ORDER_TYPE 0 
    #define MEM_ORDER_TYPE	1 
    #define INIT_ORDER_TYPE	2 
    #define FUNC_ERROR	0 
    #define FUNC_SUCCESS 1 
    #define BUFMAXLEN 512 
    
    
    //#define PEB_ADDRESS						0x7ffdf000 
    #define PEB_LDR_DATA_OFFSET				0x0C    // RVA to _PEB_LDR_DATA (ProcessModuleInfo) 
     
    #define LDR_DATA_IMAGE_BASE				0x18	// MODULE_ITEM.ImageBase 
    #define LDR_DATA_IMAGE_SIZE				0x20	// MODULE_ITEM.ImageSize 
    #define LDR_DATA_PATHFILENAME_OFFSET	0x24	// MODULE_ITEM.PathFileName 
    #define LDR_DATA_FILENAME_OFFSET		0x2C	// MODULE_ITEM.FileName 
     
    	  
    typedef struct _PEB { 
    	/*000*/ BOOLEAN              InheritedAddressSpace; 
    	/*001*/ BOOLEAN              ReadImageFileExecOptions; 
    	/*002*/ BOOLEAN              BeingDebugged; 
    	/*003*/ BOOL                 SpareBool; // alloc size 
    	/*004*/ HANDLE               Mutant; 
    	/*008*/ PVOID                ImageBaseAddress; 
    	/*00C   PPROCESS_MODULE_INFO*/PVOID ProcessModuleInfo; 
    	/*010   PPROCESS_PARAMETERS*/ PVOID ProcessParameters; 
    	/*...*/ 
    /*1E8*/} PEB, *PPEB; 
     
    // At PEB+0x0C (PEB+PEB_LDR_DATA_OFFSET) : PEB_LDR_DATA (ProcessModuleInfo) 
    
    typedef struct _PEB_LDR_DATA { 
    	/*000*/  ULONG Length; 
    	/*004*/  BOOLEAN Initialized; 
    	/*008*/  PVOID SsHandle; 
    	/*00C*/  LIST_ENTRY ModuleListLoadOrder; 
    	/*014*/  LIST_ENTRY ModuleListMemoryOrder; 
    	/*018*/  LIST_ENTRY ModuleListInitOrder; 
    	/*020*/ } PEB_LDR_DATA, *PPEB_LDR_DATA; 
    
         
    // At PEB_LDR_DATA->ModuleListLoadOrder 
    typedef struct _MODULE_ITEM { 
    	/*000*/ LIST_ENTRY     ModuleListLoadOrder; 
    	/*008*/ LIST_ENTRY     ModuleListMemoryOrder; 
    	/*010*/ LIST_ENTRY     ModuleListInitOrder; 
    	/*018*/ DWORD          ImageBase; 
    	/*01C*/ DWORD          EntryPoint; 
    	/*020*/ DWORD          ImageSize; 
    	/*024*/ UNICODE_STRING PathFileName; 
    	/*02C*/ UNICODE_STRING FileName; 
    	/*034*/ ULONG          ModuleFlags; 
    	/*038*/ WORD           LoadCount; 
    	/*03A*/ WORD           Fill; 
    	/*03C*/ DWORD          dw3c; 
    	/*040*/ DWORD          dw40; 
    	/*044*/ DWORD          TimeDateStamp; 
    	/*048*/ } MODULE_ITEM, *PMODULE_ITEM; 
     
    // Winnt.h : 
    /*typedef struct _LIST_ENTRY { 
       struct _LIST_ENTRY *Flink; 
       struct _LIST_ENTRY *Blink; 
    } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY; 
    */ 
     
    
    
    
    
    
    
    
    
        
    
    static PLIST_ENTRY pUserModuleListLoadOrder;   
    static PLIST_ENTRY pUserModuleListMemoryOrder;   
    static PLIST_ENTRY pUserModuleListInitOrder;   
        
     // Walks one of the three modules double linked lists referenced by the PEB, adds old pointer back as first in list   
     /*
     int WalkModuleListAdd(char ModuleListType, char *szDllToStrip)   
     {   
         PLIST_ENTRY pUserModuleListHead, pUserModuleListPtr;   
                
         DWORD PebBaseAddr, dwOffset=0;   
         PPEB_LDR_DATA pLdrData;   
            
         PebBaseAddr = GetPEB(0);   
         if(PebBaseAddr == FUNC_ERROR)   
             return FUNC_ERROR;   
         pLdrData=(PPEB_LDR_DATA)(DWORD *)(*(DWORD *)(PebBaseAddr + PEB_LDR_DATA_OFFSET)); // PEB.ProcessModuleInfo = PEB + 0x0C   
         if(!pLdrData->Initialized)    
             return FUNC_ERROR;   
        
         // Init chained list head and offset   
         if(ModuleListType == LOAD_ORDER_TYPE)   
         {   
             // LOAD_ORDER_TYPE   
             pUserModuleListHead = (PLIST_ENTRY)(&(pLdrData->ModuleListLoadOrder));   
             pUserModuleListPtr = pUserModuleListLoadOrder;   
             dwOffset = 0x0;   
         } else if(ModuleListType == MEM_ORDER_TYPE)   
         {   
             // MEM_ORDER_TYPE   
             pUserModuleListHead = (PLIST_ENTRY)(&(pLdrData->ModuleListMemoryOrder));   
             pUserModuleListPtr = pUserModuleListMemoryOrder;   
             dwOffset = 0x08;   
         } else if(ModuleListType == INIT_ORDER_TYPE)   
         {   
             // INIT_ORDER_TYPE   
             pUserModuleListHead = (PLIST_ENTRY)(&(pLdrData->ModuleListInitOrder));   
             pUserModuleListPtr = pUserModuleListInitOrder;   
             dwOffset = 0x10;   
         }   
         else return FUNC_ERROR;   
            
        
         // Add this dll :   
             pUserModuleListPtr->Blink = pUserModuleListHead;   
             pUserModuleListPtr->Flink = (pUserModuleListHead->Flink);   
             pUserModuleListHead->Flink = pUserModuleListPtr;   
             (pUserModuleListPtr->Flink)->Blink = pUserModuleListPtr;   
        
         return FUNC_SUCCESS;   
     }   
      */
    
    
    
     // Walks one of the three modules double linked lists referenced by the PEB   
    static int remmodule(char ModuleListType, DWORD modBase)   
     {   
         PLIST_ENTRY pUserModuleListHead, pUserModuleListPtr;   
         PLIST_ENTRY *pHiddenModuleListPtr;   
        
         DWORD PebBaseAddr, dwOffset=0;   
         DWORD ImageBase, ImageSize;   
         PPEB_LDR_DATA pLdrData;   
         PUNICODE_STRING pImageName;   
         char szImageName[BUFMAXLEN]; // Non-unicode string   
            
         PebBaseAddr = (DWORD)GetPeb();   
         if(PebBaseAddr == FUNC_ERROR)   
             return FUNC_ERROR;   
         pLdrData=(PPEB_LDR_DATA)(DWORD *)(*(DWORD *)(PebBaseAddr + PEB_LDR_DATA_OFFSET)); // PEB.ProcessModuleInfo = PEB + 0x0C   
         if(!pLdrData->Initialized)    
             return FUNC_ERROR;   
        
         // Init chained list head and offset   
         if(ModuleListType == LOAD_ORDER_TYPE)   
         {   
             // LOAD_ORDER_TYPE   
             pUserModuleListHead = pUserModuleListPtr = (PLIST_ENTRY)(&(pLdrData->ModuleListLoadOrder));   
             pHiddenModuleListPtr = &pUserModuleListLoadOrder;   
             dwOffset = 0x0;   
         } else if(ModuleListType == MEM_ORDER_TYPE)   
         {   
             // MEM_ORDER_TYPE   
             pUserModuleListHead = pUserModuleListPtr = (PLIST_ENTRY)(&(pLdrData->ModuleListMemoryOrder));   
             pHiddenModuleListPtr = &pUserModuleListMemoryOrder;   
             dwOffset = 0x08;   
         } else if(ModuleListType == INIT_ORDER_TYPE)   
         {   
             // INIT_ORDER_TYPE   
             pUserModuleListHead = pUserModuleListPtr = (PLIST_ENTRY)(&(pLdrData->ModuleListInitOrder));   
            pHiddenModuleListPtr = &pUserModuleListInitOrder;   
             dwOffset = 0x10;   
         }   
         else return FUNC_ERROR;   
            
         do   
         {   
             // Jump to next MODULE_ITEM structure   
             pUserModuleListPtr = pUserModuleListPtr->Flink;   
             pImageName = (PUNICODE_STRING)( ((DWORD)(pUserModuleListPtr)) + (LDR_DATA_PATHFILENAME_OFFSET-dwOffset));   
             ImageBase = *(DWORD *)(((DWORD)(pUserModuleListPtr)) + (LDR_DATA_IMAGE_BASE-dwOffset));   
             ImageSize = *(DWORD *)(((DWORD)(pUserModuleListPtr)) + (LDR_DATA_IMAGE_SIZE-dwOffset));   
        
             //Convert string from unicode and to lower case : 
    		 //wide2byte(szImageName, pImageName->Buffer, BUFMAXLEN);
    		 //lowercase(szImageName);
             //if(strstr((char*)szImageName, szDllToStrip) != 0 ) {  
    		 if(ImageBase == modBase)
             {   
    
    			 // Hide this dll :   
                 // throw this module away (out of the double linked list)   
                (pUserModuleListPtr->Blink)->Flink = (pUserModuleListPtr->Flink);   
                (pUserModuleListPtr->Flink)->Blink = (pUserModuleListPtr->Blink);   
        
                *pHiddenModuleListPtr = pUserModuleListPtr;   
    
    
             }   
         }   while(pUserModuleListPtr->Flink != pUserModuleListHead);    
        
         return FUNC_SUCCESS;   
     }  
    
    //скрыть модуль
    static int LdrEliminateModule(DWORD modBase)   
     {   
         
             remmodule(LOAD_ORDER_TYPE, modBase);  
             remmodule(MEM_ORDER_TYPE, modBase); 
             remmodule(INIT_ORDER_TYPE, modBase);
    
    		 return 1;
        
    //     return (    WalkModuleListAdd(LOAD_ORDER_TYPE, szDllName)   
    //             &&  WalkModuleListAdd(MEM_ORDER_TYPE, szDllName)   
    //             &&  WalkModuleListAdd(INIT_ORDER_TYPE, szDllName)   );   
     }   
     
    2 people like this.
  4. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    если учитывать такие моменты то конечно нужны методы покруче. Например сканирование таблиц страниц в поисках "затерявшегося" модуля
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Хм а если попытатся из процесса антивирусника какого то допустим выдернуть ntdll.dll то процесс накроется или прав нехватит?