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

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

Socks5 клиент, как состряпать запрос ? [D7, Win2k, WinXP]


Страницы:   1 2

AHTOLLlKA ©   (2008-07-08 09:37:00) 

инжекюсь в приложение, делаю хук на connect

и пытаюсь переправить программу через sock5 прокси сервер (в программе нет возможности указать чтобы она работала через прокси, вот и приходиться)
вобщем аналог фрикапа...
на сокс4 все сделал.. работало а на сокс5 не могу..
вот функция.. которой подменяю connect

function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
var
sh5:TSocks5Header;
sh50:TSocks5Header0;
   uname:string;
   s2in:sockaddr_in;
   prxy_a:string;
   prxy_p:word;
   buff:array[0..16]of char;
   i:dword;

begin

ZeroMemory(@sh50,sizeof(tsocks5header0));
CopyMemory(@s2in,sain,sizeof(s2in));

ZeroMemory(@sh5,sizeof(TSocks5Header));

 prxy_p:=31337;
 prxy_a:='127.0.0.1';
 s2in.sin_addr.S_addr:=inet_addr(pchar(prxy_a));
 s2in.sin_port:=htons(prxy_p);

 UnHookCodeHook(@rd_c);
 result:=connect(s,s2in,slen);

 SetCodeHook(rd_c.Address,@hconnect,@rd_c);
 i:=GetLastError;

if conn=true then
begin
conn:=false;
 sh50.VER:=$05;
 sh50.NMETHODS:=$01;
 sh50.METHODS:=$00;

 send(s,sh50,sizeof(tsocks5header0),0);
 sleep(100);
 recv(s,sh50,sizeof(tsocks5header0),0);

end;

 if sh50.VER=$05 then
 begin
 sh5.VER:=$05;
 sh5.CMD:=$01;
 sh5.RSV:=$00;
 sh5.ATYP:=$01;
 sh5.dIP:=sain^.sin_addr;
 sh5.wPort:=sain^.sin_port;

 send(s,sh5,sizeof(tsocks5header),0);
 sleep(100);
 recv(s,sh5,sizeof(tsocks5header),0);

 end;
end;


кто тыкнет в недочет ?? почему не работает ? вроде как в рфц указано сделал..


AHTOLLlKA   (2008-07-08 13:26:00) [21]

если кто хочет подзаработать немношко $ велкам в асю 909021


AHTOLLlKA   (2008-07-08 13:07:00) [22]


> и мы низнаем что за прокси и как там реализовано

фрикап с этим прокси работает без проблем...


AHTOLLlKA   (2008-07-08 13:05:00) [23]


> 1. зачем Rcv/Snd перехватываешь?

а как еще можно то перехватить конект


AHTOLLlKA   (2008-07-08 13:04:00) [24]


> AHTOLLlKA   (08.07.08 12:53) [11]забанен :(

мм-м-м- ?


Slym   (2008-07-08 13:00:00) [25]

AHTOLLlKA   (08.07.08 12:53) [11]
забанен :(
AHTOLLlKA   (08.07.08 12:54) [12]
может я наркаман

может проверять после каждого шага...


AHTOLLlKA   (2008-07-08 12:54:00) [26]


> откуда lbyte? он вроде как не предусмотрен :)

ога ога в 4ом предусмотрен, но если собирать хедер без него.. я хз почему не пашет.. может я наркаман ?7


AHTOLLlKA   (2008-07-08 12:53:00) [27]

Slym ©  сиукни в аську 909021 пожалуста, если не сложно..


umbra   (2008-07-08 12:50:00) [28]


> TSocks5Header = packed record
>    VER: byte;
>    CMD: byte;
>    RSV: byte;
>    ATYP: byte;
>    dIP: in_addr;
>    wPort: word;
>    lbyte:byte;// <-- Null
>  end;


откуда lbyte? он вроде как не предусмотрен :)


Slym   (2008-07-08 12:49:00) [29]

1. зачем Rcv/Snd перехватываешь?
2. Сплайсинг похоже через таблицу импорта... тогда зачем каждый раз UnHookCodeHook, утебя есть реальная точка входа в функцию
3. send/recv всетаки не процедуры, а функции - нет проверки на результаты вызова
4. sleep(100); - зочем?
5 вроде с сокс4 так работало- скорее всего и продолжает, но RFC не обязывает, и мы низнаем что за прокси и как там реализовано


AHTOLLlKA   (2008-07-08 12:36:00) [30]


> >  if sh50.VER=$05 thenа почему не проверяете второй байт?
>  может там $FF?

 if (sh50.VER=$05) and (sh50.NMETHODS=$00) then
мне так или иначе нужен конект без авторизации так что буду на 00 проверять
все проходит дальше..


> И скажите все-таки, на какой стадии происходит затык?


авторизация как я помян у меня происходт успешно.. вот дальнейший конект не работает, теость приложение не работает по сети


umbra   (2008-07-08 12:23:00) [31]


>  send(s,sh50,sizeof(tsocks5header0),0);
>  sleep(100);
>  recv(s,sh50,sizeof(tsocks5header0),0);

неплохо бы проверять, какое значение вернула recv


>
>  if sh50.VER=$05 then

а почему не проверяете второй байт? может там $FF?

И скажите все-таки, на какой стадии происходит затык?


AHTOLLlKA   (2008-07-08 12:14:00) [32]


> Slym ©

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


AHTOLLlKA   (2008-07-08 12:10:00) [33]

