-
int getpeername( SOCKET s, struct sockaddr* name, int* namelen );
The getpeername function retrieves the name of the peer to which a socket is connected.
-
> Имеющийся прокси <-> Твой прокси
И все это на одной машине?
-
> Сергей М. © (26.01.07 10:52) [19] > > > перехватывать необходимо сообщение от Proxy cервера Web > > > Браузеру > > > Прокси - это сервер. > А сервер никогда не вызывает [WSA]Connect.
Ой ли?
Если сервер - это прокси , то connect-ов там будет. На то он и proxy.
-
> @dimon (26.01.07 11:18) [21] > И все это на одной машине?
На любой) Как браузер и прокси настроишь, так и оно будет.
> Verg © (26.01.07 11:23) [22]
Имелась ввиду серверная ипостась прокси-приложения. Разумеется, прокси-приложение в другой его ипостаси само выступает клиентом для других серверов, об этом речь пока не идет.
-
Снова проблема! Код ProcAddress:=GetProcAddress(GetModuleHandle('ws2_32.DLL'), 'send'); возвращает nil. Вообще Handle библиотеки (GetModuleHandle('ws2_32.DLL')) возвращяется 0, хотя loadlibrary работает.
-
> @dimon (26.01.07 16:12) [24]
ну ты и упертый мужик, однако)
ты порло прокси-какскад проинтуичил ? Или об стенку горох ?
-
> Сергей М. ©
Уже просто интересно как это делается (перехват соектов). Может есть рабочий пример?
-
> @dimon (28.01.07 09:14) [26]
Ну ты же сделал перехват, и , сам говоришь, успешно) Что ж тебе еще надобно, старче ?)
-
> Сергей М. ©
Перехват я сделал, но тестировал его на других функциях. Работало. Переделал его по сокет ( библиотека ws2_32.dll функция send), есть программа (тестовая),которая явно вызывает send, перехватывающая програмка при тестирование ничего не выдает. Приведу полный текст своей Dll, посмотри пожалуйста, что не так. library MSock;
uses
sysutils,
windows,
winsock,
messages;
type
TImageImportDescriptor=packed record
OriginalFirstThunk : DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
PImageImportDescriptor=^TImageImportDescriptor;
var filename:array[0..max_path-1] of char;
hook:HHook=0;
PEHeader:PImageNtHeaders;
ImageBase:cardinal;
function Mysend(s: TSocket; var Buf; len, flags: Integer): Integer;
stdcall;
begin
MessageBox(0,PAnsiChar(Buf),'Перехват сокета',0);
result:= Send(s,Buf,Len,flags);
end;
function MyGetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC;
stdcall;
begin
if lpProcName= 'send' then
result:=@MySend
else
result:=GetProcAddress(hModule,lpProcName);
end;
procedure ProcessImports(PImports:PImageImportDescriptor);
Var
PImport:PImageImportDescriptor;
PRVA_Import:LPDWORD;
ProcAddress:pointer;
GetAdr:pointer;
Temp_Cardinal:cardinal;
begin
ProcAddress:=GetProcAddress(Loadlibrary('ws2_32.DLL'), 'send');
MessageBox(0,'','',0);
GetAdr:=GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProcAddress');
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)^:=@MySend; VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
end;
if PPointer(PRVA_Import)^=GetAdr
then
begin
VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
PPointer(PRVA_Import)^:=@MyGetProcAddress; VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
end;
Inc(PRVA_Import);
end;
Inc(PImport);
end;
end;
procedure DllEntryPoint(reson:longint);stdcall;
begin
case reson of
DLL_PROCESS_ATTACH:
begin
DisableThreadLibraryCalls(hInstance);
ZeroMemory(@FileName, SizeOf(FileName));
GetModuleFileName(GetModuleHandle(nil), @FileName, SizeOf(FileName));
ImageBase:=GetModuleHandle(nil);
PEHeader:=pointer(int64(ImageBase)+PImageDosHeader(ImageBase)._lfanew); ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENT RY_IMPORT].VirtualAddress+ImageBase));
end;
end;
end;
function nexthook(code:integer;wParam,lParam:longint):longint;stdcall;
begin
result:=callnexthookex(hook,code,wParam,lParam);
end;
procedure sethook(flag:bool);export; stdcall;
begin
if flag then
hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0)
else
begin
unhookwindowshookex(hook);
hook:=0;
end;
end;
exports sethook;
begin
DLLProc:=@DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH)
end.
-
Что говорит отладчик ?
-
Отладчик ничего не говорит, но странно: GetProcAddress(Loadlibrary('ws2_32.DLL'), 'send'); возвращает nil. Что на счет рабочего примера?
-
> @dimon (30.01.07 08:45) [30]
> возвращает nil
Пробуй так:
hLib := Loadlibrary('ws2_32.DLL'); Win32Check(hLib <> 0); ProcAddress := GetProcAddress(hLib, 'send'); Win32Check(Assigned(ProcAddress));
Какие сообщения показывает этот код ?
-
> Какие сообщения показывает этот код ?
Перехватывающая программа по прежнему ничего не выдает.
-
> Перехватывающая программа по прежнему ничего не выдает. >
Раз не выдает, значит твое утверждение в [30] насчет nil заведомо ложное.
-
И что делать?
-
Как что ? Трассировать дальше ..
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|