PDA

Просмотр полной версии : Прослушивание 80 порта


ascas
01.03.2006, 20:05
Как можно настроить сокет на прослушку 80 порта? когда я его настрайваю мне пишет что одним портом может пользоваться только одна прога. Но проблема в том что когда я соеденяюсь с гугл, он присылает ответ на 80 порт, хотя мой сокет работает на 181.

fucker"ok
01.03.2006, 20:09
Тебе нужно воспользоватся снифером. (например ethereal)
http://www.ethereal.com/

А открывать сокет на один и тот же порт нельзя (имхо)
Иначе как программа определит что это её пакет? :]

nerezus
01.03.2006, 20:10
когда я его настрайваю мне пишет что одним портом может пользоваться только одна прога. да
Но проблема в том что когда я соеденяюсь с гугл, он присылает ответ на 80 портнет

ascas
01.03.2006, 22:28
нет
А куда он отправляет ответ? Через тот же самый сокет который я открываю мне назад ничего не приходит :confused:

KEZ
02.03.2006, 00:43
КАК МОЖНО ОТПРАВЛЯТЬ ОТВЕТ ЧЕРЕЗ СОКЕТ???
Можно отправлять IP пакет с TCP фреймом, в котором есть
SrcIP
DstIP
SrcPORT
DstPORT

В винде хендл - это индекс в таблицах которые храняться в ядре. Хендлы можно копировать из одного процесса в другой, с помощью DuplicateHandle. Сокеты - это ХЕНДЛЫ. Их используют чтобы приложению было легче.
Гугл шлет ответ на твой айпи и порт который может быть ЛЮБЫМ.
Так что либо ты пишешь драйвер который атачит девайс на \Device\Tcp,
либо создаешь RAW сокет, ставишь сетевуху в неразбор. режим и слушаешь все пакеты которые идут. Доступа к Ethernet заголовкам тогда нету.

F1reF0x
02.03.2006, 12:32
Как можно настроить сокет на прослушку 80 порта?

uses winsock;

procedure BindPort(Sender: TObject);
var
WSD: TWSAData;
Sock: TSocket;
Addr: TSockAddr;
Len: Integer;
AcceptedSock:TSocket;
begin
WSAStartUp(MakeWord(1,0), WSD);
Sock:= Socket(AF_Inet, Sock_Stream, 0);
Addr.sin_family:= PF_Inet;
Addr.sin_port:= Htons(25555);
Addr.sin_addr.S_addr:=InAddr_Any;
FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
Bind(Sock, Addr, SizeOf(Addr));
Listen(Sock, SoMaxConn);
Len:= SizeOf(TSockAddr);
AcceptedSock:= Accept(Sock, @Addr, @Len);
WSACleanUp;
End;

Вот так вот слушаешь 80 порт

ascas
03.03.2006, 00:16
либо создаешь RAW сокет, ставишь сетевуху в неразбор. режим и слушаешь все пакеты которые идут.

Как я понял ты имеешь в виду во это:
New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified)
мне выдает вот что:

"Предпринятая операция не поддерживается для выбранного типа объекта"

Как бы я не менял настройки, практически всегда мне выдает такую фигню

ascas
03.03.2006, 00:18
Вот так вот слушаешь 80 порт

Спасибо конечно, в будущем пригодиться, но я не на delphi счас пишу :)

drmist
09.03.2006, 17:36
ascas
почитай про перехват апи.
Очень хорошие статьи с исходниками на delphi и C++ есть на Wasm.ru - автор Ms-rem.
В случае с сокетами перехват лучше реализуется в ring0.

KEZ
09.03.2006, 17:41
Как я понял ты имеешь в виду во это:
New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified)


Нет я имею ввиду ф-ии socket, bind, accept из ws2_32.dll и winsock.dll
Используя какой язык ты будешь из вызывать - не имеет никакого значения, хоть на вашем дурацком делфи.
(Ты спросил - я ответил)


почитай про перехват апи.
В случае с сокетами перехват лучше реализуется в ring0.


Куришь (план) ?



Для самых ленивых

#include <conio.h>
#include <stdio.h>
#include <winsock2.h>

#define MAX_PACKET_SIZE 0x10000
#define SIO_RCVALL 0x98000001
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECNECHO 0x40 /* ECN Echo */
#define TH_CWR 0x80 /* ECN Cwnd Reduced */
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)

#pragma comment( lib, "wsock32.lib" )

char Buffer[MAX_PACKET_SIZE];

typedef struct IPHeader {
UCHAR iph_verlen;
UCHAR iph_tos;
USHORT iph_length;
USHORT iph_id;
USHORT iph_offset;
UCHAR iph_ttl;
UCHAR iph_protocol;
USHORT iph_xsum;
ULONG iph_src;
ULONG iph_dest;
} IPHeader;


struct tcphdr {
USHORT th_sport; /* source port */
USHORT th_dport; /* destination port */
ULONG th_seq; /* sequence number */
ULONG th_ack; /* acknowledgement number */
UCHAR th_offx2; /* data offset, rsvd */
UCHAR th_flags;
USHORT th_win; /* window */
USHORT th_sum; /* checksum */
USHORT th_urp; /* urgent pointer */
};


char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;


USHORT Checksum( PUCHAR Data, USHORT Length )
{
ULONG sum=0;
USHORT sshort=0;
PUSHORT wd=(PUSHORT)Data;
USHORT wc=Length >> 1;

while(wc--)
sum+=*wd++;
if(Length & 1)
sum+=*(PUCHAR)wd;

while( sum >> 16 )
sum = (sum & 0xFFFF) + (sum >> 16);

return (sum != 0xFFFF) ? ~sum : sum;
}

void printbuf( char *buf, int len )
{
char str[15];
int k = 0;

for (int i = 0; i < len; i++)
{
memset( str, 0, 15 );
sprintf( str, "%x", abs( buf[i] ) );
if (strlen( str ) == 1)
{
str[1] = str[0];
str[0] = '0';
}
printf( "%s ", str );
if (k == 15)
{
printf( "\n" );
k = 0;
}
else k++;
}
}

void main()
{
WSADATA wsadata;
SOCKET s;
char name[128];
HOSTENT* phe;
SOCKADDR_IN sa;
IN_ADDR sa1;
char ttl[25];
int i;
WORD *wd;
ULONG summ;
unsigned long flag = 1;
IPHeader *hdr;
tcphdr *thdr;

WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr =((struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));

ioctlsocket( s, SIO_RCVALL, &flag );

int ai = 0;
while( !_kbhit() )
{
memset( Buffer, 0, MAX_PACKET_SIZE );
int count;
count = recv( s, Buffer, sizeof( Buffer ), 0 );
if (count >= sizeof( IPHeader) )
{
//summ=0;
hdr = (IPHeader*)Buffer;
thdr = (tcphdr*)Buffer + sizeof( IPHeader );
//wd=(WORD *)Buffer;
//printf( "%u ", hdr->iph_verlen & 0xF);
//printf( "0x%X ", ntohs(hdr->iph_xsum));
//hdr->iph_xsum=0;
//printf( "0x%X \n", htons(Checksum((PUCHAR)Buffer, (hdr->iph_verlen & 0xF)*4)));
if (hdr->iph_protocol == IPPROTO_TCP)
{
//printf( "%d.\n", ai );
//printbuf( (char*)hdr, count );
//printf( "\n\n" );
printf( "ACK: %d\n", thdr->th_ack );
for (int j = 0; j <= count; j++)
printf( "%c", Buffer[j] );
printf( "\r\n" );
ai++;
}
}
}

closesocket( s );
WSACleanup();
}

drmist
10.03.2006, 22:06
KEZ
http://forum.antichat.ru/showpost.php?p=123023&postcount=8

KEZ
10.03.2006, 23:19
У тебя есть план? Какие же ф-ии SDT ты будешь перехыватывать чтобы слушать траффик?... Скорее всего было написано что можно поставить фильтр, на Tcp ф-ией IoAttachDeviceToDeviceStack в паре с IoGetDeviceObjectPointer или IoAttachDevice