Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Raw Socket in Promiscuous-Mode



wual
18-11-2004, 06:52
Hi
Ich brauche einen Ausführlichen Beispiel oder Beschreibung wie ich mit RAW Sockets meine N.Karte in Promiscuous-Mode betreiben kann. Ich habe einen Sniffer geschrieben in (C) und das funzt nur lokal. Ich brauche aber alle Pakete und nicht nur die für meinen rechner bestimt sind. Also wer kann bitte helfen möglichst mit dem Beispiel (OS-Linus-SuSe oder RedHat)

Danke

f0rtex
18-11-2004, 10:28
hier ein minisniffer:


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <net/if.h>
#include <linux/filter.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
int sock, n;
char buffer[2048];
unsigned char *iphead, *ethhead;
struct ifreq ethreq;

/* Unser Filter */
struct sock_filter BPF_code[]= {
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 3, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 1, 0x00000001 },
{ 0x6, 0, 0, 0x00000060 },
{ 0x6, 0, 0, 0x00000000 },
};
struct sock_fprog Filter;
Filter.len = sizeof(BPF_code)/8;
Filter.filter = BPF_code;

if ((sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<0)
{
perror("socket");
exit(1);
}

/* Netzwerkkarte in den promiscuous mode versetzen */
strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
if (ioctl(sock,SIOCGIFFLAGS,&ethreq)==-1)
{
perror("ioctl");
close(sock);
exit(1);
}
ethreq.ifr_flags|=IFF_PROMISC;
if (ioctl(sock,SIOCSIFFLAGS,&ethreq)==-1)
{
perror("ioctl");
close(sock);
exit(1);
}

/* Filter dem Socket hinzufuegen */
if(setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter))<0)
{
perror("setsockopt");
close(sock);
exit(1);
}

while (1)
{
n = recvfrom(sock,buffer,2048,0,NULL,NULL);
printf("%d bytes read\n",n);

/* Ueberpruefe, ob das Paket mindestens komplette
* Ethernet (14), IP (20) und TCP/UDP (8)
* Header enthalten.
*/
if (n<42)
{
perror("recvfrom():");
printf("Incomplete packet (errno is %d)\n", errno);
close(sock);
exit(0);
}

ethhead = buffer;
printf( "Source MAC address: "
"%02x:%02x:%02x:%02x:%02x:%02x\n",
ethhead[0],ethhead[1],ethhead[2],
ethhead[3],ethhead[4],ethhead[5]);
printf( "Destination MAC address: "
"%02x:%02x:%02x:%02x:%02x:%02x\n",
ethhead[6],ethhead[7],ethhead[8],
ethhead[9],ethhead[10],ethhead[11]);

iphead = buffer+14; /* Überspringe Ethernet-Header */
if (*iphead==0x45) /* Überprüfe ob IPv4 ohne Options */
{
printf("Source host %d.%d.%d.%d\n",
iphead[12],iphead[13],
iphead[14],iphead[15]);
printf("Dest host %d.%d.%d.%d\n",
iphead[16],iphead[17],
iphead[18],iphead[19]);
printf("Source,Dest ports %d,%d\n",
(iphead[20]<<8)+iphead[21],
(iphead[22]<<8)+iphead[23]);
printf("Layer-4 protocol %d\n",iphead[9]);
}
}
}


ansonsten kann ich dir nur libpcap empfehlen. www.tcpdump.org

greets
f0rtex