apktool
Android APK unpacking and resource extraction tool for reverse engineering. Use when you need to decode APK files, extract…
Analyze digital and analog captures from Saleae Logic MSO devices. Decode protocols like UART, SPI, I2C from exported binary files. Use when analyzing logic analyzer captures for CTF challenges, hardware reverse engineering, or protocol decoding.
Claude Code
$ npx -y skills add brownfinesecurity/iothackbot --skill logicmso --agent claude-code
Codex
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a codex -y
Cursor
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a cursor -y
Gemini CLI
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a gemini-cli -y
GitHub Copilot
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a github-copilot -y
OpenCode
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a opencode -y
Windsurf
$ npx skills add brownfinesecurity/iothackbot --skill logicmso -a windsurf -y
name: logicmso description: Analyze digital and analog captures from Saleae Logic MSO devices. Decode protocols like UART, SPI, I2C from exported binary files. Use when analyzing logic analyzer captures for CTF challenges, hardware reverse engineering, or protocol decoding.
This skill enables analysis of captured signals from Saleae Logic MSO devices using the `saleae-mso-api` Python library. It supports loading binary exports, analyzing signal transitions, and decoding common protocols.
python3 -c "from saleae.mso_api.binary_files import read_file; print('saleae-mso-api is available')"Only if that fails, install it: `pip install saleae-mso-api`
from saleae.mso_api.binary_files import read_file
from pathlib import Path
file_path = Path("capture.bin")
saleae_file = read_file(file_path)
# Access metadata
print(f"Version: {saleae_file.version}")
print(f"Type: {saleae_file.type}")
# Access data
contents = saleae_file.contentsDigital exports contain `DigitalExport_V1` with chunks:
chunk = saleae_file.contents.chunks[0] # Key attributes: chunk.initial_state # Starting logic level (0 or 1) chunk.transition_times # numpy array of transition timestamps (seconds) chunk.sample_rate # Capture rate in Hz chunk.begin_time # Capture start time chunk.end_time # Capture end time
import numpy as np times = np.array(chunk.transition_times) durations_ms = np.diff(times) * 1000 # Convert to milliseconds # If initial_state is 0 (LOW): # - Even indices (0, 2, 4...) = HIGH pulse durations # - Odd indices (1, 3, 5...) = LOW gap durations # If initial_state is 1 (HIGH): # - Even indices = LOW gap durations # - Odd indices = HIGH pulse durations
This skill includes helper scripts for common analysis tasks:
# Analyze signal characteristics python3 skills/logicmso/analyze_protocol.py capture.bin # Show detailed timing histogram python3 skills/logicmso/analyze_protocol.py capture.bin --histogram # Show detected timing clusters python3 skills/logicmso/analyze_protocol.py capture.bin --clusters # Export transitions to CSV python3 skills/logicmso/analyze_protocol.py capture.bin --export transitions.csv # Show raw transition values python3 skills/logicmso/analyze_protocol.py capture.bin --raw -n 50
See [examples.md](examples.md) for full worked end-to-end captures: unknown-protocol triage, and UART, SPI, I2C, and 1-Wire decoding with runnable Python.
from saleae.mso_api.binary_files import read_file
import numpy as np
f = read_file("capture.bin")
chunk = f.contents.chunks[0]
print(f"Sample rate: {chunk.sample_rate/1e6:.1f} MHz")
print(f"Duration: {chunk.end_time - chunk.begin_time:.3f}s")
print(f"Initial state: {'HIGH' if chunk.initial_state else 'LOW'}")
print(f"Transitions: {len(chunk.transition_times)}")times = np.array(chunk.transition_times)
durations_us = np.diff(times) * 1e6 # microseconds
# Separate HIGH and LOW durations
high_idx = 0 if chunk.initial_state == 0 else 1
high_durations = durations_us[high_idx::2]
low_durations = durations_us[(1-high_idx)::2]
print(f"HIGH pulses: min={min(high_durations):.1f}us, max={max(high_durations):.1f}us")
print(f"LOW gaps: min={min(low_durations):.1f}us, max={max(low_durations):.1f}us")
# Find unique timing values (cluster detection)
unique_high = sorted(set(round(d, -1) for d in high_durations)) # Round to 10us
unique_low = sorted(set(round(d, -1) for d in low_durations))
print(f"HIGH clusters: {unique_high}")
print(f"LOW clusters: {unique_low}")Based on timing patterns:
Once protocol is identified, decode based on protocol rules. For unknown/custom protocols, analyze the timing clusters and
Open-source IoT security testing toolkit with integrated Claude Code skills for automated vulnerability discovery.
Android APK unpacking and resource extraction tool for reverse engineering. Use when you need to decode APK files, extract…
Static analysis of UEFI/BIOS firmware dumps using Intel's chipsec framework. Decode firmware structure, detect known malware and…
Advanced file finder with type detection and filesystem extraction for analyzing firmware and extracting embedded filesystems.…
IoT network traffic analyzer for detecting IoT protocols and identifying security vulnerabilities in network communications. Use…
Android APK decompiler that converts DEX bytecode to readable Java source code. Use when you need to decompile APK files, analyze…
Probe IoT/embedded targets for exposed SWD/JTAG debug interfaces using a SEGGER J-Link. Detects whether debug is OPEN, LOCKED…
Use for authorized security assessment of REST, GraphQL, WebSocket, or SOAP APIs, including discovery, authentication,…
Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys)…
Clean and finalize authorized natural-language text intended for readers by auditing suspicious invisible Unicode and rewriting…