Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Поиск/выгрузка DLL библиотек (https://forum.antichat.xyz/showthread.php?t=123521)

_nic 04.06.2009 02:05

Поиск/выгрузка DLL библиотек
 
Можно как то определить была ли загружена опредленная DLL(по имени DLL)а потом принудительно выгрузить её из всех процессов ?

bons 05.06.2009 16:43

получаешь список модулей каждого процесса (например с помощью EnumProcessModules)
внедряешься в адресное пространство процессов(например с помощью CreateRemoteThread), в которыхъ есть нужная тебе dll и вызываешь там freelibrary. Естественно если у твоей программы нет соответствующих прав. то ничего не получится.
и вообще вряд ли это хорошо повлияет на стабильность оскверненных процессов ;)

sn0w 05.06.2009 17:13

доказательство от противного =)

Код:




#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)  ); 
 }


bons 05.06.2009 19:43

если учитывать такие моменты то конечно нужны методы покруче. Например сканирование таблиц страниц в поисках "затерявшегося" модуля

_nic 05.06.2009 23:12

Хм а если попытатся из процесса антивирусника какого то допустим выдернуть ntdll.dll то процесс накроется или прав нехватит?


Время: 17:26