| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Создание драйверов в Delphi |
| Автор: ASGDeveloper 24.7.2006, 08:00 |
| Кто знаком с этой статьей: http://www.rsdn.ru/article/delphi/kmdelphi.xml и пытался сделать subj? |
| Автор: bazzzman 24.7.2006, 08:05 |
| Наверное, всю интересующую тебя информацию найдешь в комментариях к статье: http://www.rsdn.ru/forum/?mid=876459 |
| Автор: Alexeis 24.7.2006, 09:57 | ||
А в чем собственно вопрос? |
| Автор: ASGDeveloper 24.7.2006, 10:49 |
Не знаю как ставить хуки на функции. В какую сторону рыть - тоже непонятно. |
| Автор: drkot 24.7.2006, 11:17 |
| бррр. может я чего не понимаю но какие хуки ты (ASGDeveloper) собираешся ставить? и собственно драйвер чего пишеш. имхо надо сначала с задачами определится, а то непонятно о чем разговор. |
| Автор: Alexeis 24.7.2006, 12:19 |
Для установки хуков, драйвер не нужен, достаточно dll. Драйвер обычно пишут для прямого обращения к портам различных устройств. |
| Автор: BUGOR 24.7.2006, 12:30 | ||
А для установки хука на NativeAPI ядра? Куда ж тут без драйвера? |
| Автор: ASGDeveloper 24.7.2006, 13:01 |
Да, dll injectiing пробовал. Теперь конкретно задача: перехват, проверка и модификация (если надо) POP3-трафика Метод внедрения не катит. Ставил хуки и на WSARecv и на recv, В обоих вариантах на последних версиях бата выпадает ошибка. Посмотрел список загруженных батом модулей - ни wsock32.dll, ни ws2_32.dll нету |
| Автор: BUGOR 24.7.2006, 13:10 |
| ASGDeveloper, бат загружает эти модули после того, как уже непосредственно начинает соединяться с сервером, до этого их там нет. Что касается апи, то бат передаёт с помощью send, а принимает с помощью WSARecv. Ошибка скорее всего где-то в твоей длл. |
| Автор: dumb 24.7.2006, 13:20 | ||||
плохо смотрел. wsock32.dll, ws2_32.dll, ws2help.dll, mswsock.dll - все там.
плохо ставил... |
| Автор: ASGDeveloper 24.7.2006, 13:33 | ||
Версия бата? На САМОЙ последней нету. Пробовал и madCodeHook и AdvAPIHook. Как же тогда хук ставить? Отлавливать LoadLibrary и только затем грузить? |
| Автор: BUGOR 24.7.2006, 13:39 | ||||
Их в не на самой последней нет, я же говорю они при соединеиии грузятся.
Да, как вариант сначала перехватывай LoadLibarary и смотри, что передаётся в его параметр, если это ws2_32.dll, то после выполнения LoadLibrary снимай с неёё хук и ставь хуки на send и WSARecv в ws2_32.dll, остальные сокетные библиотеки все ссылаются на функции из ws2_32.dll, их трогать незачем. |
| Автор: dumb 24.7.2006, 13:43 | ||
3.62. значит сделали подгрузку, что, в общем, правильно - прога жирная, и отправка/получение почты занимает малую часть времени работы в ней.
именно. хукай LoadLibrary и после подгрузки расставляй хуки по функциям. |
| Автор: bems 24.7.2006, 14:44 | ||
|
| Автор: drkot 24.7.2006, 15:22 |
| Вобще, если касаться перехвата трафика, то написаный драйвер ставится в цепочку NDIS и весь трафик через него идет. А чтоб не мучится с драйверами можно и winpcap использовать. PS: чето я непойму откуда у народа такая любовь к хукам на сокеты. http://www.wasm.ru/article.php?article=netfilter |
| Автор: ASGDeveloper 24.7.2006, 17:06 | ||
Вот код перехватчика. Бага в том, что данные не сразу попадают в буфер. Не знаете в чем проблема?
|
| Автор: dumb 24.7.2006, 17:42 |
| гы... посмотри что возвращает WSARecv - WSA_IO_PENDING? тут одним хуком не отделаешься. в данном случае WSARecv только инициирует прием, непосредственно получение данных сопровождается либо вызовом lpCompletionRoutine(если она не NULL при вызове), либо "выставлением" эвента(lpOverlapped.hEvent). похукать lpCompletionRoutine не проблема. а вот если получение ожидается на эвенте, тогда сложнее. никаких "простых" решений в голову не приходит... |
| Автор: ASGDeveloper 25.7.2006, 09:04 |
Угу. Кроме драйвера. Хм, какие еще будут предложения? Желательно для дельфы или борландовского билдера. |
| Автор: drkot 25.7.2006, 10:12 |
| Насколько я понимаю в нт системах можно написать сервис и установить его как драйвер без хитрых манипуляций описаных на МАСМе. И перехватывать думаю надо не вызовы функций, а непосредственно поток пакетов в стеке протоколоа TCP\IP. ето как раз та задача которая решается NDIS фильтрами. |
| Автор: ASGDeveloper 25.7.2006, 10:47 |
а примерчик не знаешь где можно взять? ЗЫ ВинПКап не подходит в виду того, что автор хочет его платным сделать |
| Автор: drkot 25.7.2006, 11:21 | ||
таки исходники есть. В любом случае платным он станет с какойто конкретной версии, а все предудущие должны распространятся GNU, как и было. http://www.wasm.ru/article.php?article=netfilter http://www.wasm.ru/comment.php?artcode=netfilter Встречал статью по реализации фильтра на си тока ссылочку не помню. примеров сервисов на форуме полно. |
| Автор: ASGDeveloper 25.7.2006, 11:24 |
хм, не уточнишь где? К сожалению GNU/GPL меня не устраивает. На каком форуме? Васмовском или этом? |
| Автор: drkot 25.7.2006, 12:59 |
http://www.winpcap.org/archive/ жал на этом |
| Автор: bems 25.7.2006, 17:12 | ||
lpCompletionRoutine можно и не хукать. А в хуке на WSARecv использовать свою lpCompletionRoutine, в ней делать обработку и вызывать переданную вызывающим кодом. И с событием поступать аналогично. При вызове использовать свое, отлавливать его и манипулировать с тем, которого ожидает вызывающий код |
| Автор: dumb 25.7.2006, 17:34 |
| тупим-с... |
| Автор: ASGDeveloper 25.7.2006, 17:47 |
Дык WinPCap не пойдет. Или можно по-другому? Это ты о чем? |
| Автор: dumb 25.7.2006, 17:52 |
это я о том, что решение, лежащее на поверхности(которое указал bems), мне в голову не пришло. |
| Автор: bems 25.7.2006, 18:02 |
| это оно в принципе на поверхности. Конкретная реализация будет не слишком простой, если учитывать возможное количество одновременных вызовов WSARecv из разный потоков/прцессов. Мой вариант этого кода уже почти всегда корректно работает, но не дам, тк автор темы мне конкурент |
| Автор: ASGDeveloper 25.7.2006, 18:05 |
Да ладно тебе! Поделись! Чего у тебя в подписи? Мы за свободный рынок! |
| Автор: bems 25.7.2006, 18:11 |
| я могу сходу назвать 10 отличий того, что у меня в подписи и того о чем ты просишь. Но это будет оффтоп. Просто "нет". |
| Автор: ASGDeveloper 25.7.2006, 18:16 | ||
Ну почему? Да и какие мы конкуренты? Софтинка "заказная". Если хочешь могу поделиться.
|
| Автор: drkot 25.7.2006, 18:18 |
береш исходник смотриш что к чему и по образу и подобию ваяеш. чем не подходит? сам же ссылочку просил. |
| Автор: bems 25.7.2006, 18:19 |
| ASGDeveloper, на данный момент я не пишу Open Source. Когда начну, сообщу. А если я тебе туда накидаю багов, которые проявляются только в редких случаях, но найти которые невозможно? Короче я призываю тебя кончать флейм - мы идем по кругу. |
| Автор: ASGDeveloper 25.7.2006, 22:26 |
| И так. Просмотрев еще раз топик я выделил три метода решения проблемы. 1) Перехват функций WinSock. 2) Написание NDIS-фильтра 3) Создание драйвера 1) С первым частично разобрались, но вдруг bems заявляет, что в принципе такой вариант может начать глючить при какой-то ситуации. Кроме того этот вариант привязан к фиксированному списку почтовиков. 2) Второй вариант весьма перспективен, но у него есть один важный минус - для его реализации необходим MS Dev Studio + DDK. А это не есть гуд, так как самый простой способ получить и то и другое - это подписка на MSDN. Стоимость подписки - ~3000$. no comments... 3) Третий вариант перекликается с первым, но благодаря этому топику: http://forum.vingrad.ru/index.php?showtopic=70952 некоторые вопросы пропадают и этот вариант становится наиболее перспективным. Или я что-то не доглядел? |
| Автор: bems 26.7.2006, 07:56 | ||||
Есть разные там экзотические случаи - например вызывает функцию, передавая ей эвент один процесс, а ожидает его другой (первый к тому времени может уже и завершиться). Первый понастоящему трудный баг во всем этом перехвате я поймал на такой "архитектуре". (Слава Богу это писалось на заказ и не имело широкого распространения) Получилось так, что когда завершается процесс, вызывающий функцию, то исчезают все выделенные мной для этого вызова данные, в том числе и хэндл эвента, которого ждет другой процесс. То есть или у него завершиться таймаут, или (если ждет INFINITE милисекунд) получаем зависшую прогу (не мою!!). Есть и просто некорректное поведение вызывающего кода. и об этом всем нужно подумать. Тогда глюков не будет. Ну а потом уже пробывать на почтовиках. (Популярные вроде вышеписаной фигни не творят). Парочку глючных но полурабочих прог, работающих с сокетами сам нацарапай, посмотри как твой перехват - не усугубляет ли. А если дров ты раньше не писал, то там среда еще менее дружелюбная, чем то, что описал я. Но в конце концов тебе решать |