Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
вот пример сниффера... этот работает...(Lcc-Win32) 20.10.06 01:14 Число просмотров: 2934
Автор: Tamas Статус: Member
|
вот пример сниффера... этот работает...(Lcc-Win32)
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#include <winsock2.h>
#include <mstcpip.h>
#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22)
struct SSOCKET_ADDRESS_LIST
{
int iAddressCount;
SOCKET_ADDRESS Address[255];
};
typedef struct SSOCKET_ADDRESS_LIST SOCKET_ADDRESS_LIST;
#define NET_ADAPTER_NUM 0
#define MAX_PACKET_SIZE 0x10000
struct SIPHEADER
{
unsigned char VerLen;
unsigned char ServiceType;
unsigned short PacketLength;
unsigned short Id;
unsigned short Offset;
unsigned char TTL;
unsigned char Protocol;
unsigned short XSum;
unsigned char SrcIP[4];
unsigned char DestIP[4];
};
typedef struct SIPHEADER IPHEADER;
struct SIPPACKET
{
unsigned char Header[sizeof(IPHEADER)];
unsigned char Data[MAX_PACKET_SIZE];
};
typedef struct SIPPACKET IPPACKET;
bool main()
{
SOCKET SocketAddr;
SOCKET SocketBind;
SOCKET_ADDRESS_LIST AddrList;
WSADATA WSAData;
SOCKADDR_IN LocalAddr;
IPPACKET IPPacket;
IPHEADER IPHeader;
unsigned char AddrBuffer[2048];
unsigned long AddrRet;
unsigned long Recl;
int RecvOpt;
if(WSAStartup(MAKEWORD(2,2),&WSAData))return false;
if(LOBYTE(WSAData.wVersion)>=2)
{
if(LOBYTE(WSAData.wHighVersion)<2)return false;
}
else
{
return false;
}
LocalAddr.sin_family=AF_INET;
if((SocketAddr=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET)return false;
if(WSAIoctl(SocketAddr,SIO_ADDRESS_LIST_QUERY,NULL,0,(void *)&AddrList,sizeof(AddrList),&AddrRet,NULL,NULL)==SOCKET_ERROR)
{
closesocket(SocketAddr);
return false;
}
if(NET_ADAPTER_NUM>=AddrList.iAddressCount)
{
closesocket(SocketAddr);
return false;
}
LocalAddr.sin_addr.s_addr=((SOCKADDR_IN *)AddrList.Address[NET_ADAPTER_NUM].lpSockaddr)->sin_addr.s_addr;
closesocket(SocketAddr);
if((SocketBind=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)return false;
if(bind(SocketBind,(SOCKADDR *)&LocalAddr,sizeof(LocalAddr))==SOCKET_ERROR)
{
closesocket(SocketBind);
return false;
}
RecvOpt=RCVALL_ON;
ioctlsocket(SocketBind,SIO_RCVALL,&RecvOpt);
ZeroMemory(&IPPacket,sizeof(IPPacket));
ZeroMemory(&IPHeader,sizeof(IPHeader));
while((Recl=recv(SocketBind,(unsigned char *)&IPPacket,sizeof(IPPacket),0))!=SOCKET_ERROR)
{
if(Recl>=sizeof(IPHEADER))
{
memcpy(&IPHeader,&IPPacket.Header,sizeof(IPHEADER));
printf("%d.%d.%d.%d -> %d.%d.%d.%d %d %d\n",IPHeader.SrcIP[0],IPHeader.SrcIP[1],IPHeader.SrcIP[2],IPHeader.SrcIP[3]
,IPHeader.DestIP[0],IPHeader.DestIP[1],IPHeader.DestIP[2],IPHeader.DestIP[3],IPHeader.Protocol,Recl);
}
ZeroMemory(&IPPacket,sizeof(IPPacket));
ZeroMemory(&IPHeader,sizeof(IPHeader));
}
closesocket(SocketBind);
WSACleanup();
return true;
}
|
|
|