![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Socks5 клиент, как состряпать запрос ? [D7, Win2k, WinXP]
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
а что это за зверь? и какой ответ получаете от прокси?