спасибо всем за ответы, привожу остальной код..

unit Soxify;

interface

uses
 windows,
 StrUtils,
 splicing,
 sysutils,
 winsock;

type

 TSocks5Header0 = packed record
   VER: byte;
   NMETHODS: byte;
   METHODS: byte;
 end;

 TSocks5Header = packed record
   VER: byte;
   CMD: byte;
   RSV: byte;
   ATYP: byte;
   dIP: in_addr;
   wPort: word;
   lbyte:byte;// <-- Null
 end;

var
 ppt: string;{proxyperthr}
 rd_S,rd_R,rd_c:TFunctionRestoreData;
conn:boolean=true;

function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
function set_curr_sock(sock:string):bool;
function go_soxify:bool;
function go_sniff:bool;

implementation

function str2int( S: PChar ): Integer;
var M : Integer;
begin
  Result := 0;
  if S = '' then Exit;
  M := 1;
  if S^ = '-' then
  begin
     M := -1;
     Inc( S );
  end
    else
  if S^ = '+' then
    Inc( S );
  while S^ in [ '0'..'9' ] do
  begin
     Result := Result * 10 + Integer( S^ ) - Integer( '0' );
     Inc( S );
  end;
  if M < 0 then
     Result := -Result;
end;

function hconnect(s:dword;sain:PSockAddrIn;slen:integer):integer;stdcall;
var
sh5:TSocks5Header;
sh50:TSocks5Header0;
   uname:string;
   s2in:sockaddr_in;
   prxy_a:string;
   prxy_p:word;
   buff:array[0..16]of char;
   i:dword;

begin

ZeroMemory(@sh50,sizeof(tsocks5header0));
CopyMemory(@s2in,sain,sizeof(s2in));

ZeroMemory(@sh5,sizeof(TSocks5Header));

 prxy_p:=31337;
 prxy_a:='127.0.0.1';
 s2in.sin_addr.S_addr:=inet_addr(pchar(prxy_a));
 s2in.sin_port:=htons(prxy_p);

 UnHookCodeHook(@rd_c);
 result:=connect(s,s2in,slen);

 SetCodeHook(rd_c.Address,@hconnect,@rd_c);
 i:=GetLastError;

if conn=true then
begin
conn:=false;
 sh50.VER:=$05;
 sh50.NMETHODS:=$01;
 sh50.METHODS:=$00;

 send(s,sh50,sizeof(tsocks5header0),0);
 sleep(100);
 recv(s,sh50,sizeof(tsocks5header0),0);

end;

 if sh50.VER=$05 then
 begin
 sh5.VER:=$05;
 sh5.CMD:=$01;
 sh5.RSV:=$00;
 sh5.ATYP:=$01;
 sh5.dIP:=sain^.sin_addr;
 sh5.wPort:=sain^.sin_port;


 send(s,sh5,sizeof(tsocks5header),0);
 sleep(100);
 recv(s,sh5,sizeof(tsocks5header),0);

 end;

end;

function go_soxify:bool;
begin

 splicing.SetProcedureHook(GetModuleHandle('wsock32'),'connect',@hconnect,@rd_c);
end;

function set_curr_sock(sock:string):bool;
begin  ppt:=sock;
end;

function hsend(s:dword;buffer:pchar;blen:dword;flags:dword):integer;stdcall;
begin
 sleep(100);
 UnHookCodeHook(@rd_S);
 result:=send(s,buffer^,blen,flags);
 SetCodeHook(rd_S.Address,@hsend,@rd_s);
 DeleteFile('blia');
end;

function hrecv(s:dword;buffer:pchar;blen:DWORD;flags:dword):integer;stdcall;
begin

 UnHookCodeHook(@rd_r);
 result:=recv(s,buffer^,blen,flags);
 SetCodeHook(rd_r.Address,@hrecv,@rd_r);

end;

function go_sniff:bool;
begin
   if not splicing.SetProcedureHook(GetModuleHandle('ws2_32'),'send',@hsend,@rd_S)then
   if not splicing.SetProcedureHook(GetModuleHandle('wsock32.dll'),'send',@send,@rd_R) then
     messagebeep(MB_ICONWARNING);
     
   if not splicing.SetProcedureHook(GetModuleHandle('wsock32.dll'),'recv',@hrecv,@rd_R) then
   if not splicing.SetProcedureHook(GetModuleHandle('ws2_32.dll'),'recv',@hrecv,@rd_R) then
     messagebeep(MB_ICONWARNING);
end;

end.


это unit который собственно все и делает


Slym   (2008-07-08 11:54:00) [34]

AHTOLLlKA   (08.07.08 9:37)
send(s,sh5,sizeof(tsocks5header),0);
recv(s,sh5,sizeof(tsocks5header),0);

ответ может быть другой длинны: например BND.ADDR вернется $03-доменное_имя, а не IP...
т.е. выкачиваешь не весь пакет и огрызок достается приложению-жертве


Slym   (2008-07-08 11:34:00) [35]

0. как делал перехват
1. sleep(100);
ПЛОХО, не надо спать - надо дело делать

2.не приведено описалово TSocks5Header и TSocks5Header0


Slym   (2008-07-08 11:34:00) [36]

добейся чтоб без перехватов работало, а уж потом инжекся в жертву


umbra   (2008-07-08 11:34:00) [37]


> TSocks5Header0

а что это за зверь? и какой ответ получаете от прокси?


Страницы:   1 2

Наверх

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