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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Hardware Hacking Cheatsheet — ハードウェアハッキングチートシート | Kitploit
ツール/GitLabGitLab/myasnik/hardware-hacking-cheatsheet
組み込みシステムセキュリティIoTセキュリティハードウェアセキュリティ学習と教育厳選リソースファームウェア解析
GitLabmyasnik/hardware-hacking-cheatsheet

Hardware Hacking Cheatsheet

ハードウェアハッキングチートシート

リポジトリを見る
25年前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

Hardware Hacking Cheatsheet

[[TOC]]

免責事項

  • 私はこの種のことを学ぼうとしている初心者なので、100%正しくないかもしれません。
  • 悪い英語でごめんなさい。

注意事項

  • 最も簡単な経路を最初に試す方法論に従う
  • 時々はんだ付けが必要になるかもしれません。こちらに簡単な方法があります。
    • PCBのビアに直接ワイヤーをはんだ付けしなければならない場合があります(ビデオ)
      1. カッターを使ってPCBの表面を、はんだマスクの下のキラキラが見えるまで削る
      2. ファイバーグラスペンシルでもう一度表面を削る
      3. IPAと綿棒で表面をきれいにする
      4. 少量のフラックスを塗布する
      5. ワイヤーに予備はんだを付け、はんだ付けする
    • 注意事項
      • 常にはんだごての先に予備はんだを付けておく
      • 温度: 250-350 C
      • PCBを素手で触らない

