Сейчас на форуме: jinoweb (+4 невидимых)

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


Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

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

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

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




Ранг: 90.1 (постоянный), 91thx
Активность: 0.290.56
Статус: Участник

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

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

-----
В облачке многоточия




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

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

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



Ранг: 19.5 (новичок), 8thx
Активность: 0.050.08
Статус: Участник

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

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

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




Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

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

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

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

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



Ранг: 19.5 (новичок), 8thx
Активность: 0.050.08
Статус: Участник

Создано: 27 января 2019 16:58 · Поправил: dezmand07
· Личное сообщение · #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);




Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

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

-----
2 оттенка серого





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

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

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

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

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

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

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

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

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




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

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

morgot

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

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

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

-----
vx




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

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

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

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

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

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


Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

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

-----
2 оттенка серого




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

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

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

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



Ранг: 21.5 (новичок), 4thx
Активность: 0.010.03
Статус: Участник

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

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

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

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

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




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 29 января 2019 08:33
· Личное сообщение · #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

-----
IZ.RU




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

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

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



Ранг: -12.6 (нарушитель), 11thx
Активность: 0.050.03
Статус: Участник

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

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




Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

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

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

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




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

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

kunix

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

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

Как ваше здоровье, всё нормально ?

-----
vx





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 07 мая 2019 16:57
· Личное сообщение · #20

Кстати, aswhook затормаживает работу приложений. И такой настройки, чтоб он не подгружался в самом авасте не видно

-----
IZ.RU





Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 21 января 2020 18:12
· Личное сообщение · #21

Оказывается, начиная с вин8.1 есть такая замечательная вещь, как process mitigation. Помимо прочего, там есть возможность запретить загрузку в процесс DLL, которые не подписаны Майкрософтом (т.е. все эти аверские и прочие пролетают).
Code:
  1. PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY s_p = { 0 };
  2.          s_p.MicrosoftSignedOnly = 1;
  3.          SetProcessMitigationPolicy(ProcessSignaturePolicy, &s_p, sizeof(PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY));

Минус, помимо того, что не работает на семерке и ниже, еще то, что если длл уже загружена, то эта функция ее не выгружает, настройки действуют только для последующих попыток. Т.е. нужно перезапускать процесс и задавать уже для нового эти настройки безопасности.

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


Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 21 января 2020 18:29
· Личное сообщение · #22

morgot

> есть возможность запретить загрузку в процесс DLL

И чем же защита по загрузке поможет выгрузить уже используемый модуль; вариант один - завершить процесс. Ну и таблетки не забудь

-----
vx





Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 21 января 2020 19:26
· Личное сообщение · #23

difexacaw
в существующий никак, но можно его перезапустить с новыми параметрами, и тогда уже авер ничего не подгрузит.



Ранг: 4.2 (гость)
Активность: 0.04=0.04
Статус: Участник

Создано: 24 января 2020 15:15
· Личное сообщение · #24

morgot, майки же подписывают длл/дрова аверам, разве нет? Да и политику можно вырубить удаленно, скорее всего.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 24 января 2020 16:09
· Личное сообщение · #25

morgot

Если авер не сможет что то загрузить, то прибьёт процесс.

-----
vx





Ранг: 69.9 (постоянный), 82thx
Активность: 0.140.73
Статус: Участник

Создано: 24 января 2020 19:23
· Личное сообщение · #26

hiddy
насчет дров не скажу, но дллка с чего должна быть подписана Майкрософтом, если у нее есть подпись Аваста или еще кого. А эта политика разрешает подгружать в процесс только дллки, подписанные Майкрософтом, т.е. стандартные длл винды. Касаемо отключить - не знаю, но не думаю, что авер будет такое делать. Иначе толку то с этой защиты, чтоб разный говнософт своими кривыми длл лез в мой процесс.

Добавлено спустя 1 минуту
difexacaw
я тестил на виртуалке, появляется просто ошибка вида "длл такое-то (тут путь к авасту) не является какой-то там валидной программой винды", точно не помню текст. Но прога запускается, и в списке модулей нет аверского или еще какого (я тестил и собственный инжектор) модуля.


 eXeL@B —› Программирование —› Как выгрузить чужую DLL из своего процесса?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати