Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
pyFlipper — Flipper Zero Python CLI ラッパー | Kitploit
ツール/GitHubGitHub/wh00hw/pyflipper
BluetoothセキュリティIoTセキュリティRFID/NFCツールワイヤレスセキュリティハードウェアハッキングペネトレーションテストユーティリティとフレームワークハードウェアとIoTセキュリティレッドチーミング
GitHubwh00hw/pyflipper

pyFlipper

Flipper Zero Python CLI ラッパー

438491ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る

PyFlipper

Flipper Zero Python CLI ラッパー

記事

  • レストランをハックする方法

機能と特徴:

  • Flipper シリアル CLI ラッパー
  • Websocket クライアントインターフェース
  • プレーン TCP インターフェース

新機能(ファームウェア 1.x 互換性)

このリリースでは、ラッパーを現在の Flipper Zero CLI に合わせて更新しました (実機で検証済み、ファームウェア unlshd-089e):

  • 新しい info モジュール: flipper.info.device_info() / power_info() / power_debug_info()(最新の info device / info power コマンドに対応)。
  • power info → info power: flipper.power.info() は引き続き動作し、内部で info power を読み取るようになりました。flipper.power.otg_on()/otg_off() を追加。
  • date: flipper.date.datetime() を使用。現在の出力形式に対応するためパース処理を修正。
  • ストレージ: サイズが KB と KiB の両方でパースされるようになり、read() は 複数行のファイル内容をすべて返し、exFAT やラベルなしカードも正しくパースされます(#21 を修正)。
  • 赤外線: プロトコルリストはファームウェアから動的に読み込まれるため、NECext、 Kaseikyo、RCA、Pioneer などが自動的にサポートされます(#15 を修正)。 新しい flipper.ir.protocols() メソッド。
  • debug → sysctl debug、subghz tx/rx に必須の device 引数が追加され、 bt hci_info は変更なし。
  • NFC を全面的に書き換え:現在の対話型サブシェル(scan、dump、 emulate、field、apdu、raw、mfu)に対応し、UID ごとの Mifare Classic キーキャッシュ ヘルパー(import_nfc_keys、write_key_cache)を追加。
  • 統一シリアルレイヤー(シリアル / websocket / TCP):現在のシェルに対応した ANSI エスケープ処理と、 ハードウェア不要のテストスイートを実装。
  • 標準ファームウェアから削除(カスタムファームウェアでまだ提供されている場合は保持): ps(→ top)、music_player、nfc detect。

セットアップ手順:

root@kitploit:~
$ pip install pyflipper

テスト済み環境:

  • Python 3.8.10 on Linux 5.4.0 x86_64
  • Python 3.9.10 on Windows 10
  • Python 3.10.5 on Android 12 (Termux + OTGSerial2WebSocket ルート不要)
  • Python 3.12 on Linux (ファームウェア unlshd-089e)

使用法 / 例

接続

root@kitploit:~
from pyflipper import PyFlipper

# ローカルシリアルポート
flipper = PyFlipper(com="/dev/ttyACM0")

# または

# リモート serial2websocket サーバー
flipper = PyFlipper(ws="ws://192.168.1.5:1337")

# TCP
flipper = PyFlipper(tcp='192.168.89.222:22170')

電源

root@kitploit:~
# 情報(現在のファームウェアでは内部で `info power` を読み取ります)
info = flipper.power.info()

# 電源オフ
flipper.power.off()

# 再起動
flipper.power.reboot()

# DFU モードで再起動
flipper.power.reboot2dfu()

# GPIO ヘッダーの 5V OTG ピンを切り替え
flipper.power.otg_on()
flipper.power.otg_off()

アップデート / バックアップ

root@kitploit:~
# .fuf ファイルからアップデートをインストール
flipper.update.install(fuf_file="/ext/update.fuf")

# Flipper を .tar ファイルにバックアップ
flipper.update.backup(dest_tar_file="/ext/backup.tar")

# バックアップ .tar ファイルから Flipper を復元
flipper.update.restore(bak_tar_file="/ext/backup.tar")

ローダー

root@kitploit:~
# インストール済みアプリの一覧
apps = flipper.loader.list()

# アプリを起動
flipper.loader.open(app_name="Clock")

Flipper 情報

root@kitploit:~
# フリッパーの日付を取得(datetime オブジェクト)
date = flipper.date.datetime()

# フリッパーのタイムスタンプを取得
timestamp = flipper.date.timestamp()

# デバイス情報辞書を取得(現在のファームウェア `info device`、ドット区切りのキー)
device_info = flipper.info.device_info()

# 電源情報辞書を取得(現在のファームウェア `info power`)
power_info = flipper.info.power_info()

# 拡張電源 / ゲージデバッグ情報
power_debug = flipper.info.power_debug_info()

# レガシー `device_info` コマンド(アンダースコア区切りのキー、引き続きサポート)
legacy_info = flipper.device_info.info()

# ヒープ情報辞書を取得
heap = flipper.free.info()

# 空きブロックの文字列を取得
free_blocks = flipper.free.blocks()

# Bluetooth 情報を取得
bt_info = flipper.bt.info()

ファームウェア互換性。 このライブラリは現在の Flipper Zero CLI をターゲットとしています (ファームウェア 1.x、Unleashed unlshd-089e で検証済み)。いくつかの古いコマンドは 公式ファームウェアから削除されたため、利用できなくなりました: ps(対話型の top に置き換え)、music_player、nfc detect (NFC は対話型サブシェルになりました)。power info は info power に移動、 debug は sysctl debug に移動、storage はサイズを KiB で報告するようになりました。 これらはすべて、上記のラッパーで透過的に処理されます。

ストレージ

ファイルシステム情報

root@kitploit:~
# ストレージファイルシステム情報を取得
ext_info = flipper.storage.info(fs="/ext")

エクスプローラー

root@kitploit:~
# ストレージ /ext の辞書を取得
ext_list = flipper.storage.list(path="/ext")

# ストレージ /ext のツリー辞書を取得
ext_tree = flipper.storage.tree(path="/ext")

# ファイル情報を取得
file_info = flipper.storage.stat(file="/ext/foo/bar.txt")

# ディレクトリを作成
flipper.storage.mkdir(new_dir="/ext/foo")

ファイル

root@kitploit:~
# ファイルを読み込む
plain_text = flipper.storage.read(file="/ext/foo/bar.txt")

# ファイルを削除
flipper.storage.remove(file="/ext/foo/bar.txt")

# ファイルをコピー
flipper.storage.copy(src="/ext/foo/source.txt", dest="/ext/bar/destination.txt")

# ファイル名を変更
flipper.storage.rename(file="/ext/foo/bar.txt", new_file="/ext/foo/rab.txt")

# MD5 ハッシュを計算
md5_hash = flipper.storage.md5(file="/ext/foo/bar.txt")

# ファイルを一度に書き込み
file = "/ext/bar.txt"

text = """There are many variations of passages of Lorem Ipsum available, 
but the majority have suffered alteration in some form, by injected humour, 
or randomised words which don't look even slightly believable. 
If you are going to use a passage of Lorem Ipsum, 
you need to be sure there isn't anything embarrassing hidden in the middle of text. 
"""

flipper.storage.write.file(path=file, text=text)

# リスナーを使用してファイルを書き込み
file = "/ext/foo.txt"

text_one = """There are many variations of passages of Lorem Ipsum available, 
but the majority have suffered alteration in some form, by injected humour, 
or randomised words which don't look even slightly believable. 
If you are going to use a passage of Lorem Ipsum, 
you need to be sure there isn't anything embarrassing hidden in the middle of text. 
"""

flipper.storage.write.start(file)

time.sleep(2)

flipper.storage.write.send(text_one)

text_two = """All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as 
necessary, making this the first true generator on the Internet.
 It uses a dictionary of over 200 Latin words, combined with a handful of 
 model sentence structures, to generate Lorem Ipsum which looks reasonable. 
The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.
"""
flipper.storage.write.send(text_two)

time.sleep(3)

# 忘れずに停止
flipper.storage.write.stop()

LED / バックライト

root@kitploit:~
# 汎用 LED を設定(r, b, g, bl)
flipper.led.set(led='r', value=255)

# 青 LED をオフ
flipper.led.blue(value=0)

# 緑 LED の値を設定
flipper.led.green(value=175)

# バックライトをオン
flipper.led.backlight_on()

# バックライトをオフ
flipper.led.backlight_off()

# LED をすべてオフ
flipper.led.off()

バイブレーション

root@kitploit:~
# バイブレーションを True または False に設定
flipper.vibro.set(True)

# バイブレーションをオン
flipper.vibro.on()

# バイブレーションをオフ
flipper.vibro.off()

GPIO

root@kitploit:~
# GPIO モードを設定: 0 - 入力, 1 - 出力
flipper.gpio.mode(pin_name=PIN_NAME, value=1)

# GPIO ピンの値を設定: 0 - オフ, 1 - オン
flipper.gpio.set(pin_name=PIN_NAME, value=1)

# GPIO ピンの値を読み取り
flipper.gpio.read(pin_name=PIN_NAME)

MusicPlayer

⚠️ 公式ファームウェアから削除されました。 music_player CLI コマンドは標準ファームウェアから 削除されました(現在は別の .fap アプリです)。これらの呼び出しは、そのコマンドを 保持しているカスタムファームウェア(例:それを同梱する Unleashed / RogueMaster ビルド)では 引き続き動作します。標準ファームウェアでは「command not found」という応答が返ります。

root@kitploit:~
# RTTTL 形式の曲を再生
rttl_song = "Littleroot Town - Pokemon:d=4,o=5,b=100:8c5,8f5,8g5,4a5,8p,8g5,8a5,8g5,8a5,8a#5,8p,4c6,8d6,8a5,8g5,8a5,8c#6,4d6,4e6,4d6,8a5,8g5,8f5,8e5,8f5,8a5,4d6,8d5,8e5,2f5,8c6,8a#5,8a#5,8a5,2f5,8d6,8a5,8a5,8g5,2f5,8p,8f5,8d5,8f5,8e5,4e5,8f5,8g5"

# ループ再生
flipper.music_player.play(rtttl_code=rttl_song)

# ループを停止
flipper.music_player.stop()

# 20秒間再生
flipper.music_player.play(rtttl_code=rttl_song, duration=20)

# ビープ音を鳴らす
flipper.music_player.beep()

# 5秒間ビープ音を鳴らす
flipper.music_player.beep(duration=5)

NFC

現在のファームウェアでは、NFC は対話型の サブシェル です(scanner、dump、 emulate、field、apdu、raw、mfu)。このラッパーはサブシェルに入り、1つのコマンドを実行して 即座に抜けるため、各メソッドは通常のブロッキング呼び出しになります。 detect() は scan() のエイリアスとして維持されています。

root@kitploit:~
# タグの種類を検出 -> {'protocols': ['Mifare Classic'], 'raw': '...'} または None
tag = flipper.nfc.scan(timeout=5)

# NFC フィールドを数秒間オンにする
flipper.nfc.field(timeout=3)

# APDU(ISO14443-4 / ISO15693-3)を送信。プロトコル省略時は自動検出
resp = flipper.nfc.apdu(["00A4 04 00", "A0 00"], protocol="14_4a")

# CRC 付きで生バイトを送信
flipper.nfc.raw("93 20", protocol="14a", crc=True)

# Mifare Ultralight ヘルパー
info = flipper.nfc.mfu_info()
block4 = flipper.nfc.mfu_read_block(4)
flipper.nfc.mfu_write_block(4, "00 01 02 03")

# 保存された .nfc ファイルをエミュレート
flipper.nfc.emulate(file="/ext/nfc/mycard.nfc", timeout=10)

CLI で Mifare Classic をダンプする

CLI の dump は 辞書攻撃を実行しません。UID ごとのキャッシュ /ext/nfc/.cache/<UID>.keys(GUI が読み取り成功後に書き込むファイル)から キーを読み取ります。そのキャッシュがない場合、dump は "failed to read" を返します。 既存の Flipper .nfc ダンプからキャッシュを(再)作成できます。キーは各セクタトレーラーから取得されます。

root@kitploit:~
# ネイティブ .nfc ダンプから UID ごとのキーキャッシュにキーを読み込む
uid, cache_path = flipper.nfc.import_nfc_keys("/path/to/card.nfc")

# これで CLI dump がカードを読み取れるようになる(プロトコルトークン: mfc, mfu, 14_4a, ...)
flipper.nfc.dump(protocol="mfc", file="/ext/nfc/card_dump.nfc")

RFID

root@kitploit:~
# 同期 デフォルトタイムアウト5秒

# RFID を読み取り
rfid = flipper.rfid.read()

# RFID をエミュレート
emulated = flipper.rfid.emulate(key_type="EM4100", key_data="5500824806")

# RFID を書き込み
written = flipper.rfid.write(key_type="EM4100", key_data="5500824806")

SubGhz

root@kitploit:~
# hex_key を N 回送信(デフォルト count=10, device=0 -> CC1101_INT, 1 -> CC1101_EXT)
flipper.subghz.tx(hex_key="DEADBEEF", frequency=433920000, count=5, device=0)

# 受信(デフォルト frequency=433920000 device=0 raw=False timeout=5秒)
received = flipper.subghz.rx(frequency=433920000, device=0, raw=True, timeout=10)

# 記録した送信を再生
flipper.subghz.tx_from_file("/ext/subghz/foo.sub")

# 生の .sub ファイルをデコード
decoded = flipper.subghz.decode_raw(sub_file="/ext/subghz/foo.sub")

赤外線

root@kitploit:~
# 接続されたファームウェアがサポートするプロトコルを一覧表示(`ir` ヘルプから動的に読み取り)
protocols = flipper.ir.protocols()

# hex_address と hex_command を選択したプロトコルで送信
flipper.ir.tx(protocol="Samsung32", hex_address="C000FFEE", hex_command="DEADBEEF")

# NECext がサポートされるようになりました(プロトコルリストはファームウェアから読み取られ、ハードコードされていません)
flipper.ir.tx(protocol="NECext", hex_address="EF00", hex_command="FD02")

# 生のサンプル送信
flipper.ir.tx_raw(frequency=38000, duty_cycle=0.33, samples=[1337, 8888, 3000, 5555])

# 同期 デフォルトタイムアウト5秒
# 受信
r = flipper.ir.rx(timeout=10)

iButton

root@kitploit:~
# 読み取り(デフォルトタイムアウト5秒)
ikey = flipper.ikey.read()

# 書き込み(デフォルトタイムアウト5秒)
flipper.ikey.write(key_type="Dallas", key_data="DEADBEEFCOOOFFEE")

# エミュレート(デフォルトタイムアウト5秒)
flipper.ikey.emulate(key_type="Dallas", key_data="DEADBEEFCOOOFFEE")

ログ

root@kitploit:~
# イベントロガーを接続(デフォルトタイムアウト10秒)
logs = flipper.log.attach()

デバッグ

root@kitploit:~
# デバッグモードを有効化(現在のファームウェアでは `sysctl debug 1` を発行)
flipper.debug.on()

# デバッグモードを無効化
flipper.debug.off()

Onewire

root@kitploit:~
# 検索
response = flipper.onewire.search()

I2C

root@kitploit:~
# 取得
response = flipper.i2c.get()

入力

root@kitploit:~
# 入力ダンプ
dump = flipper.input.dump()

# 入力を送信
flipper.input.send("up", "press")

テスト

テストスイートは2つに分かれています。

  • ハードウェア不要のテスト(test_serial_wrapper.py、test_commands.py)は どこでも実行できます。Flipper CLI フレーミングを再現したシミュレートされたシリアルポート (tests/fake_serial.py)に対してライブラリを駆動するため、デバイスは不要です。CI でも実行されます。
  • ハードウェア統合テスト(test_hardware.py)は実際の Flipper と通信し、 デバイスが接続されていない場合は 自動的にスキップ されます。 FLIPPER_COM=/dev/ttyACM0 を設定して特定のポートを指定できます。
root@kitploit:~
# すべて(ハードウェアテストは Flipper が接続されていなければ自己スキップ)
python -m unittest discover -s tests -p "test_*.py" -v

# ハードウェア不要のテストのみ
python -m unittest tests.test_serial_wrapper tests.test_commands -v

最適化

どんな形でもコントリビュート歓迎です

  • キュー・スレッド・オーケストレーター
  • すべての CLI 機能の実装
  • 非同期 SubGhz チャット

ライセンス

MIT

一杯ご馳走してください

ZEC: zs13zdde4mu5rj5yjm2kt6al5yxz2qjjjgxau9zaxs6np9ldxj65cepfyw55qvfp9v8cvd725f7tz7

ETH: 0xef3cF1Eb85382EdEEE10A2df2b348866a35C6A54

BTC: 15umRZXBzgUacwLVgpLPoa2gv7MyoTrKat

連絡先

  • Discord: white_rabbit#4124
  • Twitter: @nic_whr
  • GPG: 0x94EDEADC
ツールをダウンロード