Привет, народ. Что можно почитать про socket splicing в сабжах? Нужно просто заблокировать определенные IP адреса в этих браузерах. FF, IE все норм. А сабжы выдают ошибку "Невозможно подключиться... Проверьте подключение..." Они одинаково работают на WSAAsyncSelect() Мне нужно подменить обработать только connect() и по необходимости перенаправить на другой адрес. В обработчике OnConnect() делаю просто вызов RealConnect(..) возвращает -1 и ошибку 10035 Пробовал перед этим вызвать WSAAsyncSelect() с параметрами, как это делает сам браузер, но это ничего не меняет.
saxon Уж не собрались ли вы патчить и иначе портить модуля.. Во первых нужно определить нормальный способ похачить сокеты, в самом простейшем случае это переписать копии SockProcTable(UpCallTable). Во вторых зачем что то делать с системными механизмами, если известны конкретные приложения, которые эти механизмы будут использовать. Тоесть опера содержит массив векторов на стабы, которые переходники к WSA. В хроме массив ссылок на процедуры. Достаточно свои туда прогрузить. Да и это более годно, чем пониже что либо юзать, так к примеру какой нибудь хитрожопый детектор типо виньчека может обнаружить фильтр. А на уровне приложения такое нельзя задетектить.
в целом потому, что на опере и хроме список не заканчивается. Необходима обработка любого приложения. В итоге может перерасти в блокировку на основе контента и запросов. Поэтому под конкретные приложения делать не вижу смысла
saxon Есть стандартный LSP-механизм. Можно его заюзать, но по мойму палево. Чего вы хотите не понятно.
я хочу сплайсинга. connect() мне пока достаточно. и я вижу, как могу расширить решение в будущем при необходимости. Что мне необходимо, так это выяснить, почему опера и хром так просто не заводятся с полоборота, как ИЕ и ФФ. Т.е. у них обоих используется тупая виндовая нотификация WSAAsyncSelect(), за которую нужно оторвать руки. Так вот мне необходимо всего лишь в обработчике connect() вызывать свой connect(). для этого нужна какая-то магия. С помощью плагина к OleDbg для трейсинга WinSock просмотрел всю последовательность вызовов. Перед любым connect() вызывается этот самый WSAAsyncSelect(). Я делаю то же самое со своими параметрами и ничего хорошего с этого не выходит. Code (Text): /*static*/ int WINAPI Connect::OnConnect( SOCKET s, const struct sockaddr *name, int namelen ) { EC_ASSERT( m_this.get() != 0 ); EC_LOG4A( "Ip", GetIpAddress( name ), "Port", GetPort(name) ); if( std::string( GetIpAddress( name ) ) == "127.0.0.1" ) { return Connect::m_realConnect( s, name, namelen ); } else { sockaddr_in &connectionInfo = reinterpret_cast< sockaddr_in & >( const_cast< sockaddr & >( *name ) ); sockaddr_in newInfo = {0}; ///........ int iResult = 0; u_long iMode = 0; iResult = ioctlsocket( s, FIONBIO, &iMode ); DWORD aas = WSAGetLastError(); // WSAAsyncSelect( s, (HWND)0x003F02C8, WM_USER + 0x1E, FD_CONNECT ); // То же самое делает опера int result = Connect::m_realConnect( s, reinterpret_cast< const sockaddr * >(&newInfo), sizeof(newInfo) ); if( SOCKET_ERROR == result ) { EC_LOG2A( "Proxy connect error: ", WSAGetLastError() ); // 10035 !!!! здесь беда return Connect::m_realConnect( s, name, namelen ); } //... }
А что вы ждете? Ну отлично, кусок кода, который мало что показывает, ибо может реализация перехвата подкачала, может какая-то из Ваших кастомных функций что-то не то делает, может быть... Отличная формулировка для человека, который в состоянии пользоваться отладчиком. Не выходит что? А при трассировке на каком именно моменте "ничего не выходит"? Также не особо понимаю зачем ioctlsocket и прочее в приведенном коде, ну вызывает движок браузера какие-то функции из винапи, но в перехвате то целью является изменить нечто в рамках функции connect, то бишь, по-идее, достаточно было бы взять детурс и написать кастомную функцию типа (если целью стоит простой коннект по другому ip): Code (Text): int My_Connect(SOCKET s, const struct sockaddr *name, int namelen) { if(((sockaddr_in*)name)->sin_addr.S_un.S_addr == inet_addr("127.0.0.1")) { ((sockaddr_in*)name)->sin_addr.S_un.S_addr = inet_addr("8.8.8.8"); } return Real_connect(s, name, namelen); } Или тут есть скрытые мотивы и неочевидные концепции?