
Минимальный процессор в памяти для агностического создания протоколов на лету
Harald — это крошечный высокоуровневый CPU, работающий в памяти и способный обрабатывать набор инструкций для генерации протоколов прикладного уровня, используемых поверх заданного сетевого протокола (TCP/UDP).
Harald потребляет поток OPCODE и применяет различные преобразования к полезной нагрузке, чтобы она соответствовала определённому протоколу прикладного уровня.
[!TIP] Почему Harald? Возможно, вы знаете Харальда Гормссона, короля Дании, по его прозвищу: Blátǫnn, или, как мы произносим его сегодня, Bluetooth. Технология была названа в честь прозвища Харальда, поскольку он соединил датское и викингское королевства в те времена. Поэтому я назвал это в честь его имени.
Harald ведёт себя как CPU. Он следует набору OPCODE, которые определяют действия. PROTOCOL. Harald выполнит необходимые операции, чтобы создать требуемый протокол на лету.
После того как PROTOCOL задан, Harald будет итерироваться по PAYLOAD, который нужно отправить, проходя весь PROTOCOL один раз для каждого фрагмента. То есть: если полезную нагрузку пришлось разбить на несколько фрагментов, Harald будет использовать один и тот же протокол для каждого фрагмента, выполняя каждое действие, определённое в протоколе, над текущим фрагментом полезной нагрузки.
Harald хранит ряд регистров, которые протокол может использовать для хранения значений. Эти регистры можно использовать для выполнения множества операций, таких как сложение, вычитание, кодирование и декодирование... и т. д.
Harald динамически выделяет массив результатов, в котором протокол может хранить ответы на каждый запрос, выполненный при отправке фрагмента полезной нагрузки.

Harald поддерживает множество опкодов, которые можно задать как протокол. Harald выполняет набор высокоуровневых операций при получении заданного опкода. Каждый опкод ожидает предопределённый набор аргументов с предопределённой длиной.
| OPCODE::Nº | Description | ARGS::Size |
|---|---|---|
| H_F_APPEND::0x01 | Appends the following N Bytes to the end payload | Size::4, NBytes::N |
| H_F_PREPEND::0x02 | Prepends the following N Bytes to the end payload | Size::4, NBytes::N |
| H_F_SPLIT::0x03 | Splits the Payload in fragments of the given size | Size::4 |
| H_F_PAYLOAD_INJECT::0x04 | Injects the Payload fragment into the End Payload | - |
| H_F_SOCK_INIT::0x05 | Initializes the socket connection | IsIPAddress:1, SSL_Enabled::1, TCP/UDP::1, [(HostLen::4,HostName:N)/IPAddress::4], Port::2 |
| H_F_SEND::0x06 | Sends the constructed End Payload | - |
| H_F_RECV::0x07 | Receives up to N Bytes | Size::4 |
| H_F_CLOSE::0x08 | Closes the socket and cleans | - |
| H_F_INJECT::0x09 | Injects the requested registry into the End Payload | Reg::1 |
| H_F_ENCODE_STR::0x0A | Encodes a Payload field to its string representation | IsReg::1, [(Payload::1, Field::1)/Reg::1], Format::1 |
| H_F_DECODE_STR::0xA0 | Decodes the contents of a registry to its numeric representation | Reg::1 |
| H_F_ENCODE_STRB64::0x0B | Encodes a Payload field to its B64string representation | Payload::1, Field::1 |
| H_F_COMPUTE_FRAG_LENGTH::0x0D | Calculates the next fragment to be sent length | - |
| H_F_SEARCH::0x0E | Searches for a given byte pattern of a given N size in a given registry | Reg::1, Size::4, NBytes::N |
| H_F_SEEK::0x0F | Moves the cursor in a given payload by a given number of bytes | Payload::1, Offset::4 |
| H_F_PUSH::0x10 | Pushes a number of bytes or the contents of a registry into another registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_ADD::0x12 | Adds two registries or a number to a registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_SUBSTRACT::0x13 | Substracts two registries or a number to a registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_READ::0x14 | Reads from a given registry up to the length stored in another registry | FromReg::1, SizeReg::1 |
| H_F_STORE::0x15 | Stores a registry value into Harald's Storage | Reg::1 |
Следующий поток опкодов сгенерирует необходимые данные для отправки, чтобы связь была распознана как HTTP. Он инициирует соединение, изменит полезную нагрузку так, чтобы она выглядела как HTTP-трафик, отправит её через SSL/TLS-соединение и закроет соединение в конце.
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