Page personnelle de Nicolas Favre-Félix

libBlacksmith

libBlackSmith est un ensemble de classes C++ permettant l'envoi de données personnalisées sur un réseau.
4 des 5 couches du modèle OSI simplifié sont disponibles :
  • La couche Physique est le média sur lequel transitent les données
  • La couche Liaison de données (Ethernet, WiFi, PPP)
  • La couche Réseau (IP, ARP, RARP)
  • La couche Transport (TCP, UDP, ICMP, IGMP)
  • La couche Application (DataLayer)
Cette bibliothèque de classes facilite la programmation d'un logiciel devant envoyer des paquets "bas niveau" sur une plateforme Unix. Typiquement, les logiciels d'audit réseau, de scan, de détection de vulnérabilités ou de sécurité peuvent avoir besoin de telles fonctionnalités. Il est également possible de disposer d'un anonymat avancé lors de l'envoi de ces paquets (l'adresse unique de la carte réseau, gravée par le constructeur, pouvant être modifiée).
libBlacksmith ne dépend pas d'autres bibliothèques, et doit être compilée avec le programme qui l'utilise. Il n'existe donc pas de fichier binaire et d'objet à lier après la compilation.

Exemple d'envoi d'un paquet contrôlé de A à Z :
Packet P = Packet();

EthernetLayer *lnk = new EthernetLayer();
IPLayer *ip = new IPLayer();
TCPLayer *tcp = new TCPLayer();
DataLayer *data = new DataLayer();

uchar src[6], dst[6];
for(int i=0; i<6; i++){
src[i] = std::rand();
dst[i] = std::rand();
}

lnk->setSource(src);
lnk->setDestination(lnk->getMAC("eth1"));
lnk->setType(8);

ip->setVersion(4);
ip->setHlen(5);
ip->setTos(0);
ip->setTotalSize(40);
ip->setIdentification(0);
ip->setFlags(0);
ip->setFragmentOffset(0);
ip->setTtl(123);
ip->setProtocol(TCPLayer::PROTOCOL);
ip->setSource("192.168.0.4");
ip->setDestination("192.168.0.1");
ip->setChecksum();

tcp->setSourcePort(777);
tcp->setDestPort(80);
tcp->setHlen(5);

data->setData("CECI EST UN TEST", 16);

tcp->setChecksum(ip->getSource(), ip->getDestination(), data->get(), data->size());


P.Link = lnk;
P.Network = ip;
P.Transport = tcp;
P.Data = data;
P.send("eth0"); /* Envoie le paquet sur l'interface eth0 */
delete lnk;
delete ip;
delete tcp;
delete data;