смотря в каком смысле. имеется в виду не вызывая recv() из ws2_32.dll ? тогда можно например прочитать ws2_32 c диска с помощью ReadFile() затем настроить в ней релоки и импорт. если все делать аккуратно - то будет рабочая копия из которой и вызывать recv()... или другой вариант: recv() рано или поздно вызовет из ntdll DeviceIoConterolFile() через которую и происходит получение данных. можно написать свою реализацию winsock которая будет работать напямую с ntdll. можно придумать и другие способы наверно...
Меня интересовало как забрать данные без использования winsock.dll вообще. Просто попалась прога,у которой очень нужно было посмотреть принимаемые данные(без установки снифферов типа WinPcap),был написан hook для winsock.dll и ws_32, оказалось что она использует winsock для установки коннекта,а данные берет без его участия... З.Ы. спасибо за ответ =)
вовсе не обязательно. есть еще mswsock.dll со всякими там AcceptEx, TransmitFile и конечно WSARecvEx ... и вообщебывает извращенный режим когда юзается OVERLAPPED IO и соответственно для получения данных юзается GetQueuedCompletionStatus. а вообще странно чем winpcap не устраивает ? что модифицировать данные не дает ? так для этого есть WinpkFilter с http://www.ntkernel.com/
Ну в общем есть сервер, на нем стоит игровой сервак. Для установки WinPcap нужна сакция человека который "далёк от народа".... hook под winsock кидаеш в папку программы и все,вот тебе сниффер. Но игровой сервер берет игровые данные в обход winsock. Он частично юзает winsock для общения с другим сервером, но вот данные касательно игры, он неясно как получает. Сервер писали китайцы, исходников нигде нема.
да тогда понятно. я тоже писал нечто подобное только для wowemu. он сам глючныйи еще запакован там тоже пришлось поморочиться. в общем есть пример такого перехвата только недоделано и без комментариев. http://shardsecurity.com/files/rw_ls_dll.rar в твоем случае скорее всего то же самое - WSARecv() с использованием OVERLAPPED и затем GetQueuedCompletionStatus() А че за сервер то ?
тогда WSARecvEx() из mswsock.dll ? или может все проще recvfrom() WSARecvFrom() (это правда в основном для UDP используется...)
нет необязательно. возможно зависит от версий dll но на моей системе это не так. посмотри ws2_32.dll в IDA ...
mswsock.dll D2gs не юзает =( через ntdll.dll напрямую он не может брать, т.к. тогда будет запара с дровами. А он идет на любом компе... правда с модемами он не дружит,только сетевые карты.
Столкнулся сейчас с подобной проблемой. Хукаю у программы все, что только можно(знаю), ничего не перехватывается, после того, как клиент подключится... Клиенты подключаются, перехватываю даже recv\send - типа рукопожатие по протоколу ихнему, а дальше подключение висит, клиент-сервер обмениваются кучей данных, мне ничего не приходит. Какие тут еще могут быть варианты? Даже если данные приходят в асинхронном режиме, получать их программа должна все равно через вызов оригинальных функций? То есть вне зависимости от режима, данные я должен перехватить, просто иногда ошибкой вызовы заканчиваются. Сразу говорю, хукаю на уровне последнего провайдера, то есть mswsock, дальше только ntdll-ядро.
Я последний провайдер перехватываю, в него все вызовы в оконцове идут после всех остальных оберток. Только что нашел решение проблемы. Я конечно догадывался, что нужно попробовать, но не думал, что найдутся такие люди, которые будут работать с сокетами через Write\ReadFile!!! Пока не прочитал это: Оказывается, это мягкие их принудили Столько времени бился над пустяком...