情報収集と最初の操作

  1. デバイスの背面のラベルを見て、以下を見つける
    • モデル名
    • シリアル番号
    • デバイスをブランド化した会社(製造元とは限らない)
  2. 収集した情報を使ってインターネットで検索する
    • 情報を含む最良のウェブサイト
      • TechInfoDepot
      • OpenWRT
    • ...を検索すると、通常多くの情報が得られる
      • FCC ID(参照ウェブサイト)
      • SOC名
      • フラッシュチップの名前と容量
      • RAMチップの名前と容量
      • その他の情報源
  3. デバイスを開ける
    • デバイスの開け方のチュートリアルを検索する
    • 一部のデバイスは開かないように接着されている場合があるので、優しく扱う
    • ヒートシンクが回路の一部を覆っている場合があるので、可能なら取り外す
  4. コンポーネントを特定する
    • 回路名を読みやすくするために
      • 綿+アルコールを使い、アルコールが乾いたらチョークで回路を覆い、その後きれいにする。すると回路名が読めるようになる
      • 拡大鏡を使う
    • これらのコンポーネントに関する情報やデータシートをインターネットで検索する。見つからなければ中国の検索エンジンを試す
      • Baidu
      • Sogou
      • Haosou
    • 重要: VCCとGNDがよく露出しているコンポーネントを見つけることは非常に有用
  5. UARTインターフェースを見つける:おおよそTTYのようなもの
    • インターネットで検索
    • PCB上でGND、INまたはRX、OUTまたはTX、VCCを探す
    • PCB上の3/4ピンを探す
      1. GNDへの参照を見つける
        • 以前に見つけたコンポーネントを使用
        • 通常、金属プレートはGND
      2. VCCへの参照を見つける
        • 以前に見つけたコンポーネントを使用
        • コンデンサを探す。通常、コンデンサの一方の端子はVCC
      3. 以下の表を埋めながらUART候補ピンをテストする(箇条書きは表の各列に対応)
        1. UARTピンのGNDに対する抵抗をテストする(マルチメータを抵抗測定に、通常200k)
        2. UARTピンのVCCに対する抵抗をテストする(マルチメータを抵抗測定に、通常)
  6. UART経由で接続:シリアルアダプタ(UART -> USB)を使用してコンピュータ経由でボードに接続する
    • 選択したシリアルアダプタ: FT232H + Focaccia Board
    1. 適切な電圧(3.3Vまたは5V)を選択しないと、ボードまたはシリアルアダプタが損傷します
    2. ボードRXをアダプタTXに、ボードTXをアダプタRXに接続
      • 注意: 通常VCCピンの接続は不要
    3. アダプタをコンピュータに接続
      1. sudo lsusbでアダプタを特定
      2. ls -lart /devですべてのデバイスファイルを表示。アダプタは最後の方にあり、通常ttyUSB0
      3. このデバイスにアクセスするにはdialoutグループのメンバーである必要がある(またはroot)。グループを確認するにはgroups $USER
  7. JTAGインターフェースを見つける
    • JTAGとは: JTAGインターフェースは、メーカーがチップのピン間の物理的な接続をテストする方法を提供します。電気技術者がJTAGを使用してチップを「デバッグ」するという場合、それは従来のソフトウェアデバッグとはまったく異なることを意味します。チップAのピンAがチップBのピンBに物理的に接続されているかどうか、そしてすべてのピンが正しく機能しているかを確認することです。JTAGはデバイスへの直接的なハードウェアアクセスを提供するため、セキュリティ研究にも優れたツールです。
    • JTAGの特性
      • 制御性: 内部ビットを0または1に設定できる
      • 可観測性: 内部ビットの値を確認できる
      • ...したがってEEPROMの読み書きが可能
      • インサーキットデバッグ: 回路上のコードをデバッグ(例えばOpenOCDとGDBを使用)
    • インターネットで検索
    • PCB上でTCK、TDI、TDO、TMS、TRST(オプション)を探す
      • TCK (テストクロック): コントローラの速度を決めるドラマーまたはメトロノーム。このピンの電圧はリズミカルで安定したビートで上下にパルスします。クロックの各「ビート」ごとに、コントローラは1つのアクションを実行します。
      • TMS (テストモード選択): モード選択ピンの電圧がJTAGの動作を制御します。このピンの電圧を操作することで、JTAGに何をしてほしいかを指示します。
      • TDI (テストデータ入力): チップにデータを供給するピン。JTAG標準ではこのピンを介した通信プロトコルは定義されていません。それはメーカーに委ねられています。JTAGにとって、このピンは1と0がチップに入るための単なる入口です。チップがそれらをどう処理するかはJTAGには関係ありません。
  8. JTAG経由で接続する:「シリアルアダプタ」(JTAG → USB)を使用して、コンピュータ経由でボードに接続します。
    • 選択した「シリアルアダプタ」:FT232H + Focaccia Board
    1. 適切な電圧(3.3V または 5V)を選択します。そうしないと、ボードまたはシリアルアダプタが損傷します。
    2. 先ほど見つけたJTAGピン配置を使用して、すべてを接続します。
    3. UART接続を開いたままにして(前述のとおり)、デバイスと対話し、その動作を確認します。
    4. OpenOCDを実行します。
      • 最初のウィンドウ(OpenOCD「サーバー」):openocd -f $FT232HCONFIGFILE -f $BOARDCONFIGFILE
        • $FT232HCONFIGFILE:Focaccia board reference
        • $BOARDCONFIGFILE:ハッキング対象ボードの設定ファイル(便利ですが、持っていない可能性もあります。オプションです)。
          • 注記
            • 設定ファイルは /usr/local 内にあります。ここに役立つ $BOARDCONFIGFILE が見つかるかもしれません。
            • 見つからなければ、インターネットで検索してください。
            • それでも見つからなければ、自分で作成してください。
            • TODO(自分で作成)
      • 2番目のウィンドウ(OpenOCD「クライアント」):telnet localhost 4444
        • 便利なコマンド
          • halt:CPUを停止(一時停止のようなもの)
  9. ファームウェアとファイルシステムを入手する
    • 可能性(ファームウェアとファイルシステムは暗号化されている可能性があります)
      • 製造元のウェブサイトからダウンロードする
      • デバイスだけがファームウェアをダウンロードできる場合(アップデート経由)、Wiresharkを使用してネットワークをスニッフィングし、情報を収集する
      • フラッシュチッププログラマとテストクリップを使用して、EEPROMを直接読み取る
      • ブートローダのダンプコマンド
        1. UARTインターフェースに出力されるブートログを分析する
          • 出力される可能性があり、関心のある情報(値は例ですが、探しているものを説明しています)
            • ブートローダの一般情報
              • ブートローダの名前とバージョンを検索する(例:U-Boot 1.1.3)
            • SOC情報
              • 追加のボード情報(Wi-Fi、イーサネットなど)。これらは独自のブートローダを搭載している可能性があります。
              • SOCモデル(例:ASIC MT7621A...)
              • CPU周波数
            • RAM情報
              • mtd->writesize=2048:ページサイズ(バイト)
              • mtd->oobsize=64:誤り訂正に使用されるデータ(バイト)
              • devinfo.iowidth=8:1回の操作で書き込まれる/読み取られるデータ(バイト)
              • RAMの容量
            • EEPROM情報
              • mtd->erasesize=131072:EEPROMの残り書き込み回数?(多かれ少なかれ)
            • OSカーネル情報
              • ブートローダのロード情報を探します。ここでファイルシステムに関する情報が見つかるかもしれません。
              • buildrootのバージョンを探します。これは回路のエミュレーションや各種テストに役立ちます。
            • ファイルシステム情報
              • ブートローダのロード情報とOSの起動プロセスを探します。ここでファイルシステムに関する情報が見つかるかもしれません。
            • EEPROMパーティション
              • OSの起動プロセスを探します。ここでEEPROMのパーティション、その名前、マウントポイント、RAM内の長さに関する情報が見つかるかもしれません。
              • パーティションが重複している場合、おそらくファームウェアアップグレード用です。理由は推測できるでしょう。
            • initプロセス情報
              • init started またはそれに類する文字列を検索します。これはおそらく 文字列または類似のものの近くにあります。

