eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 3 апреля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Adler (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Как выгрузить чужую DLL из своего процесса?
Посл.ответ Сообщение

Ранг: 23.1 (новичок)
Статус: Участник

Создано: 27 января 2019 16:14 New!
Цитата · Личное сообщение · #1

Подскажите, реально ли выгрузить чужую дллку из своего процесса? Или каким-то образом деактивировать ее?
Есть софт, который как-то (через дров или еще как нибудь) добавляет во все процессы в системе свою либу. Я хочу ее как-то убрать, но GetModuleHandle/FreeLibrary почему-то не помогает. Функции вроде отрабатывают без ошибок, но дллка дальше есть в списке.

Что с этим можно сделать?

Ранг: 64.5 (постоянный)
Статус: Участник

Создано: 27 января 2019 16:27 New!
Цитата · Личное сообщение · #2

Первым делом узнай каким образом и что ее подгружает
Если драйвер, то он может блокировать выгрузку этой дллки либо подгружать ее заново
Можешь поискать уязвимый драйвер, от античитов например, они часто умеют писать и читать память, но нужно разобрать их протокол (это полезно для любой задачи нулевого кольца)

Ранг: 63.4 (постоянный)
Статус: Участник

Создано: 27 января 2019 16:35 · Поправил: kunix New!
Цитата · Личное сообщение · #3

Вызвать DllMain(DLL_PROCESS_DETACH)?
DLL_PROCESS_DETACH либо поддерживается, либо нет.
Если нет, то исчезновение кода DLL из адресного пространства процесса в любом случае приведет к крешу.
Тогда над подчищать говнище за DLL, и тут общих советов быть не может.

Ранг: 8.5 (гость)
Статус: Участник

Создано: 27 января 2019 16:46 New!
Цитата · Личное сообщение · #4

LdrUnloadDll не пробовали?
не всегда можно добиться адекватной работы кода через kernel32.

PS: если dll и прога х64, советую явно объявлять 64 битный указатель *__ptr64

Ранг: 23.1 (новичок)
Статус: Участник

Создано: 27 января 2019 16:51 New!
Цитата · Личное сообщение · #5

Boostyq
Может быть и драйвер, я не знаю как проверить, ибо не разбираюсь в ring0 совсем.

kunix
Попробую, но врядли поддерживает, раз не дает себя удалить.

dezmand07
не пробовал. прога 32 битная.

Ранг: 8.5 (гость)
Статус: Участник

Создано: 27 января 2019 16:58 · Поправил: dezmand07 New!
Цитата · Личное сообщение · #6

morgot пишет:
не пробовал.

вызывайте LdrUnloadDll на прямую из ntdll (без LoadLibrary и GetProcAddress) и попробуйте выгрузить.

прототип
typedef __int32(__stdcall* _LdrUnloadDll)(
void* ModuleHandle
);
_LdrUnloadDll LdrUnloadDll;

можно распарстить экспорт ntdll (IMAGE_EXPORT_DIRECTORY) и по номеру функции достать адрес её смещения
// номер функции LdrUnloadDll в таблице экспорта ntdll.dll = 174
unsigned __int32* fn_LdrUnloadDll = (unsigned __int32*)0;
for (; 174 < pExpDir->NumberOfNames;) {
fn_LdrUnloadDll = (unsigned __int32*)((unsigned __int32)NtDllBase + AddrFunc[174]);
break;
}
LdrUnloadDll = (_LdrUnloadDll)fn_LdrUnloadDll;

и вызывать, передав хендл dll
LdrUnloadDll(hModule);


Ранг: 169.5 (ветеран)
Статус: Участник

Создано: 28 января 2019 13:59 New!
Цитата · Личное сообщение · #7

dezmand07 пишет:
вызывайте LdrUnloadDll

По-моему предпочтительней будет LdrLoadDll перехватывать и не давать грузить что попало.


Ранг: 325.7 (мудрец)
Статус: Участник
born to be evil

Создано: 28 января 2019 17:21 New!
Цитата · Личное сообщение · #8

morgot пишет:
чужую дллку из своего процесса

f13nd пишет:
LdrLoadDll перехватывать и не давать грузить что попало

перехвати, на примере длл от антивирей/криптопровов, о результатах потом расскажешь

Ранг: 116.8 (ветеран)
Статус: Участник

Создано: 28 января 2019 18:07 New!
Цитата · Личное сообщение · #9

morgot пишет:
я не знаю как проверить, ибо не разбираюсь в ring0 совсем

В данной ситуации бессмысленно давать абстрактные советы, обозначьте пациента.
Там может все оказаться до смешного просто (как впрочем и наоборот, но со значительно меньшей вероятностью).

Ранг: 245.0 (наставник)
Статус: Участник

Создано: 28 января 2019 19:32 · Поправил: difexacaw New!
Цитата · Личное сообщение · #10

morgot

Если модуль добавляется во все процессы, то это не значит что он выгружается из них при завершении. Ядро чистит всё, снимая юзер процесс - нет смысла освобождать ресурсы. Может это авер двиг, который хучит всё и отменить невозможно, так как механизм выгрузки не реализован.

Обычно для такого спец софта выгрузка невозможна - оно модифицирует апп под себя, на это налаживается есчо какой то слой хуков/изменений и в конце даже если и будет попытка отката, она не сработает.

Вопрос частный, общее решение не существует(тк нет ничего конкретного, те общей задачи).

Ранг: 376.0 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 28 января 2019 19:56 New!
Цитата · Личное сообщение · #11

morgot пишет:
добавляет во все процессы в системе свою либу.

Первые ассоциации, это ветка реестра Appinit_Dlls (боян). Как минимум, можно почерпнуть инфу, идет ли загрузка либы оттуда. Если name is static, то (самому интересно работает ли, нет перед собой компа) можно попробовать свою дллку с таким же именем подгрузить первой и залочить запуск извне.

В остальном, как уже сказано выше, нужно разбирать как частный случай.

| Сообщение посчитали полезным: freudz



Ранг: 169.5 (ветеран)
Статус: Участник

Создано: 28 января 2019 20:57 New!
Цитата · Личное сообщение · #12

ajax пишет:
перехвати, на примере длл от антивирей/криптопровов, о результатах потом расскажешь

Я не видел упоминаний о возможном противодействии. А так - перехватывал, работало, не знаю о чем тут рассказывать.

Ранг: 2.8 (гость)
Статус: Участник

Создано: 28 января 2019 22:37 New!
Цитата · Личное сообщение · #13

Прошу не пинайте сильно нуба, спрашиваю что бы научиться.

Если это свое приложение, то нельзя ли самому составить IDT, сперва найдя нужные dll. Сохранить в каком-нибудь укромном месте и сверять обращения к IDT с действительно необходимым? При рассогласовании падать. Или это не даст эффекта? В чем опасность чужого длл в адрессном пространстве проца, если eip на него никогда не зайдет?

Ранг: 16.9 (новичок)
Статус: Участник

Создано: 28 января 2019 23:51 New!
Цитата · Личное сообщение · #14

ELF_7719116 пишет:
Первые ассоциации, это ветка реестра Appinit_Dlls

Соглашусь. Копать отсюда.

Как вариант предотвращения загрузки левака в СВОЙ процесс - хук LoadLibraryA/W/Ex, GetModuleHandleA/W при старте процесса. Хотя бы той же минхукой - https://github.com/TsudaKageyu/minhook

Ну в переопределенных функциях загрузки либы действовать уже по усмотрению )


