-
В своей программе мне необходимо перехватить функцию 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; Примерно так.
-
> 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; >
-
> Сергей М. ©
Я пытаюсь посмотреть текст проходящий через Сокет. Для эксперимента ставлю MessageBoxA. Возможно на нем и происходит ошибка, по крайней мере окно MessageBox не появляется.
-
> @dimon (25.01.07 16:00) [2]
тебе профому, а ты все про ерему)
Вопрос поставлен - жду ответа ...
-
> текст проходящий через Сокет
Это тебе Gушкин сказал. что там "проходит" именно текст ?
-
> что там "проходит" именно текст ?
Да проходит именно тект. А вообще на счет 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
-
Грузи ws2_32.dll
-
> Грузи ws2_32.dll
Вызов @Msg:=GetProcAddress(H,'Send'); Возвращает nil
-
> Вызов @Msg:=GetProcAddress(H,'Send'); Возвращает nil
C этим разобрался (Send = SendTo).Что за библиотека ws2_32.dll? Почему WinSock не грузится?
-
> Вызов @Msg:=GetProcAddress(H,'Send'); Возвращает nil
потому что ф-ция называется "send", а не "Send". Прочувствуй разницу)
p.s. Коль уж ты занялся нетривиальной задачей - перехватом, стыдно не знать такие элементарные вещи, как регистрочувствительность сист.загрузчика к именам экспортируемых символов.
-
потому что ф-ция называется "send", а не "Send". Вопрос не в этом. Интересно почему не грузится библиотека Winsock.dll. И существует ли другие способы отправки сообщений в сеть, кроме функции send?
-
> почему не грузится библиотека Winsock.dll
Потому что этот модуль не является PE-модулем
> существует ли другие способы отправки сообщений в сеть, > кроме функции send?
SendTo, WSASend
-
На сколько я знаю WSASend из другой версии Winsock. В какой библиотеки она находится? Можно ли получить IP - адрес получателя сообщения посланного функцией send, не перехватывая подключение к серверу?
-
> WSASend из другой версии Winsock. В какой библиотеки она > находится?
ws2_32.dll
> Можно ли получить IP - адрес получателя сообщения посланного > функцией send, не перехватывая подключение к серверу?
Можно, но зачем ? Гораздо проще перехватить [WSA]Connect
-
> Можно, но зачем ?
Просто нужно одновременно получить и текст сообщения и кому он предназначен, при том, что функция отправки сообщения неизвестна.
-
> функция отправки сообщения неизвестна
> функция отправки сообщения неизвестна
Их не так уж и много, всего-то 4 - send, sendto, WSASend, WSASendTo. Перехватывай все.
> нужно одновременно получить и текст сообщения и кому он > предназначен
Это возможно только для connectionless-протоколов и ф-ции [WSA]SendTo - там в параметре фигурирует адресат.
-
Либо прилож. делает [WSA]sendto, либо можно узнать via getpeername.
-
> либо можно узнать via getpeername
Можно подробнее?
-
Вообще перехватывать необходимо сообщение от Proxy cервера Web Браузеру. Может ли в таком случае использоваться [WSA]send?
-
> перехватывать необходимо сообщение от Proxy cервера Web > Браузеру
Прокси - это сервер. А сервер никогда не вызывает [WSA]Connect.
И если уж дело обстоит именно так (т.е. задача - перехватить прикладной траффик между прокси-сервером и его клиентом), то перехват WinsockAPI тут нафиг не нужен - пишется свой прокси-сервер и подключается в цепочку прокси-каскадирования:
Было: Клиент <-> Имеющийся прокси <-> Тырнет
Стало: Клиент <-> Имеющийся прокси <-> Твой прокси <-> Тырнет
И все ! И незачем все эти выкрутасы с "перехватом")
|