98 lines
3.2 KiB
C++
98 lines
3.2 KiB
C++
#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, "<request><auth>bypass</auth>", 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(); }
|