Просмотр полной версии : Поиск/выгрузка DLL библиотек
Можно как то определить была ли загружена опредленная DLL(по имени DLL)а потом принудительно выгрузить её из всех процессов ?
получаешь список модулей каждого процесса (например с помощью EnumProcessModules)
внедряешься в адресное пространство процессов(например с помощью CreateRemoteThread), в которыхъ есть нужная тебе dll и вызываешь там freelibrary. Естественно если у твоей программы нет соответствующих прав. то ничего не получится.
и вообще вряд ли это хорошо повлияет на стабильность оскверненных процессов ;)
доказательство от противного =)
#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) );
}
если учитывать такие моменты то конечно нужны методы покруче. Например сканирование таблиц страниц в поисках "затерявшегося" модуля
Хм а если попытатся из процесса антивирусника какого то допустим выдернуть ntdll.dll то процесс накроется или прав нехватит?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot