Показать сообщение отдельно

  #10  
Старый 09.03.2006, 17:41
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


Thumbs down

Цитата:
Как я понял ты имеешь в виду во это:
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();
}

Последний раз редактировалось KEZ; 09.03.2006 в 17:51..
 
Ответить с цитированием