![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
takep |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 24.8.2007 Репутация: нет Всего: нет |
Есть приложение, использующее функцию send (winsock). Как отловить событие когда стороннее приложение внедрит в моё приложение свою dll и поставит хук на функцию send. Обычно методом CreateRemoteThread.
надеюсь я правильно выразился=\ Это сообщение отредактировал(а) takep - 30.5.2008, 20:18 |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Отслеживай появление нового потока.
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Если перехват обычный, т.е. сплайсинг путём изменения первых байт функции, то можно, допустим, каждую секунду или перед каждым вызовом send сравнивать первые N байт начала функции send с байтами из ws2_32.dll, если не равно - значит функция перехвачена(только здесь ещё релоки надо восстановить в загруженной с диска dll, прежде чем сравнивать).
Другой способ перехват самому LdrLoadLibrary, но вопрос в том, как ты отличишь "вражескую" dll от системной при загрузке? Если известно, что-то о первой, тогда можно использовать. Плохой способ. А если поток создаст наше приложение? Как отличать их будешь? И потом, твой цикл загрузит процессор на 100%. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
takep |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 24.8.2007 Репутация: нет Всего: нет |
думаю это подойдет больше всего, попробую так. А что насчет глобального хука на ZwOpenProcess? |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Можно вести учет своих потоков. Это несложно. Не загрузит, если этот код оформить в отдельный поток, и приписать внутри Sleep. Добавлено через 1 минуту и 50 секунд takep, ты знаешь, сплайсинг там или CreateRemoteThread? |
|||
|
||||
takep |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 24.8.2007 Репутация: нет Всего: нет |
||||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Всё, что нужно есть в библиотеке advApiHook. Во-первых, глобальный хук на порядок сложнее реализовывается, во-вторых зачем расползаться по всей системе, если нужно контролировать то, что происходит внутри твоего процесса. Те, что создашь ты сам можно, а те, что будут созданы сторонними компонентами, внутри системных функций или dll-модулями вполне легального ПО?
Хорошо, когда твой поток зайдёт в Sleep, то управление передасться на поток, который загрузит dll и уничтожится, а в случае многоядерного процессора эти два потока могут выполняться одновременно и неизвестно, какой из потоков первый завершит выполнение ![]() -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Я предлагал, чтобы следящий поток работал все время с программой. И завершение его произойдет при завершении программы. Это сообщение отредактировал(а) Rrader - 1.6.2008, 12:10 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Строго говоря, потоки в Windows не работают всё время, если я правильно тебя понял. Они делят процессорное время с другими потоками. Когда поток заходит в Sleep управление передаётся другим потоками и может быть передано в том числе и тому, который загрузит dll, пока следящий поток спит. Если следящий поток крутится всё время - это нерациональное использование ресурсов просто напросто. К тому же, чтобы подгрузить DLL вовсе необязательно создавать поток, достаточно изменить контекст уже существующего потока в процессе(насильно переправить его исполнение на наш код). Но вообще, почему твой метод в прицнипе нароботоспособен, так это потому, что обычно в момент внедрения своей dll все потоки приложения-жертвы останавливаются(SuspendThread), а после вновь запускаются(ResumeThread). -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Rrader |
|
||||||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Ну не совсем. ![]() Добавлено @ 12:18
Ну CreateThread от CreateRemoteThread можно отличить по модулю.
А почему молчишь? ![]() Это сообщение отредактировал(а) Rrader - 1.6.2008, 12:49 |
||||||||
|
|||||||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
И нелегальными тоже ![]() -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Я немного некорректно выразился. Да, поток будет принадлежать нашему процессу, но созданный через CreateRemoteThread поток можно отличить по модулю kernel32.dll
|
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Rrader, нельзя. Как ты его отличишь? Созданный поток становится полноправной часть твоего приложения.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 29 Всего: 191 |
Универсально никак. Но для конкретного своего приложения можно.
Это сообщение отредактировал(а) Rrader - 1.6.2008, 13:04 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Как?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |