Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Прослушивание 80 порта (https://forum.antichat.xyz/showthread.php?t=15243)

ascas 01.03.2006 20:05

Прослушивание 80 порта
 
Как можно настроить сокет на прослушку 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

Цитата:

Сообщение от nerezus
нет

А куда он отправляет ответ? Через тот же самый сокет который я открываю мне назад ничего не приходит :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

Цитата:

Сообщение от KEZ
либо создаешь RAW сокет, ставишь сетевуху в неразбор. режим и слушаешь все пакеты которые идут.

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

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

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

ascas 03.03.2006 00:18

Цитата:

Сообщение от F1reF0x
Вот так вот слушаешь 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();
}



Время: 02:39