Files
Carputer-cracker/src/modules/messageforge.cpp

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(); }