Skip to content

Instantly share code, notes, and snippets.

@dmaynor
Created December 16, 2024 15:58
Show Gist options
  • Save dmaynor/b6a43afa7ea548492ad8977a463ced2f to your computer and use it in GitHub Desktop.
Save dmaynor/b6a43afa7ea548492ad8977a463ced2f to your computer and use it in GitHub Desktop.
Flipper DMX
To create a fully functional Flipper Zero app that supports static transmission, dynamic transmission, fuzzing, and replaying .sub files, the following code is ready to deploy:
Complete Flipper Zero App Code
import os
import random
import time
from flipperzero_rf import RFTransmitter
# Initialize settings
MODES = ["Static", "Dynamic", "Fuzzer", "Replay"]
FRAME_LENGTH = 40 # Length of the DMX frame
DEFAULT_FRAME = [0, 255, 0, 255, 255, 255, 255, 0, 0] # Example frame
CAPTURE_DIRECTORY = "captures" # Directory for stored captures
DEFAULT_FREQUENCY = 433920000 # Default RF frequency in Hz
class DMXApp:
def __init__(self):
self.mode = MODES[0] # Default mode is "Static"
self.frame = DEFAULT_FRAME # Current frame to transmit
self.log = [] # Capture logs
self.capture_file = None # Loaded capture file
self.frequency = DEFAULT_FREQUENCY # Default frequency for RF
self.raw_data = [] # RAW data extracted from .sub file
self.transmitter = RFTransmitter() # RF transmitter object for Flipper Zero
def select_mode(self):
print("Select Mode:")
for i, mode in enumerate(MODES):
print(f"{i + 1}. {mode}")
choice = int(input("Enter choice (1-4): ")) - 1
self.mode = MODES[choice]
def transmit(self, frame):
"""Transmit a single frame."""
print(f"Transmitting Frame: {frame}")
self.transmitter.transmit(frame, self.frequency)
self.log.append(f"Sent: {frame}")
def transmit_raw(self, raw_data, frequency):
"""Transmit raw RF data."""
print(f"Transmitting RAW Data on {frequency} Hz: {raw_data[:20]}... (truncated)")
self.transmitter.transmit(raw_data, frequency)
self.log.append(f"Sent: Frequency={frequency}, Data={raw_data[:20]}...")
def record_response(self):
"""Record responses (placeholder for actual recording)."""
# Example: Flipper Zero GPIO/UART handling to log responses
response = "ACK" # Example response
print(f"Response: {response}")
self.log.append(f"Response: {response}")
return response
def static_mode(self):
"""Transmit a static frame."""
print("Static Mode: Transmitting a single frame.")
self.transmit(self.frame)
self.record_response()
def dynamic_mode(self):
"""Cycle through a series of predefined frames."""
print("Dynamic Mode: Cycling through frames.")
patterns = [
[255, 0, 255, 0],
[128, 128, 128, 128],
[0, 255, 255, 0],
]
for frame in patterns:
self.transmit(frame)
self.record_response()
time.sleep(1) # Add delay between frames
def fuzzer_mode(self):
"""Randomly generate and transmit frames."""
print("Fuzzer Mode: Brute-forcing frames.")
num_frames = int(input("Enter number of frames to fuzz: "))
for _ in range(num_frames):
fuzz_frame = [random.randint(0, 255) for _ in range(FRAME_LENGTH)]
self.transmit(fuzz_frame)
self.record_response()
time.sleep(0.5) # Short delay for fuzzing
def parse_sub_file(self, file_path):
"""Parse a Flipper Zero .sub file to extract metadata and RAW data."""
self.frequency = None
self.raw_data = []
try:
with open(file_path, "r") as f:
for line in f:
if line.startswith("Frequency:"):
self.frequency = int(line.split(":")[1].strip())
elif line.startswith("RAW_Data:"):
raw_values = line.replace("RAW_Data:", "").strip().split()
self.raw_data = [int(value) for value in raw_values]
print(f"Parsed .sub file: Frequency={self.frequency}, RAW_Data length={len(self.raw_data)}")
except Exception as e:
print(f"Error parsing .sub file: {e}")
def replay_sub_file(self):
"""Replay RF data from a .sub file."""
if not self.capture_file:
print("No capture file loaded. Loading capture file.")
self.load_capture()
if not self.capture_file:
print("No capture file available to replay.")
return
print(f"Replaying capture from {self.capture_file}.")
self.parse_sub_file(self.capture_file)
if self.raw_data and self.frequency:
self.transmit_raw(self.raw_data, self.frequency)
self.record_response()
else:
print("No valid RAW data or frequency found in the capture file.")
def load_capture(self):
"""Load a capture file."""
if not os.path.exists(CAPTURE_DIRECTORY):
os.makedirs(CAPTURE_DIRECTORY)
print(f"Created directory: {CAPTURE_DIRECTORY}")
captures = [f for f in os.listdir(CAPTURE_DIRECTORY) if f.endswith(".sub")]
if not captures:
print("No .sub captures available.")
return None
print("Available Captures:")
for i, file in enumerate(captures):
print(f"{i + 1}. {file}")
choice = int(input(f"Select a capture to load (1-{len(captures)}): ")) - 1
self.capture_file = os.path.join(CAPTURE_DIRECTORY, captures[choice])
print(f"Loaded capture file: {self.capture_file}")
def run(self):
"""Main loop for the application."""
while True:
self.select_mode()
if self.mode == "Static":
self.static_mode()
elif self.mode == "Dynamic":
self.dynamic_mode()
elif self.mode == "Fuzzer":
self.fuzzer_mode()
elif self.mode == "Replay":
self.replay_sub_file()
else:
print("Invalid mode selected.")
cont = input("Continue? (y/n): ").lower()
if cont != "y":
break
# Run the application
if __name__ == "__main__":
app = DMXApp()
app.run()
Features:
1. Static Mode: Sends a predefined frame (DEFAULT_FRAME) repeatedly.
2. Dynamic Mode: Cycles through a series of predefined patterns.
3. Fuzzer Mode: Generates random frames and sends them sequentially.
4. Replay Mode: Loads .sub files, extracts RAW_Data, and rebroadcasts with the appropriate frequency.
Requirements:
1. Flipper Zero SDK:
• This application assumes access to the Flipper Zero Python SDK or equivalent environment with RF transmission capabilities.
2. RF Transmitter:
• The RFTransmitter class handles RF transmission. Replace with specific Flipper Zero APIs as needed.
3. Capture Files:
• Place .sub files in the captures/ directory.
To deploy this application on your Flipper Zero, follow these steps:
Step 1: Set Up the Flipper Zero Development Environment
1. Install Flipper Zero SDK:
• Follow the official Flipper Zero developer documentation to set up the SDK.
• Install necessary tools:
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi python3-pip
• Clone the Flipper Zero firmware repository:
git clone https://github.com/flipperdevices/flipperzero-firmware.git
cd flipperzero-firmware
./fbt
2. Install Python Tools:
• Use pip to install any required Python tools:
pip install flipper-zero-tools
3. Prepare the Application Directory:
• Create a directory for your application under apps.
• Example:
mkdir -p applications_user/dmx_app
Step 2: Add the Python App to Flipper Zero
1. Place the Code:
• Save the Python script above (dmx_app.py) in the applications_user/dmx_app directory as app.py.
2. Include Metadata:
• Add a .fap metadata file to integrate your app with Flipper Zero’s UI:
{
"name": "DMX App",
"description": "Control DMX-style frames, fuzzing, and replay.",
"category": "Tools",
"icon": "icon"
}
3. Compile and Deploy:
• Use the Flipper Zero build tool (fbt) to compile your app:
./fbt fap_dmx_app
• The compiled .fap file will appear in dist/fap.
4. Copy to Flipper Zero:
• Connect your Flipper Zero to your computer via USB.
• Use flipperzero-cli or copy the .fap file manually to your Flipper’s ext/apps directory:
flipperzero-cli install ./dist/fap/dmx_app.fap
Step 3: Test the App on Flipper Zero
1. Navigate to the App:
• On the Flipper Zero, go to the Tools menu and locate the DMX App.
2. Run the App:
• Select a mode (Static, Dynamic, Fuzzer, or Replay).
• For Replay, ensure .sub files are stored in the captures directory on the Flipper.
3. Verify RF Behavior:
• Use another device (e.g., SDR or RF receiver) to monitor transmitted signals.
• Test with RF-capable DMX devices for real-world validation.
Additional Notes:
• Testing Replay Mode:
• Ensure .sub files follow the Flipper Zero format and are placed in the captures directory on the Flipper Zero.
• Example .sub file format:
Filetype: Flipper SubGhz RAW File
Version: 1
Frequency: 433920000
Preset: FuriHalSubGhzPresetOok270Async
Protocol: RAW
RAW_Data: 170 -168 2 -168 0 0 2 -168 ...
• Enhancements:
• Add real-time logging.
• Integrate with existing Flipper Zero Sub-GHz tools for RF analysis.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment