ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Поиск/выгрузка DLL библиотек
  #1  
Старый 04.06.2009, 02:05
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


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

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

  #2  
Старый 05.06.2009, 16:43
bons
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме:
1777055

Репутация: 347
По умолчанию

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

  #3  
Старый 05.06.2009, 17:13
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме:
1290766

Репутация: 1236


По умолчанию

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

Код:
 


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


snow white world wide
 
Ответить с цитированием

  #4  
Старый 05.06.2009, 19:43
bons
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме:
1777055

Репутация: 347
По умолчанию

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

  #5  
Старый 05.06.2009, 23:12
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Inject DLL в процесс из kernel-mode slesh Авторские статьи 4 12.05.2009 02:05
procedure DLL Collection + методы эффективного спама procedure С/С++, C#, Delphi, .NET, Asm 0 01.04.2009 05:53
Разборка dll ascas Soft - Windows 7 11.03.2006 14:55



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