Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват Сокетов [D7, WinXP]


Страницы:   1 2

@dimon ©   (2007-01-25 08:23:00) 

В своей программе мне необходимо перехватить функцию Send библиотеки WinSock. Использую глобальный Хук, но почему -то приложение вызывающее WinSock выдает ошибку: "Приложение выполнело недопустимую операцию и будет закрыто". Для других API перехват происходи нормально. В чем может быть причина? Приведу процедуру перехвата.

function MySock(s:TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
 result:=Send(s,Buf,len,flags);
 MessageBoxA(0, PChar(Buf), 'my hook', 0);
end;

procedure ProcessImports(PImports:PImageImportDescriptor);
   Var
       PImport:PImageImportDescriptor;
       PRVA_Import:LPDWORD;
       ProcAddress:pointer;
       Temp_Cardinal:cardinal;
   begin
     ProcAddress:=GetProcAddress(GetModuleHandle('WINSOCK.DLL'), 'Send');
     PImport:=PImports;
     while PImport.Name<>0 do
       begin
         PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase);
         while PRVA_Import^<>0 do
         begin
           if PPointer(PRVA_Import)^=ProcAddress
              then
                begin
                  VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
                  PPointer(PRVA_Import)^:=@MySock;  
                 VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
                end;
           Inc(PRVA_Import);
         end;
      Inc(PImport);
  end;
end;

Примерно так.


Сергей М.   (2007-01-26 10:52:00) [21]


> перехватывать необходимо сообщение от Proxy cервера Web
> Браузеру


Прокси - это сервер.
А сервер никогда не вызывает [WSA]Connect.

И если уж дело обстоит именно так (т.е. задача - перехватить прикладной траффик между прокси-сервером и его клиентом), то перехват WinsockAPI тут нафиг не нужен - пишется свой прокси-сервер и подключается в цепочку прокси-каскадирования:

Было:
Клиент <-> Имеющийся прокси <-> Тырнет

Стало:
Клиент <-> Имеющийся прокси <-> Твой прокси <-> Тырнет

И все ! И незачем все эти выкрутасы с "перехватом")


@dimon   (2007-01-26 10:39:00) [22]

Вообще перехватывать необходимо сообщение от Proxy cервера Web Браузеру. Может ли в таком случае использоваться [WSA]send?


@dimon   (2007-01-26 10:35:00) [23]


> либо можно узнать via getpeername

Можно подробнее?


Verg   (2007-01-26 10:20:00) [24]

Либо прилож. делает [WSA]sendto, либо можно узнать via getpeername.


Сергей М.   (2007-01-26 10:08:00) [25]


> функция отправки сообщения неизвестна



> функция отправки сообщения неизвестна


Их не так уж и много, всего-то 4 - send, sendto, WSASend, WSASendTo.
Перехватывай все.


> нужно одновременнополучить и текст сообщения и кому он
> предназначен


Это возможно только для connectionless-протоколов и ф-ции [WSA]SendTo - там в параметре фигурирует адресат.


@dimon   (2007-01-26 10:00:00) [26]


> Можно, но зачем ?


Просто нужно одновременно получить и текст сообщения и кому он предназначен, при том, что функция отправки сообщения неизвестна.


Сергей М.   (2007-01-26 09:52:00) [27]


> WSASend из другой версии Winsock. В какой библиотеки она
> находится?


ws2_32.dll


> Можно ли получить IP - адрес получателя сообщения посланного
> функцией send, не перехватывая подключение к серверу?


Можно, но зачем ?
Гораздо проще перехватить [WSA]Connect


@dimon   (2007-01-26 09:38:00) [28]

На сколько я знаю WSASend из другой версии Winsock. В какой библиотеки она находится? Можно ли получить IP - адрес получателя сообщения посланного функцией send, не перехватывая подключение к серверу?


Сергей М.   (2007-01-26 09:32:00) [29]


> почему не грузится библиотека Winsock.dll


Потому что этот модуль не является PE-модулем


> существует ли другие способы отправки сообщений в сеть,
> кроме функции send?


SendTo, WSASend


@dimon   (2007-01-26 09:06:00) [30]

потому что ф-ция называется "send", а не "Send".
Вопрос не в этом. Интересно почему не грузится библиотека Winsock.dll. И существует ли другие способы отправки сообщений в сеть, кроме функции send?


Сергей М.   (2007-01-26 08:41:00) [31]


> Вызов @Msg:=GetProcAddress(H,'Send'); Возвращает nil


потому что ф-ция называется " send", а не " Send".
Прочувствуй разницу)

p.s. Коль уж ты занялся нетривиальной задачей - перехватом, стыдно не знать такие элементарные вещи, как регистрочувствительность сист.загрузчика к именам экспортируемых символов.


@dimon   (2007-01-26 08:40:00) [32]


> Вызов @Msg:=GetProcAddress(H,'Send'); Возвращает nil

C этим разобрался (Send = SendTo).Что за библиотека ws2_32.dll? Почему WinSock не грузится?


@dimon   (2007-01-26 08:28:00) [33]


> Грузи ws2_32.dll


Вызов @Msg:=GetProcAddress(H,'Send');Возвращает nil


Сергей М.   (2007-01-26 08:15:00) [34]

Грузи ws2_32.dll


@dimon   (2007-01-25 17:32:00) [35]


> что там "проходит" именно текст ?

Да проходит именно тект. А вообще на счет MessageBox возникли сомнения. Почему - то не проходит динамическая загрузка библиотеки WinSock. Т.е. код:

Type
T=function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
 Msg:T;
 h:THandle;
begin
   h:=LoadLibrary('WinSock.dll');
   @Msg:=GetProcAddress(H,'Send');
   if @Msg=nil then
    ShowMessage('');
end;


Выдает ошибку :Библиотека WinSock не является образом программы для Windows NT


Сергей М.   (2007-01-25 16:09:00) [36]


> текст проходящий через Сокет


Это тебе Gушкин сказал. что там "проходит" именно текст?


Сергей М.   (2007-01-25 16:08:00) [37]


> @dimon   (25.01.07 16:00) [2]


тебе профому, а ты все про ерему)

Вопрос поставлен - жду ответа ...


@dimon   (2007-01-25 16:00:00) [38]


> Сергей М. ©

Я пытаюсь посмотреть текст проходящий через Сокет. Для эксперимента ставлю
MessageBoxA. Возможно на нем и происходит ошибка, по крайней мере окно MessageBox не появляется.


Сергей М.   (2007-01-25 09:36:00) [39]


> function MySock(s:TSocket; var Buf; len, flags: Integer):
>  Integer; stdcall;
> begin
>  result:=Send(s,Buf,len,flags);
>  MessageBoxA(0, PChar(Buf), 'my hook', 0); //<- здесь брейкпойнт ловишь ?
> end;
>


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо