Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
вот пример сниффера... этот работает...(Lcc-Win32) 20.10.06 01:14 Число просмотров: 2941
Автор: 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;
}
|
<programming>
|
[C++] TCP RAW 19.10.06 23:01
Автор: fidel Статус: Незарегистрированный пользователь
|
Не получается наначать работу с RAW socket. После установки свойств сокета функцией WSAIoctl возвращается ошибка 10022.(Типа не правельны какие-то параметры.)
void RecvPacket()
{
SOCKET sock;
WSADATA wsd;
char RecvBuf[65535] = {0};
DWORD dwBytesRet;
unsigned int optval = 1;
WSAStartup(MAKEWORD(2,1),&wsd);
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
char FAR name[MAX_HOSTNAME_LAN];
gethostname(name, MAX_HOSTNAME_LAN);
struct hostent FAR * pHostent;
pHostent = (struct hostent * )malloc(sizeof(struct hostent));
pHostent = gethostbyname(name);
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(600);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
int err=bind(sock, (SOCKADDR *)&sa, sizeof(sa));
if(err==0){MessageBox(0,"Bind OK","",0);};
ZeroMemory(&dwBytesRet,sizeof(dwBytesRet));
err=WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NULL,NULL,&dwBytesRet, NULL, NULL);
if(err==0){MessageBox(0,"","",0);};
err=WSAGetLastError();
while (1)
{
memset(RecvBuf, 0, sizeof(RecvBuf));
recv(sock, RecvBuf, sizeof(RecvBuf), 0);
}
|
|
сниффер можно установить только на реальный интерфейс...так... 20.10.06 01:16
Автор: Tamas Статус: Member
|
сниффер можно установить только на реальный интерфейс...так что gethostname(name, MAX_HOSTNAME_LAN); не прокатит
> Не получается наначать работу с RAW socket. После установки > свойств сокета функцией WSAIoctl возвращается ошибка > 10022.(Типа не правельны какие-то параметры.) > > void RecvPacket() > { > SOCKET sock; > WSADATA wsd; > char RecvBuf[65535] = {0}; > DWORD dwBytesRet; > unsigned int optval = 1; > > WSAStartup(MAKEWORD(2,1),&wsd); > > sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); > > char FAR name[MAX_HOSTNAME_LAN]; > gethostname(name, MAX_HOSTNAME_LAN); > > struct hostent FAR * pHostent; > pHostent = (struct hostent * )malloc(sizeof(struct > hostent)); > pHostent = gethostbyname(name); > > SOCKADDR_IN sa; > sa.sin_family = AF_INET; > sa.sin_port = htons(600); > > memcpy(&sa.sin_addr.S_un.S_addr, > pHostent->h_addr_list[0], pHostent->h_length); > > int err=bind(sock, (SOCKADDR *)&sa, > sizeof(sa)); > if(err==0){MessageBox(0,"Bind OK","",0);}; > ZeroMemory(&dwBytesRet,sizeof(dwBytesRet)); > > err=WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NUL > L,NULL,&dwBytesRet, NULL, NULL); > if(err==0){MessageBox(0,"","",0);}; > err=WSAGetLastError(); > > while (1) > { > memset(RecvBuf, 0, sizeof(RecvBuf)); > > recv(sock, RecvBuf, sizeof(RecvBuf), 0); > > }
|
|
вот пример сниффера... этот работает...(Lcc-Win32) 20.10.06 01:14
Автор: 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;
}
|
|
|