Java : Qui a construit ma carte Ethernet/Wifi ?

Krobignole2902

Pilier
Membre du personnel
Responsable
Inscrit
21/6/20
Messages
111
Points
290
Age
19
Localité
France
Site web
twitter.com
00:11:43:00:00:01

Est ce que vous pourriez me donner
qui a construit la carte ayant cette adresse MAC ?

Dans un premier temps, je pense que votre première question est surtout, "
c'est quoi une adresse MAC" (et même si c'est pas le cas jvais quand même devoir expliquer c'est quoi)

Une adresse MAC est une adresse codée en dur sur votre carte réseau. Cela signifie qu'en théorie, vous ne pouvez pas en changer (je dis bien en théorie parce qu'au final on peut bidouiller un peu pour la changer)

Sur différents réseaux, ce sont les adresses IP qui communiquent,
mais sur un même réseau, les équipement communiquèrent avec les adresses MAC (avec un peu d'ARP mais on va pas parler de ça ..)

Une adresse MAC est composé de 12 caractères en Hexadécimal, ce qui fait ... un certain nombre d'adresses.

Fun fact avec ces adresses,
il est possible de savoir quelle le constructeur derrière l'équipement.

En fait lors de la construction des cartes, les entreprises "réservent" des adresses MAC par paquets, et réserver quelques premiers caractères pour identifier le constructeur.

Dans le cas de cette adresse : 00:11:43:00:00:01, "00:11:43" désigne le constructeur "Dell Inc".

Il existe plusieurs sites pour savoir justement de quelle constructeur vient la carte (et si vous me sortez qu'il suffit de faire un ipconfig /all dans le CMD pour connaître le constructeur de votre carte jvais trouver votre adresse)

"
https://macvendors.com/", est un site qui permet d'obtenir le constructeur d'une carte avec justement l'adresse MAC.

Maintenant on va parler Java (parce que c'est le premier mot du titre de la discu quand même..) :

Peut on faire un programme qui permettent de récupérer directement le constructeur d'une carte avec la MAC ?

Alors, oui, sinon je ferais pas la discu, mais maintenant, on va répondre à la questions, "Comment le faire ?":

On va utiliser plusieurs outils pour ce faire :


Java:
import java.net.*;
import java.util.Scanner;
import java.io.*;

public class ClasseMere {

    public static void main(String[] args) throws IOException, InterruptedException {
        
        String macAPILink = "http://api.macvendors.com";
        
        if(args.length >= 1) {
            int i;
            for(i=0;i<args.length;i++) {
                String macAddress = args[i];
                System.out.println("Accès à "+macAPILink+"/"+macAddress);
                URL macAPIFullLink = new URL(macAPILink + "/" + macAddress);
                URLConnection rc = macAPIFullLink.openConnection();
                try {
                    BufferedReader ic = new BufferedReader(new InputStreamReader(rc.getInputStream()));
                    String inputLine;
                    while((inputLine = ic.readLine()) != null) {
                        System.out.println("Le constructeur de cette carte réseau est "+inputLine);
                        System.out.println("----------------");
                        Thread.sleep(2000);
                    }
                    ic.close();
                }
                catch(FileNotFoundException e) {
                    System.out.println("Ce constructeur est inconnue ou cette adresse est bidon");
                    System.out.println("----------------");
                    Thread.sleep(2000);
                }
            }
            System.out.println("Finis.");
        }else {
        
            Scanner sc = new Scanner(System.in);
            System.out.println("Veuillez saisir l'adresse MAC : ");
            String macAddress = sc.next();
            System.out.println("Accès à "+macAPILink+"/"+macAddress);
            URL macAPIFullLink = new URL(macAPILink + "/" + macAddress);
            URLConnection rc = macAPIFullLink.openConnection();
            try {
                BufferedReader ic = new BufferedReader(new InputStreamReader(rc.getInputStream()));
                String inputLine;
                while((inputLine = ic.readLine()) != null) {
                    System.out.println("Le constructeur de cette carte réseau est "+inputLine);
                }
                ic.close();
            }
            catch(FileNotFoundException e) {
                System.out.println("Ce constructeur est inconnue ou cette adresse est bidon");
            }
        }

        
        
    }
    
}
Alors, ça, fait, un, peu, beaucoup, à, lire, mais, je, vais, simplifier, alors, svp, quittez, pas, pitié

J'ai un peu optimisé mon programme pour qu'il prenne en compte deux cas de figures :
  • Les adresses MAC sont données en arguments du programme
  • On donne une adresse MAC pendant l'exécution du programme

Et vu que je viens de perdre 85% de mes lecteurs juste avec cette liste de 2 puces, on va juste se concentrer sur le deuxième cas de figure :

Code:
String macAPILink = "http://api.macvendors.com";
Scanner sc = new Scanner(System.in);
            System.out.println("Veuillez saisir l'adresse MAC : ");
            String macAddress = sc.next();
            System.out.println("Accès à "+macAPILink+"/"+macAddress);
            URL macAPIFullLink = new URL(macAPILink + "/" + macAddress);
            URLConnection rc = macAPIFullLink.openConnection();
            try {
                BufferedReader ic = new BufferedReader(new InputStreamReader(rc.getInputStream()));
                String inputLine;
                while((inputLine = ic.readLine()) != null) {
                    System.out.println("Le constructeur de cette carte réseau est "+inputLine);
                }
                ic.close();
            }
            catch(FileNotFoundException e) {
                System.out.println("Ce constructeur est inconnue ou cette adresse est bidon");
            }
        }
Donc déjà jvais expliquer ce qu'est le site "
http://api.macvendors.com".

C'est la même chose que le premier site que j'avais présenté pour choper le constructeur de la carte,
mais en plus "simple", en fait vous devez taper l'adresse du site, /, l'adresse MAC de la carte, et le site va juste afficher le constructeur.

Cette version simplifié nous convient très bien, parce que d'une on a juste ce dont on a besoin, le constructeur, et de deux....,
parce que c'est cool

Vu que y'a pas beaucoup de ligne jvais expliquer ligne par ligne le code :

Ligne 1, on définit une chaîne de caractères qui
contient l'adresse du site. Ca va nous servir pour plus tard, j'y reviendrai.

Ligne 2, on
définit puis instancie un Scanner, qui va permettre à l'utilisateur de saisir au clavier, donc ici saisir l'adresse MAC

Ligne 3 et 4, on demande à l'utilisateur de saisir une adresse MAC,
puis on donne la possibilité à l'utilisateur de justement faire une saisir au clavier. "sc" étant le Scanner, et "next()" une méthode pour saisir du texte. Ce texte, on va le stocker dans une variable réutilisé par la suite.

Ligne 5, on affiche juste l'URL de la page qu'on va charger

Ligne 6,
on définit une URL grâce à la classe URL du package java.net. On va reprendre notre adresse de site et notre adresse mac pour concaténer tout ça et former une adresse utilisable. Donc, on a l'adresse du site, un slash, l'adresse MAC, ça peut donner par exemple : http://api.macvendors.com/00:11:43:FF:FF:FF

Ligne 7, on se connecte au site avec la classe URLConnection. Pour ça, on prend la variable dans laquelle est stockée l'URL, puis on utilise la méthode "openConnection", qui permet justement de se connecter au site.


Maintenant, on a un "try" et un "catch", mais c'est quoi ?
En fait le try catch permet de prévoir une exception, une erreur dans le code. Il en existe plusieurs, on a par exemple la division par 0, une valeur trop grande atteinte, et j'en passe.

Ici, on veut capturer un "FileNotFoundException" mais pourquoi ?

Imaginons que notre adresse MAC soit bidon, ou bien que le constructeur ne soit pas renseigné et que le site ne le connaisse pas, il faut donc prévoir cette exception. Si jamais le site ne connait pas l'adresse MAC qu'on souhaite chercher, il retourne "{"errors":{"detail":"Not Found"}}",
ce que Java interprète comme un "FileNotFoundException". On prévoir alors deux blocs de code :
  • Un qui exécute le code qu'on veut, le try
  • Un autre qui se lance quand on rencontre l'exception, le catch
Le bloc try contient une première instruction, qui permet de créer un flux de lecture, et on vient justement lire le contenu de la page. Ensuite dans notre boucle While, qui est une boucle qui se répète dans que la condition est vrai (ici il faut que le contenu de notre variable inputLine ne soit pas "null", donc ne contiennent pas rien), on vient lire la première et unique ligne de notre flux de lecture, le constructeur.

Le bloc catch, quand à lui affiche tout simplement un message d'erreur, qui annonce que l'adresse est soit bidon soit non reconnue.


Pour conclure, on peut voir que le programme utilise deux fonctionnalités intéressantes. Déjà il utilise les classes qui permettent de se connecter sur un site Web, afin d'en extraire et lire le contenu, mais également le fait de se connecter sur une URL qu'on génère nous même (avec l'adresse MAC)

Ensuite, c'est également intéressant de savoir quelle constructeur est derrière une carte réseau.
Ca peut permettre plein de chose, notamment en réseau. On peut voir quelle type d'appareil se connecte sur un équipement par exemple, ou bien même se faire passer pour un autre appareil, ça peut avoir son utilisé pour qui veut.

la biz
 
Haut