TODO SPIダンプ

TODO GDBアタッチ????

リバースエンジニアリング

  1. initプロセスのタイプと設定ファイル
    • タイプ
      • BSDスタイル
        • 以下のスクリプトの実行から開始
          • /etc/rc
          • /etc/rc.local
        • より新しいもの
          • /etc/rc.conf を参照して情報を確認
          • /etc/rc.d/ を実行
      • System V(最も一般的)
        • BusyBoxが起動される
        • 設定ファイルは /etc/inittab にある
          • runlevel
            • 1:シングルユーザーモード、rootシェル、パスワードなし、デーモン実行なし
            • 3:テキストベースのマルチユーザーモード、ログインプロンプト
            • 5:グラフィカルログイン
          • 次に、init時に実行されるアクションのリストがある
        • /etc/init.d/ を実行
      • Systemd(組み込みでは使用されない)
    • 識別方法
      • ブート時に表示
      • /sbin/init を分析し、上記のタイプを識別する情報を検索する

エミュレーション環境

  • 必要条件
    • バイナリファイルのCPUアーキテクチャを知っている
      • file コマンドを使用すれば簡単
    • QEMUがそのアーキテクチャをサポートしていること
  • QEMUエミュレーション(モード)
    • システムモード:システム全体をエミュレートする
      • 方法
        1. QEMU実行可能形式の場所を確認:qemu-system-$PROCESSOR$ARCHITECTURE

          • 例:qemu-system-mipsel
        2. プロセッサファミリがわかっている場合、それを指定してQEMUが環境をより適切にエミュレートできるようにすることができます。

          • サポートされているファミリのリストを取得するには:$QEMUBIN -cpu help
          • まずは汎用的なファミリCPUから始め、何かがうまくいかない場合にさらに深く掘り下げて特定のCPUファミリを使用するのが常に良いです。
        3. カーネルとルートファイルシステムが必要です。

          • 注記
            • デバイスカーネルはドライバ不足のため適していません。
            • IOTの世界には標準化がありません。
              • カーネルデバイスツリーを使用する:ボードドライバを定義するテキストファイル
                • カーネルは起動時にこのファイルをロードし、汎用ドライバを使用中のボードに適応させます。
                • あまり使用されていません。
            • したがって、カーネルとファイルシステムを再構築します。
          1. カーネルバージョン、libc バージョン、および対象の実行可能ファイルが使用するライブラリのリストを見つけます(readelf -d $EXECUTABLE)。

            • ライブラリバージョン形式:libfoo.X.Y.Z(X.Y.Z がバージョン)
              • X 互換性のないABI

出典、クレジット、謝辞

  • Valerio Di Giampietro(@valerio)氏に感謝します。彼のハードウェアハッキングに関する素晴らしいYouTubeチュートリアルチャンネルのおかげで、ここに書かれていることはすべてこれらの動画から得たものです。
  • Luca Bongiorni(@LucaBongiorni)氏に感謝します。彼の貴重なアドバイスとハードウェアツールに感謝します。
  • mightyohm.comによるはんだ付けコミックに感謝します。
  • 私を助けてくれたRedditのhardwarehackingコミュニティに感謝します
    • [Noob] Direct PCB soldering (maybe?)
  • ビアはんだ付けチュートリアルを提供してくれたAndrew Paul氏に感謝します
  • Buildrootマニュアル
  • JTAG解説
  • OpenOCD - フラッシュコマンド
  • OpenOCD + JTAG情報
  • ハードウェアハッキングチートシート - 小さなPDF
  • OpenOCD
