
Un CPU minimal en mémoire pour la création de protocoles à la volée et agnostiques
Harald est un minuscule CPU de haut niveau en mémoire, capable de traiter un ensemble d'instructions pour générer des protocoles de couche applicative à utiliser sur un protocole réseau donné (TCP/UDP).
Harald consomme un flux d'OPCODES et applique différentes transformations à la charge utile pour qu'elle soit adaptée au protocole de couche applicative défini.
[!TIP] Pourquoi Harald ? Vous connaissez peut-être Harald Gormsson, roi du Danemark, pour son surnom : Blátǫnn, ou comme on le prononce aujourd'hui, Bluetooth. La technologie a été nommée d'après le surnom de Harald car il connectait les royaumes danois et viking à l'époque. J'ai donc nommé ceci d'après son prénom.
Harald se comporte comme un CPU. Il suit un ensemble d'OPCODES qui définissent des actions. Un PROTOCOLE. Harald exécute les opérations requises pour créer le protocole requis à la volée.
Une fois le PROTOCOLE fourni, Harald itère sur la PAYLOAD à envoyer en parcourant l'intégralité du PROTOCOLE une fois pour chaque fragment. C'est-à-dire : si la payload devait être découpée en plusieurs fragments, Harald utilisera le même protocole pour chaque fragment, en exécutant chaque action définie dans le protocole contre le fragment de payload courant.
Harald maintient un certain nombre de registres à utiliser par le protocole pour stocker des valeurs. Ces registres peuvent être utilisés pour effectuer de multiples opérations, telles que l'addition, la soustraction, l'encodage et le décodage... etc.
Harald alloue dynamiquement un tableau de résultats où le protocole peut stocker les réponses à chaque requête effectuée lors de l'envoi d'un fragment de payload.

Harald prend en charge une variété d'Opcodes à fournir en tant que protocole. Harald effectue un ensemble d'opérations de haut niveau à la réception d'un Opcode donné. Chaque Opcode attend un ensemble prédéfini d'arguments avec une longueur prédéfinie.
| OPCODE::Nº | Description | ARGS::Size |
|---|---|---|
| H_F_APPEND::0x01 | Ajoute les N octets suivants à la fin de la payload | Size::4, NBytes::N |
| H_F_PREPEND::0x02 | Ajoute les N octets suivants au début de la payload | Size::4, NBytes::N |
| H_F_SPLIT::0x03 | Découpe la Payload en fragments de la taille donnée | Size::4 |
| H_F_PAYLOAD_INJECT::0x04 | Injecte le fragment de Payload dans la End Payload | - |
| H_F_SOCK_INIT::0x05 | Initialise la connexion socket | IsIPAddress:1, SSL_Enabled::1, TCP/UDP::1, [(HostLen::4,HostName:N)/IPAddress::4], Port::2 |
| H_F_SEND::0x06 | Envoie la End Payload construite | - |
| H_F_RECV::0x07 | Reçoit jusqu'à N octets | Size::4 |
| H_F_CLOSE::0x08 | Ferme le socket et nettoie | - |
| H_F_INJECT::0x09 | Injecte le registre demandé dans la End Payload | Reg::1 |
| H_F_ENCODE_STR::0x0A | Encode un champ de Payload en sa représentation chaîne | IsReg::1, [(Payload::1, Field::1)/Reg::1], Format::1 |
| H_F_DECODE_STR::0xA0 | Décode le contenu d'un registre en sa représentation numérique | Reg::1 |
| H_F_ENCODE_STRB64::0x0B | Encode un champ de Payload en sa représentation chaîne B64 | Payload::1, Field::1 |
| H_F_COMPUTE_FRAG_LENGTH::0x0D | Calcule la longueur du prochain fragment à envoyer | - |
| H_F_SEARCH::0x0E | Recherche un motif d'octets donné de taille N donnée dans un registre donné | Reg::1, Size::4, NBytes::N |
| H_F_SEEK::0x0F | Déplace le curseur dans une payload donnée d'un nombre d'octets donné | Payload::1, Offset::4 |
| H_F_PUSH::0x10 | Pousse un nombre d'octets ou le contenu d'un registre dans un autre registre | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_ADD::0x12 | Additionne deux registres ou un nombre à un registre | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_SUBSTRACT::0x13 | Soustrait deux registres ou un nombre à un registre | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_READ::0x14 | Lit depuis un registre donné jusqu'à la longueur stockée dans un autre registre | FromReg::1, SizeReg::1 |
| H_F_STORE::0x15 | Stocke une valeur de registre dans le Storage de Harald | Reg::1 |
Le flux d'Opcodes suivant générera les données requises à envoyer pour qu'une communication soit comprise comme du HTTP. Il initiera, modifiera la payload pour qu'elle ressemble à du trafic HTTP, l'enverra sur une connexion SSL/TLS, et fermera la connexion à la fin.
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF, // Splits the Payload
H_F_APPEND, 0x00, 0x00, 0x00, 0x46, // Appends...
'P', 'O', 'S', 'T', ' ', '/', ' ', // POST /
'H', 'T', 'T', 'P', '/', '1', '.', '1', '\r', '\n', // HTTP/1.1
'H', 'o', 's', 't', ':', ' ', // Host:
'd', 'o', 'm', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\r', '\n', // domain.com
'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', ':', ' ', // Connection:
'c', 'l', 'o', 's', 'e', '\r', '\n', // close
'C', 'o', 'n', 't', 'e', 'n', 't', '-', // Content-
'L', 'e', 'n', 'g', 't', 'h', ':', ' ', // Length:
H_F_COMPUTE_FRAG_LENGTH, // Next Fragment's size
H_F_ENCODE_STR, H_PAY_END_PAYLOAD, H_PAY_FRAGMENT_SIZE, 'u', // FragSize encode
H_F_INJECT, H_REG_RET, // Inject the Fragment Size encoded str
H_F_APPEND, 0x00, 0x00, 0x00, 0x04, '\r', '\n', '\r', '\n', // Append Body begin
H_F_PAYLOAD_INJECT, // Inject the Payload
H_F_SOCK_INIT, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x04, 0xD2, // Init Socket
H_F_SEND, // Send the Payload over the socket
H_F_CLOSE // Close the socket and cleanup