Конференция "Сети" » Перехват Сокетов [D7, WinXP]
 
  • @dimon (25.01.07 08:23) [0]
    В своей программе мне необходимо перехватить функцию 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;


    Примерно так.
  • Сергей М. © (25.01.07 09:36) [1]

    > 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;
    >
  • @dimon (25.01.07 16:00) [2]

    > Сергей М. ©

    Я пытаюсь посмотреть текст проходящий через Сокет. Для эксперимента ставлю
    MessageBoxA. Возможно на нем и происходит ошибка, по крайней мере окно MessageBox не появляется.
  • Сергей М. © (25.01.07 16:08) [3]

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


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

    Вопрос поставлен - жду ответа ...
  • Сергей М. © (25.01.07 16:09) [4]

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


    Это тебе Gушкин сказал. что там "проходит" именно текст ?
  • @dimon (25.01.07 17:32) [5]

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

    Да проходит именно тект. А вообще на счет 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
  • Сергей М. © (26.01.07 08:15) [6]
    Грузи ws2_32.dll
  • @dimon (26.01.07 08:28) [7]

    > Грузи ws2_32.dll


    Вызов
    @Msg:=GetProcAddress(H,'Send');

    Возвращает
    nil

  • @dimon (26.01.07 08:40) [8]

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

    C этим разобрался (Send = SendTo).Что за библиотека ws2_32.dll? Почему WinSock не грузится?
  • Сергей М. © (26.01.07 08:41) [9]

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


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

    p.s. Коль уж ты занялся нетривиальной задачей - перехватом, стыдно не знать такие элементарные вещи, как регистрочувствительность сист.загрузчика к именам экспортируемых символов.
  • @dimon (26.01.07 09:06) [10]
    потому что ф-ция называется "send", а не "Send".


    Вопрос не в этом. Интересно почему не грузится библиотека Winsock.dll. И существует ли другие способы отправки сообщений в сеть, кроме функции send?
  • Сергей М. © (26.01.07 09:32) [11]

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


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


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


    SendTo, WSASend
  • @dimon (26.01.07 09:38) [12]
    На сколько я знаю WSASend из другой версии Winsock. В какой библиотеки она находится? Можно ли получить IP - адрес получателя сообщения посланного функцией send, не перехватывая подключение к серверу?
  • Сергей М. © (26.01.07 09:52) [13]

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


    ws2_32.dll


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


    Можно, но зачем ?
    Гораздо проще перехватить [WSA]Connect
  • @dimon (26.01.07 10:00) [14]

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


    Просто нужно одновременно получить и текст сообщения и кому он предназначен, при том, что функция отправки сообщения неизвестна.
  • Сергей М. © (26.01.07 10:08) [15]

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



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


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


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


    Это возможно только для connectionless-протоколов и ф-ции [WSA]SendTo - там в параметре фигурирует адресат.
  • Verg © (26.01.07 10:20) [16]
    Либо прилож. делает [WSA]sendto, либо можно узнать via getpeername.
  • @dimon (26.01.07 10:35) [17]

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

    Можно подробнее?
  • @dimon (26.01.07 10:39) [18]
    Вообще перехватывать необходимо сообщение от Proxy cервера Web Браузеру. Может ли в таком случае использоваться [WSA]send?
  • Сергей М. © (26.01.07 10:52) [19]

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


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

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

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

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

    И все ! И незачем все эти выкрутасы с "перехватом")
 
Конференция "Сети" » Перехват Сокетов [D7, WinXP]
Есть новые Нет новых   [134431   +16][b:0][p:0.002]