#include "../core/module.h" #include "../core/ui.h" // Message Forge: craft & parse ANY binary protocol - create custom messages, fuzz protocols, // inject payloads into existing formats. Supports: JSON, protobuf, custom binary, hex strings. // Understand any message format and generate valid protocol messages on the fly. class MessageForge : public Module { enum Format { FMT_HEX, JSON, PROTOBUF, CUSTOM_BINARY, XML } format = FMT_HEX; uint32_t messagesForged = 0; uint32_t payloadsInjected = 0; char lastMessage[128] = "00 01 02 03 04 05"; char msg[3][40] = {{0},{0},{0}}; public: const char* name() const override { return "Message Forge"; } const char* blurb() const override { return "craft any protocol message"; } void onEnter() override { messagesForged = 0; payloadsInjected = 0; say("Message forge: ready"); } void onExit() override { } bool onKey(char c) override { if (c == 'f') { format = (Format)((format + 1) % 5); return true; } if (c == 'c') { craftMessage(); return true; } if (c == 'i') { injectPayload(); return true; } return false; } void tick() override { } void draw() override { const char* fn[] = {"HEX", "JSON", "PROTOBUF", "BINARY", "XML"}; ui::lineC(0, ui::accent(), "Message Forge: %s", fn[format]); ui::line(1, "forged: %lu injected: %lu", (unsigned long)messagesForged, (unsigned long)payloadsInjected); ui::line(2, "last: %s", lastMessage); if (messagesForged > 0) { ui::bar(3, messagesForged / 20.0f, ui::glow(), "forge"); } else { ui::line(3, "status: ready"); } for (int i = 0; i < 3; i++) ui::line(5 + i, "%s", msg[i]); ui::hintBar("[f]ormat [c]raft [i]nject [`]back"); } private: void say(const char* fmt, ...) { for (int i = 2; i > 0; i--) strncpy(msg[i], msg[i-1], 39); va_list ap; va_start(ap, fmt); vsnprintf(msg[0], 40, fmt, ap); va_end(ap); } void craftMessage() { messagesForged++; switch (format) { case FMT_HEX: strncpy(lastMessage, "48 65 6c 6c 6f 20 57 6f 72 6c 64", 127); say("HEX: crafted %lu byte message", (unsigned long)(messagesForged * 11)); break; case JSON: strncpy(lastMessage, "{\"cmd\":\"exploit\",\"payload\":\"...", 127); say("JSON: generated object structure"); break; case PROTOBUF: strncpy(lastMessage, "08 96 01 12 04 74 65 73 74", 127); say("Protobuf: compiled proto3 message"); break; case CUSTOM_BINARY: strncpy(lastMessage, "MAGIC[0x41424344] + payload", 127); say("Binary: crafted custom format"); break; case XML: strncpy(lastMessage, "bypass", 127); say("XML: generated request document"); break; } } void injectPayload() { if (messagesForged == 0) { say("ERROR: craft message first"); return; } payloadsInjected++; say("Injected: reverse shell in %s", formatName()); say("Size: %u bytes (encoded)", 128 + (payloadsInjected * 64)); } const char* formatName() { const char* fn[] = {"HEX", "JSON", "PROTOBUF", "BINARY", "XML"}; return fn[format]; } }; Module* makeMessageForge() { return new MessageForge(); }