Ранг: 287.3 (наставник)
Статус: Участник

Создано: 29 января 2019 08:33 New!
Цитата · Личное сообщение · #15

Я выгружал dll от аваста так:
Code:
  1. void __stdcall DisableASWHooks()
  2. {
  3.          HMODULE hModAsw = GetModuleHandle("aswhookx.dll");
  4.          if(hModAsw != NULL)
  5.          {
  6.                  Log("\r\nОтключаем хуки аваста\r\n");
  7.                  sprintf(s, "Module "aswhookx" is loaded at %08X\r\n", hModAsw);
  8.                  Log(s);
  9.  
  10.                  __PEB* pPeb;
  11.                  __asm
  12.                  {
  13.                         mov eax, fs:0x18
  14.                         mov ecx, dword ptr [eax + 0x30]; PEB
  15.                         mov pPeb, ecx
  16.                  }
  17.  
  18.                  _LDR_DATA_TABLE_ENTRY* pLdrHead = (_LDR_DATA_TABLE_ENTRY*)&pPeb->Ldr->InLoadOrderModuleList, *pLdrAsw = NULL,
  19.                         *pLdrCur = (_LDR_DATA_TABLE_ENTRY*)((_LIST_ENTRY*)pLdrHead)->Flink;
  20.                  while(pLdrCur != pLdrHead)
  21.                  {
  22.                         sprintf(s, "%08X %d %08X %08X %.*S\r\n", pLdrCur, pLdrCur->LoadCount, pLdrCur->Flags, pLdrCur->DllBase, pLdrCur->FullDllName.Length, pLdrCur->FullDllName.Buffer);
  23.                         Log(s);
  24.  
  25.                         wchar_t* sSlash = fwcsrchr(pLdrCur->FullDllName.Buffer, L'\');
  26.                         if(!fwcscmp(sSlash + 1, L"aswhookx.dll"))
  27.                               pLdrAsw = pLdrCur;
  28.  
  29.                         pLdrCur = (_LDR_DATA_TABLE_ENTRY*)pLdrCur->InLoadOrderLinks.Flink;
  30.                  }
  31.  
  32.                  if(pLdrAsw)
  33.                  {
  34.                         pLdrAsw->LoadCount = 1;
  35.                         if(!FreeLibrary(hModAsw)) LogError(701, GetLastError());
  36.                  }
  37.  
  38.                  //Sleep(3000);
  39.  
  40.                  hModAsw = GetModuleHandle("aswhookx.dll");
  41.                  if(!hModAsw) Log("Попытка выгрузки aswhookx удачна, при повторном поиске модуль aswhookx не найден - хуки сняты\r\n");
  42.          }
  43.  
  44.          Log("\r\n");
  45. }


Добавлено спустя 2 минуты
Функции, начинающиеся с префикса f (fwcsrchr, fwcscmp, ...) - обычные функции без префикса из ntdll. Просто писал без crt

Добавлено спустя 4 минуты
Но в dll был реализован механизм выгрузки.

Также видел некую прогу, которая реализовала механизм выгрузки этой dll гораздо проще - так же, как и в посте 3

Ранг: 63.4 (постоянный)
Статус: Участник

Создано: 29 января 2019 09:48 New!
Цитата · Личное сообщение · #16

Чо, у нас тут съезд вирмейкеров теперь?

Ранг: -0.4 (нарушитель)
Статус: Участник

Создано: 29 января 2019 13:55 New!
Цитата · Личное сообщение · #17

Да какой съезд? Сходка .
Не ожидал здесь увидеть только f13nd и DenCoder.
Так вроде глянешь, почитаешь их комментарии - приличные, уважаемые программисты-реверсеры .

Ранг: 23.1 (новичок)
Статус: Участник

Создано: 29 января 2019 14:27 New!
Цитата · Личное сообщение · #18

Спасибо всем за ответы, буду пробовать, по результатам отпишусь.

Это аверская дллка, AVG , называется почти как авастовская (aswhook). Просто увидел ее в списке модулей в каком-то своем приложении, стало интересно, как оно туда добавилось и почему не выгружается через FreeLibrary.

Ранг: 245.0 (наставник)
Статус: Участник

Создано: 29 января 2019 20:33 · Поправил: difexacaw New!
Цитата · Личное сообщение · #19

kunix

#16
Учитывая ник тс - да. Вот только вопрос сомнительный, те человек с этим ником такое не мог спросить. Это слишком примитивно.

Добавлено спустя 2 минуты
morgot

Как ваше здоровье, всё нормально ?
 eXeL@B —› Программирование —› Как выгрузить чужую DLL из своего процесса?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS