Конференция "Сети" » Перехват Сокетов [D7, WinXP]
 
  • Verg © (26.01.07 11:07) [20]
    int getpeername(
     SOCKET s,
     struct sockaddr* name,
     int* namelen
    );

    The getpeername function retrieves the name of the peer to which a socket is connected.
  • @dimon (26.01.07 11:18) [21]

    > Имеющийся прокси <-> Твой прокси

    И все это на одной машине?
  • Verg © (26.01.07 11:23) [22]

    > Сергей М. ©   (26.01.07 10:52) [19]
    >
    > > перехватывать необходимо сообщение от Proxy cервера Web
    >
    > > Браузеру
    >
    >
    > Прокси - это сервер.
    > А сервер никогда не вызывает [WSA]Connect.


    Ой ли?

    Если сервер - это прокси , то connect-ов там будет.
    На то он и proxy.
  • Сергей М. © (26.01.07 11:29) [23]

    > @dimon   (26.01.07 11:18) [21]
    > И все это на одной машине?


    На любой)
    Как браузер и прокси настроишь, так и оно будет.


    > Verg ©   (26.01.07 11:23) [22]


    Имелась ввиду серверная ипостась прокси-приложения. Разумеется, прокси-приложение в другой его ипостаси само выступает клиентом для других серверов, об этом речь пока не идет.
  • @dimon (26.01.07 16:12) [24]
    Снова проблема! Код
       
     ProcAddress:=GetProcAddress(GetModuleHandle('ws2_32.DLL'), 'send');

    возвращает nil. Вообще Handle библиотеки (GetModuleHandle('ws2_32.DLL')) возвращяется 0, хотя loadlibrary работает.
  • Сергей М. © (26.01.07 16:55) [25]

    > @dimon   (26.01.07 16:12) [24]


    ну ты и упертый мужик, однако)

    ты порло прокси-какскад проинтуичил ? Или об стенку горох ?
  • @dimon (28.01.07 09:14) [26]

    > Сергей М. ©  

    Уже просто интересно как это делается (перехват соектов). Может есть рабочий пример?
  • Сергей М. © (29.01.07 08:20) [27]

    > @dimon   (28.01.07 09:14) [26]


    Ну ты же сделал перехват, и , сам говоришь, успешно)
    Что ж тебе еще надобно, старче ?)
  • @dimon (29.01.07 16:57) [28]

    > Сергей М. ©


    Перехват я сделал, но тестировал его на других функциях. Работало. Переделал его по сокет ( библиотека 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{1}
         ProcAddress:=GetProcAddress(Loadlibrary('ws2_32.DLL'), 'send');
         MessageBox(0,'','',0);
         GetAdr:=GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProcAddress');

         PImport:=PImports;
         while PImport.Name<>0 do
           begin{2}
             PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase);
             while PRVA_Import^<>0 do
             begin{3}
               if PPointer(PRVA_Import)^=ProcAddress
                  then
                    begin{4}
                      VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
                      PPointer(PRVA_Import)^:=@MySend; //пишем свою...
                      VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
                    end;{1}
                if PPointer(PRVA_Import)^=GetAdr
                  then
                    begin{4}
                      VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal);
                      PPointer(PRVA_Import)^:=@MyGetProcAddress; //пишем свою...
                      VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal);
                    end;{1}
               Inc(PRVA_Import);
             end;{2}
          Inc(PImport);
      end;{3}
    end;{4}

    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);//pe header
         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.
     

  • Сергей М. © (29.01.07 17:07) [29]
    Что говорит отладчик ?
  • @dimon (30.01.07 08:45) [30]
    Отладчик ничего не говорит, но странно:
    GetProcAddress(Loadlibrary('ws2_32.DLL'), 'send');


    возвращает nil. Что на счет рабочего примера?
  • Сергей М. © (30.01.07 09:11) [31]

    > @dimon   (30.01.07 08:45) [30]


    > возвращает nil


    Пробуй так:

    hLib := Loadlibrary('ws2_32.DLL');
    Win32Check(hLib <> 0);
    ProcAddress := GetProcAddress(hLib, 'send');
    Win32Check(Assigned(ProcAddress));

    Какие сообщения показывает этот код ?
  • @dimon (31.01.07 11:12) [32]

    > Какие сообщения показывает этот код ?

    Перехватывающая программа по прежнему ничего не выдает.
  • Сергей М. © (31.01.07 11:34) [33]

    > Перехватывающая программа по прежнему ничего не выдает.
    >


    Раз не выдает, значит твое утверждение в [30] насчет nil заведомо ложное.
  • @dimon (31.01.07 11:44) [34]
    И что делать?
  • Сергей М. © (31.01.07 11:56) [35]
    Как что ? Трассировать дальше ..
  • имя (08.08.07 20:35) [36]
    Удалено модератором
  • имя (08.08.07 20:35) [37]
    Удалено модератором
  • имя (27.11.07 05:18) [38]
    Удалено модератором
  • имя (04.05.08 02:43) [39]
    Удалено модератором
 
Конференция "Сети" » Перехват Сокетов [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]