Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита приложения от внедрения dll 
:(
    Опции темы
takep
Дата 30.5.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.8.2007

Репутация: нет
Всего: нет



Есть приложение, использующее функцию send (winsock). Как отловить событие когда стороннее приложение внедрит в моё приложение свою dll и поставит хук на функцию send. Обычно методом CreateRemoteThread.
надеюсь я правильно выразился=\

Это сообщение отредактировал(а) takep - 30.5.2008, 20:18
PM MAIL   Вверх
Rrader
  Дата 1.6.2008, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Отслеживай появление нового потока.
Код

Uses TlHelp32;
...
Function GetThreadsCount: Cardinal;
Var
  H: THandle;
  ProcStruct: PROCESSENTRY32;
Begin
  Result := 0;
  H := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  If H = 0 Then Exit;
  ProcStruct.dwSize := SizeOf(PROCESSENTRY32);
  Try
    If Process32First(H, ProcStruct) Then
    Repeat
      If ProcStruct.th32ProcessID = GetCurrentProcessId Then
      Begin
        Result := ProcStruct.cntThreads;
        Break;
      End;
    Until Not Process32Next(H, ProcStruct);
  Finally
    CloseHandle(H);
  End;  
End;



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Если перехват обычный, т.е. сплайсинг путём изменения первых байт функции, то можно, допустим, каждую секунду или перед каждым вызовом send сравнивать первые N байт начала функции send с байтами из ws2_32.dll, если не равно - значит функция перехвачена(только здесь ещё релоки надо восстановить в загруженной с диска dll, прежде чем сравнивать).

Другой способ перехват самому LdrLoadLibrary, но вопрос в том, как ты отличишь "вражескую" dll от системной при загрузке? Если известно, что-то о первой, тогда можно использовать.

Цитата(Rrader @  1.6.2008,  05:56 Найти цитируемый пост)
Отслеживай появление нового потока.


Плохой способ. А если поток создаст наше приложение? Как отличать их будешь? И потом, твой цикл загрузит процессор на 100%. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
takep
Дата 1.6.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.8.2007

Репутация: нет
Всего: нет



Цитата(W4FhLF @ 1.6.2008,  06:44)
сравнивать первые N байт начала функции send с байтами из ws2_32.dll

думаю это подойдет больше всего, попробую так.

А что насчет глобального хука на ZwOpenProcess?
PM MAIL   Вверх
Rrader
  Дата 1.6.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата(W4FhLF @  1.6.2008,  13:44 Найти цитируемый пост)
А если поток создаст наше приложение?

Можно вести учет своих потоков. Это несложно.

Цитата(W4FhLF @  1.6.2008,  13:44 Найти цитируемый пост)
И потом, твой цикл загрузит процессор на 100%.

Не загрузит, если этот код оформить в отдельный поток, и приписать внутри Sleep.

Добавлено через 1 минуту и 50 секунд
takep, ты знаешь, сплайсинг там или CreateRemoteThread?


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
takep
Дата 1.6.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.8.2007

Репутация: нет
Всего: нет



Цитата(Rrader @ 1.6.2008,  10:24)
Цитата(W4FhLF @  1.6.2008,  13:44 Найти цитируемый пост)
А если поток создаст наше приложение?

Можно вести учет своих потоков. Это несложно.

Добавлено @ 10:26
takep, ты знаешь, сплайсинг там или CreateRemoteThread?

Знаю

А пример учета своих потоков можно?
PM MAIL   Вверх
W4FhLF
Дата 1.6.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(takep @  1.6.2008,  10:18 Найти цитируемый пост)
думаю это подойдет больше всего, попробую так.


Всё, что нужно есть в библиотеке advApiHook.

Цитата(takep @  1.6.2008,  10:18 Найти цитируемый пост)
А что насчет глобального хука на ZwOpenProcess?


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

Цитата(Rrader @  1.6.2008,  10:24 Найти цитируемый пост)
Можно вести учет своих потоков. Это несложно.


Те, что создашь ты сам можно, а те, что будут созданы сторонними компонентами, внутри системных функций или dll-модулями вполне легального ПО? 

Цитата(Rrader @  1.6.2008,  10:24 Найти цитируемый пост)
Не загрузит, если этот код оформить в отдельный поток, и приписать внутри Sleep.


Хорошо, когда твой поток зайдёт в Sleep, то управление передасться на поток, который загрузит dll и уничтожится, а в случае многоядерного процессора эти два потока могут выполняться одновременно и неизвестно, какой из потоков первый завершит выполнение smile 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rrader
  Дата 1.6.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата

Хорошо, когда твой поток зайдёт в Sleep, то управление передасться на поток, который загрузит dll и уничтожится, а в случае многоядерного процессора эти два потока могут выполняться одновременно и неизвестно, какой из потоков первый завершит выполнение

Я предлагал, чтобы следящий поток работал все время с программой. И завершение его произойдет при завершении программы.

Это сообщение отредактировал(а) Rrader - 1.6.2008, 12:10


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(Rrader @  1.6.2008,  12:02 Найти цитируемый пост)
Я предлагал, чтобы следящий поток работал все время с программой.


Строго говоря, потоки в Windows не работают всё время, если я правильно тебя понял. Они делят процессорное время с другими потоками. Когда поток заходит в Sleep управление передаётся другим потоками и может быть передано в том числе и тому, который загрузит dll, пока следящий поток спит. Если следящий поток крутится всё время - это нерациональное использование ресурсов просто напросто. К тому же, чтобы подгрузить DLL вовсе необязательно создавать поток, достаточно изменить контекст уже существующего потока в процессе(насильно переправить его исполнение на наш код). 

Но вообще, почему твой метод в прицнипе нароботоспособен, так это потому, что обычно в момент внедрения своей dll все потоки приложения-жертвы останавливаются(SuspendThread), а после вновь запускаются(ResumeThread). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rrader
  Дата 1.6.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата

если я правильно тебя понял

Ну не совсем. smile Я ориентировался на то, что мы знаем, сколько "наших" потоков в программе. И тогда неважно, когда произойдет внедрение. Мы это можем отследить в одной из итерации следящего потока, рано или поздно.

Добавлено @ 12:18
Цитата

Те, что создашь ты сам можно, а те, что будут созданы сторонними компонентами, внутри системных функций или dll-модулями вполне легального ПО?

Ну CreateThread от CreateRemoteThread можно отличить по модулю.

Код

HANDLE CreateThread(PSECURITY_ATNRlBUTES psa, DWORD dwStackSize, PTHREAD_START_ROUriNE pfnStartAddr, PVOID pvParam, DWORD fdwCreate, PDWORD pdwThrcadID) 

  return (CreateRemoteThread(GetCurrentProcess(), psa, dwStackSize, pfnStartAddr, pvParam, fdwCreate, pdwThreadID)); 



Цитата(takep)

Знаю

А почему молчишь?  smile

Это сообщение отредактировал(а) Rrader - 1.6.2008, 12:49


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(Rrader @  1.6.2008,  12:13 Найти цитируемый пост)
Создаваемый "легальными" DLL поток будет принадлежать нашему процессу.


И нелегальными тоже smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rrader
Дата 1.6.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Я немного некорректно выразился. Да, поток будет принадлежать нашему процессу, но созданный через CreateRemoteThread поток можно отличить по модулю kernel32.dll


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Rrader, нельзя. Как ты его отличишь? Созданный поток становится полноправной часть твоего приложения. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rrader
  Дата 1.6.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Универсально никак. Но для конкретного своего приложения можно.

Это сообщение отредактировал(а) Rrader - 1.6.2008, 13:04


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
W4FhLF
Дата 1.6.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Как?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.