ツールをダウンロード
200kΩ
  • デバイスを起動し、UARTピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)
  • デバイスを起動し、ブート中に疑わしいTX UARTピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)。電圧が変動している場合、このピンはおそらくTX(データ送信中)
  • デバイスを起動し、ブート中に疑わしいRX UARTピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)。電圧が0に固定されている場合、このピンはおそらくRX(データ受信待ち)
    • 表

      PINGND resistanceVCC resistanceVNotes
      1
      2
      3
      4
      • 例

  • Jtagulatorを使用する
    1. コンピュータに接続する(ボーレート: 115200)
    2. 重要: Hはヘルプ表示機能。あらゆる場面で使用する
    3. ボードGNDをJtagulatorGNDに、ボードのピン1,2,3をJtagulatorのチャンネル1,2,3に接続
    4. V: 動作電圧を設定
    5. U: UART識別メニューに入る
    6. U: 識別を開始
    7. Text string to output: default
    8. Starting channel: ボードのピン1を接続したチャンネル
    9. Ending channel: ボードのピン3を接続したチャンネル
    10. Ignore non-printable characters: Yes
    11. 完了!
  • TODO: - Use BurtleinaBoard + Busside
  • screen /dev/ttyUSB0 $BAUDRATEでTTYに接続
    • $BAUDRATEはこちらにあるもののいずれか
    • 最も一般的な$BAUDRATE
      • 115200
      • 9600
      • 57600
      • 38400
      • 19200
    • 重要: $BAUDRATEを間違えると、文字化けが見えるか、何も見えない可能性がある
    • ctrl + a -> k -> y: close screen
    • RXピンが動作しないように見える場合(タイプしてリターンを押しても何も起こらない)、「リターン」値が\r\nか\nで間違っている可能性がある
      • これを解決するにはpyserial(Pythonのシリアル通信用ライブラリ)を使用する。例:
        root@kitploit:~
        #!/usr/bin/env python3
        
        import serial
        
        ser = serial.Serial('/dev/ttyUSB0', 115200, tmieout = 0.1)
        ser.write(b"HELLO\r\n")
        ser.write(b"HELLO\n")
        
      • 問題が解決しない場合はロジックアナライザを使用する(こちらに安価なもの)
  • TDO (テストデータ出力): チップからデータが出るピン。データ入力ピンと同様、通信プロトコルはJTAGによって定義されていません。
  • TRST (テストリセット、オプション): この信号はJTAGを既知の良好な状態にリセットするために使用されます。
  • PCB上の5/6ピンの列、または10、12、14、20ピンの二列を探す
    1. GNDへの参照を見つける
      • 以前に見つけたコンポーネントを使用
      • 通常、金属プレートはGND
    2. VCCへの参照を見つける
      • 以前に見つけたコンポーネントを使用
      • コンデンサを探す。通常、コンデンサの一方の端子はVCC
    3. 以下の表を埋めながらJTAG候補ピンをテストする(箇条書きは表の各列に対応)
      1. JTAGピンのGNDに対する抵抗をテストする(マルチメータを抵抗測定に、通常200k)
      2. JTAGピンのVCCに対する抵抗をテストする(マルチメータを抵抗測定に、通常200kΩ)
      3. デバイスを起動し、JTAGピンのGNDに対する電圧をテストする(マルチメータを電圧測定に、通常20V)
      • 表

    4. 見つかった値を、jtagtestで入手可能な一般的なJTAGピン配置と比較します。
  • Jtagulatorを使用する
    1. コンピュータに接続します(ボーレート:115200)
    2. 重要: H はヘルプ表示機能です。あらゆる場面で使用してください。
    3. ボードの GND をJtagulatorの GND に、ボードのピン 1,2,3... をJtagulatorのチャンネル 1,2,3... に接続します。
    4. V: 動作電圧を設定します。
    5. J: JTAG識別メニューに入ります。
    6. ここには2つのオプションがあります。
      • I: IDCODEスキャンで識別します。TDIは見つかりません(高速)。識別するピンが多い場合に適しています。
      • B: BYPASSスキャンで識別します。TDIを見つけます(低速)。識別するピンが少ない場合に適しています。
    7. Starting channel: ボードのピン 1 を接続したチャンネル。
    8. Ending channel: ボードのピン n を接続したチャンネル。
    9. Already known pins: いいえ。ただし、すでにいくつかのピンがわかっている場合は処理を高速化できます。
    10. 開始して待つ... 完了!
  • TODO: - BurtleinaBoard + Bussideを使用する
  • 重要
    • JTAGは無効化されている可能性があります(ハードウェア、抵抗の除去)。そのため、マルチメータとJtagulatorで見つけた結果が一致しない可能性があります。この問題は、該当ピンとVCCの間に約300Ωまたは1kΩの抵抗を挿入することで解決できます。
    • JTAGは無効化されている可能性があります(ハードウェア、抵抗の除去)。この問題は、抵抗を元に戻すか、抵抗パッドをショートして直接接続することで解決できます。
    • JTAGは無効化されている可能性があります(ソフトウェア、何らかの値の設定)。
    • JTAGは無効化されている可能性があります(ハードウェア、ヒューズの溶断... この場合は希望がありません)。
    • すべてのデバッグ操作の前に実行する必要があります。
  • reset:CPUをリセット
  • reg:CPUレジスタを読み取り
  • flash info bank $BANKID または flash info $BANKID:フラッシュメモリバンク $BANKID の情報を表示(バンク=メモリの塊だと思います)
  • flash list:flash bank($BOARDCONFIGFILE内)を使用して宣言された各デバイスの連想配列のリストを、0から番号付けして取得します。
  • flash banks:flash bank($BOARDCONFIGFILE内)を使用して宣言された各デバイスの1行の概要を、0から番号付けして表示します。
  • flash write_image erase "$BINTOWRITE" $ADDRTOSTART:フラッシュメモリへの書き込み
    • $BINTOWRITE:bin(バイナリ)、ihex(Intel hex)、elf(ELFファイル)、s19(Motorola s19)、mem... などが可能です。
    • $ADDRTOSTART:書き込みを開始するアドレス(デフォルトは 0 だと思います)。
  • flash dump_image $OUTFILE $ADDRTOSTART $SIZETODUMP:メモリのダンプ
    • $OUTFILE:ダンプを保存するバイナリファイル
    • $ADDRTOSTART:読み取りを開始するアドレス(デフォルトは 0 だと思います)。
    • $SIZETODUMP:ダンプするバイト数
  • 詳細はこちら:
    • OpenOCD PDF
    • OpenOCD HTML
  • TODO
  • BusyBox
  • ブートローダにCLIがあるか?
    • ブートローダメニューを探してください。ここでこの質問に対する答えが見つかる可能性があります。
  • ブートローダシェルを取得してみてください(自動的に、またはUART経由のメニュー表示を通じて)。
  • ブートローダシェルを探索する
    • help コマンドはあなたの味方です。
    • メモリの内容をダンプする方法を見つけてください。Pythonはあなたの味方です。
    • OOBデータ(誤り訂正符号)はダンプしてもあまり役に立ちません。
  • ダンプデータの分析
    • binwalk、file、hexdump -C を使用して、ダンプされたファイルが正常かどうか、圧縮または暗号化されているかを確認します。
      • binwalk -E でファイルのエントロピーを分析します。
        • エントロピーが 1 に近い:ランダム、圧縮、または暗号化されたファイル
        • エントロピーが 1 未満:通常の実行可能ファイルまたはファイル
    • binwalk -e を使用して、識別可能なファイルセグメントを抽出します。
  • binwalk がダンプイメージを完全に理解できない場合、EEPROMパーティションテーブル(先に見つかっていれば)を使用して、ダンプイメージを複数の有用なイメージに手動で分割できます。
    • dd if=$IN_DUMPED_IMAGE of=$OUT_FILE bs=1024 skip=$BYTES_TO_SKIP_FROM_THE_START count=$HOW_MANY_BYTES_TO_WRITE
    • sha1sum、md5sum、または binwalk -W -i を使用してイメージを比較します(例えば、同じイメージだと思われる場合)。
  • 最後の操作は、ダンプイメージの内容に応じて複数回実行される可能性があります。例えば、カーネルイメージがある場合、binwalk(または、特定のカーネルイメージの構造がオンラインでわかれば dd)を使用してそのコンポーネントを再度抽出し、ルートファイルシステムを読み取ることができます。
  • ファイルシステムを抽出する
    • コマンド例(ファイルシステムの種類に基づく):fakeroot -s fakeroot.dat usquashfs -d squashfs-root u04-sqfs.dat
      • fakeroot:偽のルート環境を作成します。ファイルパーミッション、デバイスファイルなどのエミュレーションに役立ちます。
        • -s fakeroot.dat:偽のルート環境を保存し、後で fakeroot -i fakeroot.dat bash コマンドで復元できるようにします。
      • usquashfs:squashfs ファイルシステムを抽出します(あなたのケースでは異なる可能性があります)。
        • -d squashfs-root:出力先フォルダ
        • u04-sqfs.dat:抽出するファイルシステムイメージ
  • 興味深いバイナリとスクリプト
    • initプロセスによって起動される興味深いファイルを探し、一般的に名前だけで止まらず、実行されているバイナリを詳細に調査して分析する。最も興味深いのは非標準のものです。
    • factory mode 文字列を探す。デバイスをファクトリモード(存在する場合)にできれば、ハッキングがはるかに簡単になります。
    • 便利なコマンド
      • テキストエディタ
      • grep
      • find
      • xargs
      • strings
  • Y 後方互換性のあるABI
  • Z AI変更なし
  • したがって、元のライブラリと同じ X.Y が必要です。
    • 許容範囲:同じ X、より高い Y
  • ビルドシステムを使用してビルドする(機能を選択し、依存関係を自動追跡)

    • 最良のビルドシステムの選択肢
      • The Yocto project
      • Buildroot(最良)
      • OpenWRT build system
  • エミュレーションを開始する

    • QEMUエミュレーションスクリプト
      root@kitploit:~
      #!/bin/bash
      # This script will build an environment without password for the user root
      export QEMU_AUDIO_DRV="none" # ignore audio drivers
      
      qemu-system-${PROCESSOR}${ARCHITECTURE} -M $CPUFAMILY \ # See point 2
                                              -m $RAMSIZE \
                                              -kernel $KERNELPATH \
                                              -nographic \ # No GUI
                                              -hda $FILESYSTEM \
                                              -net nic,model=$NETCARDMODEL \ # Model of net card, driver must be included in kernel
                                              -net user, hostfw=tcp::2222-:22, hostfw=tcp::9000-:9000 \ # 2222 as ssh and 9000 for GDB server
                                              -no-reboot \ # Terminate the machine when is halted
                                              -append "root=/dev/hda console=uart0" # Set root filesystem and console
      
      • バイナリ実行時にライブラリ不足のエラーが表示される場合、内部で LD_LIBRARY_PATH を次のように設定します:export LD_LIBRARY_PATH=/lib:/usr/lib:$PATHTOORIGINALFILESYSTEMLIBFOLDER
    • NAND EEPROMのエミュレーションも可能です。
      root@kitploit:~
      #!/bin/bash
      
      # Part 1: Identify bytes for kernel module
      modprobe nandsim first_id_byte=$FIRSTBYTE \
                          second_id_byte=$SECONDBYTE \
                          third_id_byte=$THIRDBYTE \
                          fourth_id_byte=$FOURTHBYTE \
                          cache_file=/root/nandsim.bin \
                          parts=x,y,z,... # Define partitons size in number of erase blocks; the number of partitions depends on your device, partitions are usually print on boot
      
      # Part 2: Erase partitions created (analyze EEPROM partitions)
      flash_erase /dev/mtd0 0 8 
      flash_erase /dev/mtd1 0 20
      # ...
      
      # Part 3: Load partitions dumped from device in the ones just created
      nandwrite /dev/mtd0 part0.bin
      nandwrite /dev/mtd1 part1.bin
      # ...
      
      # Part 4: Create mountpoint for filesystem and attach (if UBIFS)
      mkdir /mnt/filesystem
      ubiattach -O $N -m $MTDDVENUM -d $UBIDEVNUM
      ```# 第5部: マウント
      mount -tubifs /dev/ubi${UBIDEVNUM}_0 /mnt/filesystem
      
      1. カーネルモジュールのバイトを特定する
        • 起動時にNANDに関する情報が印刷されることが多いので、それを確認し(上記の手順)、NAND IDを探します。バイトは最初、2番目、4番目の順で出力されます。
        • EEPROMのデータシートを調べてもこれらの情報が見つかることがあります。
        • writesize、oobsize、erasesize、iowidthを使用して、こちらで正しいコマンドを見つけることもできます。
        • それ以外の場合は、試行錯誤します。
      2. ブート時に出力されるEEPROMパーティションを分析し、そのサイズと名前を調べます。flash_eraseコマンドの最後の数値は、erasesize(parts=x,y,z,...と同じ)に関連したサイズです。
      3. デバイスからダンプしたパーティションを、先ほど作成したパーティションにロードします。
      4. ファイルシステム用のマウントポイントを作成し、アタッチします。
        • -O: ボリュームIDヘッダのオフセットを指定します。値が間違っていると、システムは正しい値を教えてくれます。それでも、512、1024、2048などの異なる値を試すことができます(試行錯誤)。
        • -m: mtdデバイス番号(ポイント3を参照)
        • -d: UBIデバイス番号(ポイント5を参照)
      5. マウント
  • ユーザーモード: wineのように、バイナリを実行してアーキテクチャに「変換」するだけ
    • 注釈
      • あまり安定していない
      • 奇妙な結果を返すことがある
    • 手順
      1. QEMU実行形式を見つける: qemu-$PROCESSOR$ARCHITECTURE
        • 例: qemu-mips64
      2. QEMUがインタプリタがないと文句を言う場合は、-L(またはmanを参照)でそのインタプリタが含まれているフォルダのパスを渡す
        • 実行ファイルがどのインタプリタを使用しているかを調べるには、readelf -l $EXECUTABLEを使用する
  • 仮想化モード: 私たちには興味がない
  • buildrootとdockerを使用したカーネルとルートファイルシステムの構築
    • 構築するカーネルは(元のカーネルに対して)以下の条件を満たす必要がある
      • 同じカーネルバージョン
      • 同じlibcバージョン(uClibc、uClibc-ng、musl、dietlibc...)
      • 同じライブラリバージョン(対象の実行ファイルに関連するもの)
    1. デバイスのバージョンに最も近いbuildrootバージョンを検索する
      • 起動時やダンプしたメモリの調査中に、使用されたbuildrootのバージョンが見つかることがある(デバイスがbuildrootで構築されている場合)
    2. 見つけたbuildrootバージョンと互換性のあるLinuxバージョンを見つけ、dockerコンテナを作成する。ここにDockerfileのサンプルがある(パッケージはbuildrootを実行するために重要)
    3. 選択したbuildrootバージョンをこちらからダウンロードし、dockerコンテナの共有フォルダ内に配置する
    4. dockerコンテナを実行し、切り替える
    5. buildrootを展開し、make manualを実行してbuildrootのマニュアルを作成する
    6. make helpを使用すると、buildrootがサポートするすべてのデバイス(ボード)が表示される。make $YOURBOARDNAMEでボードのbuildroot設定ファイルを作成する
    7. make menuconfig(テキストベース)またはmake xconfig(GUI)を使用して、ビルドに追加するカーネルモジュールを選択する。ここではmake xconfigを使用する
      • 以下は例/ガイドラインであるが、アプリケーションを実行するために必要なモジュールは自分で見つける必要がある
      • チート: Edit->Findでモジュールを検索する
      • オプション
        • Target options
          • Show options and packages that are deprecated or obsolete にチェック
          • Build packages with debugging symbols にチェックし、最高の debug level を選択
          • Strip command for binaries on target を None にチェック
          • GCC optimization level を 0 にチェック
        • Toolchain
          • Toolchain type を Buildroot toolchain にチェック
          • Kernel headers を Manually specified linux version にチェック
          • Custom kernel headers series を $DEVICEKERNELVERSION に設定
          • Linux version を $DEVICEKERNELVERSION に設定
          • C library を $DEVICECLIBRARY にチェック
          • $DEVICECLIBRARY version を $DEVICECLIBRARY $DEVICELIBRARYVERSION にチェック
          • Enable large files にチェック
        • System configuration
          • Passwords encoding を MD5 にチェック
          • Init system を $DEVICEINITSYSTEM(または BusyBox)にチェック
          • /dev management を Dynamic using devtmpfs only にチェック
          • /bin/sh を Busybox default shell にチェック
          • Install timezone info にチェック
        • Kernel
          • Kernel version を $DEVICEKERNELVERSION に設定
          • Kernel binary format を vmlinux にチェック
        • Target packages
          • Compressors and decompressors
            • bzip2 と xz-utils
          • Debugging profiling and benchmark
            • gdb と full debugger にチェック
          • Development tools
            • 必要なものを選択
          • Filesystem and flash utilities
            • mtd, jffs2 and ubi/ubifs tools(または必要なもの)
          • Libraries
            • 一般的に必要なもの(以下の提案)
            • Crypto
              • libsha1
        • Networking applications
          • rsync と必要なもの
        • Shell and utilities
          • file
        • Filesystem images
          • ext2
        • Host utilities(ターゲットデバイスではなく、ホストデバイスについて)
          • host mtd, jffs2 and ubi/ubifs tools
          • host util-linux
      • 保存するのを忘れずに
    8. 上記で定義した設定を恒久的に保存するには、make savedconfig を使用する
    9. make linux-menuconfig(テキストベース)または make linux-xconfig(GUI)でカーネルを設定する。ここではCLIバージョンを使用する
      • 以下は例/ガイドラインであるが、アプリケーションを実行するために必要なモジュールは自分で見つける必要がある
      • オプション
        • Kernel type -> Preemption model (Preemptible Kernel (Low-Latency Desktop)) -> Preemptible Kernel (Low-Latency Desktop)
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> NAND device support -> Support for NAND flash simulator
        • Kernel type -> Device drivers -> Memory technology device (MTD) support -> ->
    10. uclibc-menuconfig(常に同様)で uClibc(またはCライブラリ)を設定する
      • デバッグを有効にする: Development/Debugging options -> Enable debugging symbols。これが機能しない場合(コンパイルエラー)は、Development/Debugging options -> (Wall) compiler warnings -> -Wall -ggdb -g3 を追加する
        • -ggdb: GDBで使用するデバッグ情報を提供する
        • -g3: 追加のデバッグ情報を提供する
      • Save
      • デバイスと同様の機能を有効にする(試行錯誤。エラーが発生した場合は調査し、必要な機能を追加して再ビルドする)
    11. make。問題があれば戻って繰り返す
      • 考えられるコンパイルエラー
        • -fPIC を使用する必要がある
          • カーネルモジュール(ポイント7)の Toolchain -> Additional gcc options に --enable-shared を追加するか、buildrootにパッチを適用する
    • buildrootの設定ファイルをgitで保存する
      • 外部ツリー構成(buildrootが理解できるツリービュー形式のファイル)(br2)
        root@kitploit:~
        +-- board/
        |   +-- <company>/ (常に使われるわけではない)
        |       +-- <boardname>/
        |           +-- linux.config
        |           +-- busybox.config
        |           +-- kernel-defconfig (カーネル設定ファイル)
        |           +-- <その他の設定ファイル>
        |           +-- post_build.sh (イメージ構築直前に実行され、ルートファイルシステムをイメージにコピーするのに便利)
        |           +-- post_image.sh
        |           +-- rootfs_overlay/ (ここにあるものはすべて最終イメージにコピーされる)
        |           |   +-- etc/
        |           |   +-- <何らかのファイル>
        |           +-- patches/
        |               +-- foo/
        |               |   +-- <何らかのパッチ>
        |               +-- libbar/
        |                   +-- <その他のパッチ>
        |
        +-- configs/
        |   +-- <boardname>_defconfig (ボードのbuildroot設定)
        |   +-- uClibc.config (オプション)
        +-- patches/
        |   +-- (ここに適用するパッチ)
        |
        +-- Config.in (br2-externalツリーを使用する場合)
        +-- external.mk (br2-externalツリーを使用する場合)
        +-- external.desc (br2-externalツリーを使用する場合)
        
      • 外部ツリーを使用するには、buildrootを次のように呼び出す: make BR2_EXTERNAL=$PATHTOEXTTREE $COMMAND
      • buildrootの設定を外部ツリーに保存する: make BR2_EXTERNAL=$PATHTOEXTTREE savedefconfig
      • カーネル設定を外部ツリーに保存する: make BR2_EXTERNAL=$PATHTOEXTTREE linux-update-defconfig
      • uClibc設定を外部ツリーに保存する: make BR2_EXTERNAL=$PATHTOEXTTREE BR2_UCLIBC_CONFIG=$PATHWHERETOSAVEUCLIBCCONFIG uclibc-update-defconfig
  • PINGND resistanceVCC resistanceVNotes
    130kOhm0Ohm3.3VVCC
    24.7kOhm34kOhm3.3V1.6-3.3V on boot - TX
    3INFOhm (multimeter 1)INFOhm (multimeter 1)3.3V0V on boot - RX
    40Ohm30kOhm0VGND
    PINGND resistanceVCC resistanceVNotes
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    • 例

      PINGND resistanceVCC resistanceVNotes
      11kOhm1kOhm0V
      20Ohm90Ohm0VGND
      3INFOhm (multimeter 1)INFOhm (multimeter 1)2.1VHigh impedance, TDO?
      490Ohm0Ohm3.3VVCC
      54.7kOhm4.7kOhm3.3V
      6INFOhm (multimeter 1)INFOhm (multimeter 1)0VNot connected?
      75.7kOhm5.7kOhm3.3V
      8INFOhm (multimeter 1)INFOhm (multimeter 1)0VNot connected?
      94.7kOhm4.7kOhm3.3V
      100Ohm90Ohm0VGND
      • 互換性のあるJTAGテストサイトのピン配置が見つかりました:Altera Byteblaster
  • Enable IPv6 にチェック
  • Enable RPC にチェック
  • Enable WCHAR にチェック
  • Thread library implementation を linuxthreads にチェック
  • Thread library debugging にチェック
  • Build cross gdb for the host にチェック
  • TUI support にチェック
  • Python support にチェック
  • GDB debugger version を $LATESTGDBVERSION にチェック
  • libssh2
  • openssl
  • JSON/XML
    • expat
    • json-c
  • UBI - Unsorted block images
    Enable UBI
  • File systems -> Miscellaneous filesystem -> JFFS2 support
  • File systems -> Miscellaneous filesystem -> UBIFS filesystem support
  • Save