Los Caballeros

"Sobre seguridad, programación, modding, frikismo, etc... "

Simple Sniffer por Sockets Raw en xs (Perl con C++)

Twitter icon Twitter icon
Bueno ya que nadie completo el primer reto aquí les coloco mi respuesta:


El xs:


#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/socket.h>
#include <features.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/ip.h>
class MyClass {
int raw;
char * interfaz;
int proto;
int buffer;
public:
MyClass(char * i, int p, int b) {
interfaz = i;
proto = p;
buffer = b;
Makeraw();
BindRaw();
}

~MyClass() {}
void closesocket() {
close(raw);
}

void Makeraw()
{
if((raw = socket(PF_PACKET, SOCK_RAW, htons(proto)))== -1)
{
perror("Imposible crear socket: ");
}
}

int BindRaw()
{

struct sockaddr_ll esqueleto;
struct ifreq ifr;
bzero(&esqueleto, sizeof(esqueleto));
bzero(&ifr, sizeof(ifr));
strncpy((char *)ifr.ifr_name, interfaz, IFNAMSIZ);
if((ioctl(raw, SIOCGIFINDEX, &ifr)) == -1)
{
printf("No se encontro esta interfaz!\n");
return 0;
}
esqueleto.sll_family = AF_PACKET;
esqueleto.sll_ifindex = ifr.ifr_ifindex;
esqueleto.sll_protocol = htons(proto);
if((bind(raw, (struct sockaddr *)&esqueleto, sizeof(esqueleto)))== -1)
{
perror("Imposible poner a la escucha esta interfaz!\n");
return 0;
}
return 1;

}

char * ascii2hex(char * packet,int len)
{
if(!packet)
return 0;
char * buffer = new char[(2 * len)+2];
if(!buffer)
{
return 0;
}
for (int i = 0; i < len; i++)
{
sprintf(buffer + 2 * i, "%02x", packet[i]);
}
return buffer;
}

char *leer()
{
/* proto = ETH_P_ALL */
char packet_buffer[buffer];
int len;
struct sockaddr_ll packet_info;
int packet_info_size = sizeof(packet_info_size);
if((len = recvfrom(raw, packet_buffer, buffer, 0, (struct sockaddr*)&packet_info, (socklen_t*)&packet_info_size)) == -1)
{
perror("No se pudo leer (-1)!");
return 0;
}
else
{
return ascii2hex(packet_buffer,len);
}
return 0;
}
};

MODULE = Xianur0 PACKAGE = Xianur0

MyClass *
MyClass::new(char * i, int p, int b)

char*
MyClass::leer()

void
MyClass::closesocket()

void
MyClass::DESTROY()



Ejemplo del uso (perl):



use Xianur0;
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(rpcb_gettime getnetconfigent);
bootstrap Xianur0;
my $xia = new Xianur0("wlan0",3,2048);
my $contador = 10;
while(($contador--) != 0) {
print "Packet: ".$xia->leer()."\n";
}
$xia->closesocket();
$xia->DESTROY();
print "Terminamos!\n";

1 comentarios:

daRksh3ll dijo...

excelentee post xianur0

aunk no entendii muyy biien su funciiOn, tendree k ponermee a estuudiiarr un poco mas sobree esto,jajaja xDDDDD

saludOs weii.!