
Tests USB simplifiés

a. Test de périphérique uniquement
b. Configuration minimale agfs au milieu
c. Configuration complète agfs au milieu avec support de débogage
a. Linux
AutoGadgetFS est un framework open source qui permet aux utilisateurs d'évaluer les périphériques USB et leurs hôtes/pilotes/logiciels associés sans connaissance approfondie du protocole USB. L'outil est écrit en Python3 et utilise RabbitMQ et l'accès WiFi pour permettre aux chercheurs de réaliser des évaluations de sécurité USB à distance depuis n'importe où dans le monde. En exploitant ConfigFS, AutoGadgetFS permet aux utilisateurs de cloner et d'émuler rapidement des périphériques, éliminant ainsi le besoin de creuser dans les détails de chaque implémentation. Le framework permet également aux utilisateurs de créer leurs propres fuzzers par-dessus.
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/devtest.jpeg" width="450" height="187" /></div>
<a name="MMITM"/>```bash
Minimal agfs in the middle setup:

```bash Complete agfs in the middle setup with debugging support:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/scenario2.jpeg"/></div>
---
<a name="Usbdev"/>
### Prise en charge des classes de périphériques USB :
[✔️] Périphériques USB HID entièrement pris en charge (Homme du milieu)
[⚠️] Test de périphérique uniquement .. Tous les périphériques USB (PAS d'Homme du milieu)
[⏳] Futures versions... Tous les périphériques USB (Homme du milieu)
---
<a name="Caps"/>
### Capacités :
1. Trouver, sélectionner et se connecter facilement à un périphérique USB.
1. Émuler n'importe quel périphérique USB HID.
1. Effectuer une écoute AGFS en mode intermédiaire pour les périphériques HID (enregistrer la communication sur le disque).
1. Écoute de périphérique (tout périphérique).
1. Plusieurs fuzzers vous permettent de fuzzer un périphérique ou un hôte.
1. Fuzzers aléatoires (avec paquets de longueur fixe ou aléatoire).
1. Fuzzers intelligents qui apprennent des communications USB précédentes.
1. Describe Fuzzer pour indiquer au Fuzzer quels octets fuzzer tout en laissant le reste du paquet identique.
1. Gadget Fuzzer.
1. Sequential Fuzzer.
1. Énumérateur de transfert de contrôle.
1. Rejeu de paquets depuis un fichier.
1. Rejeu de paquets depuis une capture USBLyzer sauvegardée.
1. Présentation visuelle des paquets pour faciliter la rétro-ingénierie de la communication.
1. Alertes pour périphérique en mode DFU, ou si le périphérique fuit des informations.
1. Le périphérique USB et l'hôte peuvent être n'importe où sur Internet.
1. Surveiller les changements soudains d'interface.
---
<a name="Road"/>
### Feuille de route :
1. Écouter les requêtes de transfert de contrôle vers un périphérique et y répondre.
1. MITM et émuler tous les types de périphériques.
1. Interface basée sur console/QT.
1. Plus de support d'interfaces/points de terminaison sur le RPI zero W.
1. Prendre en charge plus de cartes comme le greatfet.
1. Passer à une carte personnalisée.
1. Travailler pour que le raspberry pi ait un support complet pour l'émulation de périphériques USB avec toutes les interfaces.
1. Corréler les paquets envoyés et reçus via les numéros de séquence.
---
<a name="Installation"/>
### Installation :
<a name="Linux"/>
### Machine Linux :
* Remarque : WSL/WSL2 n'est pas pris en charge en raison de problèmes de passage USB.
* Installer Python3, ipython3, git, pip et le serveur rabbitMQ
```bash
sudo apt install python3 ipython3 git python3-pip rabbitmq-server dfu-util
sudo service rabbitmq-server start
```
* Cloner le dépôt
```bash
git clone https://github.com/ehabhussein/AutoGadgetFS
cd AutoGadgetFS
```
* Installer les dépendances
```bash
sudo -H pip3 install -r requirements.txt
```
* Rétrograder prompt toolkit pour une meilleure expérience ipython :
```bash
sudo python3 -m pip install prompt-toolkit~=2.0
```
* Activer l'interface web pour rabbitMQ
```bash
sudo rabbitmq-plugins enable rabbitmq_management
http://localhost:15672/ to reach the web interface
```
* Se connecter à l'interface web avec les identifiants *guest:guest*
* REMARQUE : si vous n'installez pas rabbitMQ sur `localhost`, ajoutez l'utilisateur suivant et connectez-vous avec :
```bash
sudo rabbitmqctl add_user autogfs usb4ever
sudo rabbitmqctl set_user_tags autogfs administrator
```
* Téléverser le fichier de configuration rabbitMQ
* Dans l'onglet overview, faites défiler vers le bas pour importer les définitions
* Téléversez le fichier trouvé dans : *rabbitMQbrokerconfig/rabbitmq-Config.json*
```bash
sudo service rabbitmq-server restart
```
* Tester l'installation
```python
sudo ipython3
Python 3.7.7 (default, Apr 1 2020, 13:48:52)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import libagfs
In [2]: x = libagfs.agfs()
***************************************
AutoGadgetFS: USB testing made easy
***************************************
Enter IP address of the rabbitmq server: 127.0.0.1
In [3]: exit
sudo `python3` agfsconsole.py
***************************************
AutoGadgetFS: USB testing made easy
***************************************
Enter IP address of the rabbitmq server: 127.0.0.1
Give your project a name?!:
``` ```
* Patch Pyusb langID ( Not needed unless you get pyusb errors for langID ):
* Edit the file `/usr/local/lib/python3/dist-packages/usb/util.py`
* make changes to the `def get_string` method to look like below:
```python
if 0 == len(langids):
return "Error Reading langID"
#raise ValueError("The device has no langid")
if langid is None:
langid = langids[0]
elif langid not in langids:
return "Error Reading langID"
#raise ValueError("The device does not support the specified langid")
```
* If you prefer to use `patch` apply the following patch to the file: `AutoGadgetFS/pyusb_patches/pyusb_langid.patch`
---
<a name="Rasp"/>
### Raspberry Pi Zero W:
* Obtain a copy of [Raspian Lite Edition](https://downloads.raspberrypi.org/raspios_lite_armhf_latest)
* Burn the Image to the SD card using [BalenaEtcher](https://www.balena.io/etcher/)
* Mount the SD card on your machine and make the following changes:
* In the `/path/to/sdcard/boot/config.txt` file add to the very end of the file:
```bash
enable_uart=1
dtoverlay=dwc2
```
* In the `/path/to/sdcard/boot/cmdline.txt` add right after `rootwait`
```bash
modules-load=dwc2
```
* it should look like this make sure its on the same line:
```bash
console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2
```
* Enable ssh:
* in the `/path/to/sdcard/boot` directory create an empty file name ssh:
```bash
sudo touch /path/to/sdcard/boot/ssh
```
* Enable Wifi:
* in the `/path/to/sdcard/boot` directory create an file named `wpa_supplicant.conf`:
```bash
sudo vim /path/to/sdcard/boot/wpa_supplicant.conf
```
* Add the following contents:
```bash
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
network={
ssid="<your wifi SSID>"
psk="<your wifi password>"
key_mgmt=WPA-PSK
}
```
* Unmount the SD card and place it back into the Raspberry Pi Zero and power it on.
* Copy the content of `AutogadgetFS/Pizero/` to the Pi zero: `username: pi` & `password: raspberry`
```bash
cd AutogadgetFS/Pizero/
scp gadgetfuzzer.py removegadget.sh requirements.txt router.py pi@<pi-ipaddress>:/home/pi
```
* SSH into the PI Zero and setup requirements for AutoGadgetFS:
```bash
ssh pi@<pi-ip-address>
chmod +x removegadget.sh
sudo apt update
sudo apt install python3 python3-pip
sudo -H pip3 install -r requirements.txt
```
* Upgrading the latest kernel and adding modules (* This step is optional for the current release):
( This will take a very long time compiling on the Pi Zero, unless you choose to cross compile the kernel see [Compiling options](https://www.raspberrypi.org/documentation/linux/kernel/building.md))
```bash
sudo bash
apt install git bc bison flex libssl-dev make libncurses5-dev screen
screen
mkdir Downloads
cd Downloads/
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux/
make bcmrpi_defconfig
make menuconfig
```
* Enable the Modules and save the config:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets2.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets3.png"/></div>
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/allgadgets4.png"/></div>
* Build and use the kernel:
```bash
make zImage modules dtbs
make modules_install
cp arch/arm/boot/dts/*.dtb /boot/
cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
cp arch/arm/boot/dts/overlays/README /boot/overlays/
cp arch/arm/boot/zImage /boot/kernel.img
reboot
```
#### And you're done!
---
<a name="Tutorial"/>
### AutoGadgetFS tutorial:
[Click to visit the tutorial](https://docs.agfs.io/)
---
<a name="Screens"/>
### Screenshots:
##### Man in the Middle:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/mitm.png" /></div>
#### USB device fuzzing:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/devfuzzer.png" /></div>
#### Host side fuzzing with code covereage:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/codecov.png" /></div>
#### Fuzzer based on a selection of bytes:
<div style="text-align:center"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/selectivefuzz.png" /></div>
#### Smart fuzzer based on learning traffic:
```python
In [44]: x.devSmartFuzz(engine="smart",samples=5,filename="/home/raindrop/PycharmProjects/AutoGadgetFs/binariesdb/Nud-Nuvoton-1046-20764-1590421333.5169587-Nuvoton-1046-20764-1590421600.8067
...: 274-device.bin")
[+]Statistiques générales
Jeu de caractères complet : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Jeu de caractères rejeté : !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ghijklmnopqrstuvwxyz{|}~
Jeu de caractères final : 0123456789abcdef
Longueur du mot : 128
Utilisation des indices minuscules : 92%
Emplacements des indices minuscules : [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 121, 122, 124, 125, 127]
Utilisation des indices majuscules : 0%
Emplacements des indices majuscules : []
Utilisation des indices chiffres : 96%
Emplacements des indices chiffres : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 123, 126]
Utilisation des indices non alphanumériques : 0%
Emplacements des indices non alphanumériques : []
Statistiques du compteur : Majuscules: 0 , Minuscules: 133071, Chiffres:212017 , Non alphanumériques:0
Toutes les fréquences de caractères :
caractère:5 trouvé:5012 fois
caractère:2 trouvé:22563 fois
caractère:3 trouvé:12197 fois
caractère:8 trouvé:15008 fois
caractère:4 trouvé:13275 fois
caractère:0 trouvé:98056 fois
caractère:1 trouvé:17861 fois
caractère:f trouvé:87823 fois
caractère:d trouvé:7221 fois
caractère:7 trouvé:9614 fois
caractère:a trouvé:11148 fois
caractère:6 trouvé:10472 fois
caractère:b trouvé:8189 fois
caractère:9 trouvé:7959 fois
caractère:c trouvé:9172 fois
caractère:e trouvé:9518 fois
***********************
généré:5 Paquets
***********************
Out[44]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c'
In [46]: https://raw.githubusercontent.com/ehabhussein/autogadgetfs/HEAD/x.edap.packets
Out[46]:
['5608305852bf2ffd61770e2c827542f20be0b0fcba09db916bd07e1734b04cb0352b1d278068064d19f033bfad6fa90e53d865693fd4fee0214f00000eb0aa2c',
'3b083595f276e2f1353a535c32f0f59516fc9328f7673bb80262c4da11c93683afe6dcff8a7a83018d78f41498a0da4d141ebd39c361b1724f2b00000eb0aa2c',
'0120961963495c4dab9470738b497eddde07b0d70b357795ad9554d7964761969a6d997205e17eada6fa84eb33dcfb11412f75e04c195001283900000eb0aa2c',
'091065d52127bbc6e840e02f8e1316f1c4d9c92a23931c00cdbb8c158368852ef8fabd461b98812b51ec84e1ccc5c04aaa366fbafabec623bd3500000eb0aa2c',
'7300cc61151b7af27a578e766f49bebb2de68c48b37a00df1030ae464f456928eedd035303e697208bf58217af728a2a346fda5c8aef0335b82e00000eb0aa2c']```
#### Help method:
```python3
In [15]: x.help("")
Méthodes actuellement supportées :
__________________________________________________________________________________________________________________________________________________________________
Méthode ||-->Description
----------------------------------------------------------------------------------------------------------------------------
MITMproxy ||-->Cette méthode crée une connexion au RabbitMQ et écoute les messages reçus sur la file d'attente todev
____________________________________________________________________________________________________________________________
MITMproxyRQueues ||-->Cette méthode lit depuis la file d'attente todev et envoie la requête au périphérique lui-même.
____________________________________________________________________________________________________________________________
SmartFuzz ||-->Cette méthode génère des paquets basés sur ce qu'elle a appris d'une capture provenant soit de l'hôte, soit du périphérique
____________________________________________________________________________________________________________________________
chgIntrfs ||-->Cette méthode vous permet de changer et de sélectionner une autre interface
____________________________________________________________________________________________________________________________
clearqueues ||-->Cette méthode vide toutes les files d'attente RabbitMQ qui ont été configurées
____________________________________________________________________________________________________________________________
clonedev ||-->Cette méthode ne nécessite aucun paramètre, elle sauvegarde seulement une copie du périphérique au cas où vous auriez besoin de la partager ou de l'utiliser plus tard.
____________________________________________________________________________________________________________________________
createctrltrsnfDB ||-->Crée une base de données SQLite contenant les valeurs énumérées lors de l'énumération des transferts de contrôle
____________________________________________________________________________________________________________________________
createdb ||-->Crée la table et les colonnes SQLite à partir des captures USBlyzer
____________________________________________________________________________________________________________________________
decodePacketAscii ||-->Cette méthode décode les octets du paquet en ASCII
____________________________________________________________________________________________________________________________
describeFuzz ||-->Cette méthode vous permet de décrire un paquet et de sélectionner quels octets seront fuzzés
____________________________________________________________________________________________________________________________
devEnumCtrltrnsf ||-->Cette méthode énumère toutes les combinaisons possibles d'une requête de transfert de contrôle
____________________________________________________________________________________________________________________________
devReset ||-->Cette méthode réinitialise le périphérique
____________________________________________________________________________________________________________________________
devWrite ||-->Pour utiliser cette méthode avec une méthode, vous écrirez sur un périphérique. Assurez-vous d'exécuter startSniffReadThread(self,endpoint=None, pts=None, queue=None,channel=None)
____________________________________________________________________________________________________________________________
devctrltrnsf ||-->Cette méthode vous permet d'envoyer des requêtes de transfert de contrôle au périphérique cible
____________________________________________________________________________________________________________________________
deviceInfo ||-->Obtient les informations complètes uniquement pour tout périphérique USB connecté à l'hôte
____________________________________________________________________________________________________________________________
deviceInterfaces ||-->Obtient toutes les interfaces et points d'extrémité du périphérique
____________________________________________________________________________________________________________________________
devrandfuzz ||-->Cette méthode vous permet de créer des paquets de taille fixe ou aléatoire générés avec urandom
____________________________________________________________________________________________________________________________
devseqfuzz ||-->Cette méthode vous permet de créer des paquets incrémentés séquentiellement et de les envoyer au périphérique
____________________________________________________________________________________________________________________________
findSelect ||-->Cette méthode énumère tous les périphériques USB connectés et vous permet de le sélectionner comme périphérique cible ainsi que ses points d'extrémité
____________________________________________________________________________________________________________________________
help ||-->Méthode d'aide d'AutogadgetFS
____________________________________________________________________________________________________________________________
hostwrite ||-->Cette méthode écrit des paquets vers l'hôte, ciblant soit un logiciel, soit un pilote en contrôle du périphérique
____________________________________________________________________________________________________________________________
hstrandfuzz ||-->Cette méthode vous permet de créer des paquets de taille fixe ou aléatoire générés avec urandom et de les envoyer à la file d'attente de l'hôte
____________________________________________________________________________________________________________________________
monInterfaceChng ||-->Méthode chargée de surveiller les changements d'interface. Elle est appelée depuis def startMonInterfaceChng(self)
____________________________________________________________________________________________________________________________
newProject ||-->Crée un nouveau nom de projet si vous testiez autre chose
____________________________________________________________________________________________________________________________
releasedev ||-->Libère le périphérique et rattache le pilote du noyau
____________________________________________________________________________________________________________________________
removeGadget ||-->Cette méthode supprime le gadget du Raspberry Pi
____________________________________________________________________________________________________________________________
replaymsgs ||-->Cette méthode recherche dans la base de données analysée d'USBlyzer et vous donne la possibilité de rejouer un message ou tous les messages de l'hôte vers le périphérique
____________________________________________________________________________________________________________________________
searchmsgs ||-->Cette méthode vous permet de rechercher et de sélectionner tous les messages correspondant à un motif, qui ont été sauvegardés lors de la création d'une base de données USBlyzer
____________________________________________________________________________________________________________________________
setupGadgetFS ||-->Configure les variables pour gadgetFS : Linux uniquement, meilleure option sur Raspberry Pi Zero
____________________________________________________________________________________________________________________________
showMessage ||-->Affiche les messages en cas d'erreur, d'avertissement ou d'information
____________________________________________________________________________________________________________________________
sniffdevice ||-->Lit la communication entre le périphérique et l'hôte
____________________________________________________________________________________________________________________________
startMITMusbWifi ||-->Démarre un thread pour surveiller le périphérique USB cible
____________________________________________________________________________________________________________________________
startMonInterfaceChng||-->Cette méthode vous permet de surveiller un périphérique toutes les 10 secondes au cas où sa configuration d'interface changerait soudainement.
____________________________________________________________________________________________________________________________
startQueuewrite ||-->Établit une connexion à la file d'attente pour communiquer avec l'hôte
____________________________________________________________________________________________________________________________
startSniffReadThread ||-->C'est un thread qui lit en continu les réponses du périphérique et, selon ce que vous passez à la méthode (pts ou file d'attente)
____________________________________________________________________________________________________________________________
stopMITMusbWifi ||-->Arrête le thread d'interception (man in the middle) entre l'hôte et le périphérique
____________________________________________________________________________________________________________________________
stopMonInterfaceChang||-->Arrête le thread de surveillance d'interface
____________________________________________________________________________________________________________________________
stopQueuewrite ||-->Arrête le thread chargé de communiquer avec la machine hôte
____________________________________________________________________________________________________________________________
stopSniffing ||-->Tue le thread de capture démarré par startSniffReadThread()
____________________________________________________________________________________________________________________________
usblyzerparse ||-->Cette méthode analyse votre exportation XML d'USBlyzer et les importe dans une base de données
____________________________________________________________________________________________________________________________
In [16]: x.help("findSelect")
****
[+]Aide pour la méthode findSelect:
[-]Signature: findSelect(self, chgint=None)
[+]Aide de findSelect:
Cette méthode énumère tous les périphériques USB connectés et vous permet de le sélectionner comme périphérique cible ainsi que ses points d'extrémité
****```
---
#### AutoGadgetFS console. A much simpler way to use AGFS:
<div style="text-align:left"><img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/agfsconsole.png"/></div>
---
<a name="Youtube"/>
### Youtube Playlist:
[Youtube Playlist](https://www.youtube.com/playlist?list=PLKozlVgM6RQjNHmpWR2RBiFCtufV03o6Z)
---
<a name="Slack"/>
### Join Slack:
Visit [AutogadgetFS Slack Channel](https://join.slack.com/t/autogadgetfs/shared_invite/zt-emgcv3ol-unG_axHmSQlk~5GcBddhlQ)
---
<a name="Support"/>
### Supported by:
<img src="https://assets.kitploit.com/production/public/readmes/3835/31aa30e1b311728af097fe24cefc4db7272ad971ffe64bac8d4d4e36a542fc9e.jpg" width="166" height="166"> <img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/JetBrains.png" width="166" height="166"> <img src="https://raw.githubusercontent.com/ehabhussein/AutoGadgetFS/master/screenshots/pyusb.png" width="166" height="166">
---
<a name="Donate"/>
### Buy me a coffee to support the development of this project
## Ethereum Donations : 0xA919e40ddB0563918dDc174320D91992e0048477
---
<a name="Contact"/>
### Contact me:
### 📧: <[email protected]>
### 🐦 : <https://twitter.com/0xRaindrop>
---
<a name="Cont"/>
### Contribute:
We're looking for developers to make this tool great! send me an 📧: <[email protected]> if you feel you'd like to be a part of this.