Chapter 1 .
2026-5
- AVR(ATmega)のHEXファイルを解析するための最も優れた無料かつ標準的なリバースエンジニアリングツールは、米国家安全保障局(NSA)がオープンソース化した Ghidra(ギドラ) です。
🛠️ AVR(ATmega)のバイナリをリバースする最強のツール群
1. Ghidra(ギドラ) — 推奨・最高峰のデコンパイラ
- 特徴:完全に無料のプロフェッショナル向けリバースエンジニアリングツールです。 [1]
- AVRへの対応:ATmega328PやATmega8などのAVRアーキテクチャに標準対応しています。
- 最大の強み:アセンブリ言語だけでなく、アセンブリを解析して人間が読める「C言語風のソースコード」に自動変換(デコンパイル)する機能を持っています。
- 解析の手順:
- Ghidraを立ち上げ、新規プロジェクトを作成してHEXファイルをインポートする。
- 言語選択で
AVR8(またはターゲットのATmega型番)を指定する。 - 自動解析(Auto Analyze)を実行すると、本体との通信で使われている「隠された文字列(SCPIコマンドなど)」や、ボタン処理の条件分岐がC言語風のコードとして右画面に表示されます。
2. Radare2 / Cutter — 高機能なオープンソース・ディスアセンブラ
- 特徴:ハッカーコミュニティで愛用されるリバースツールで、AVRマイコンのバイナリ解析(特にCTFやハードウェア解析のチャレンジ)で非常によく使われます。 [1, 2]
- GUI版(Cutter)を使用すれば、プログラム全体の構造がフローチャート(グラフ表示)として視覚化されるため、「ボタンが押されたときに、どこへジャンプしてどのシリアルデータを送っているか」の処理の流れを目で追うことができます。
3. avr-objdump — 確実なコマンドラインツール
- 特徴:Arduino IDEやMicrochip Studio(旧Atmel Studio)の裏で動いている公式の開発ツールチェーンに含まれるツールです。 [3]
- コマンドライン(ターミナル)で以下のコマンドを叩くだけで、HEXファイルを一瞬で標準的なAVRアセンブラコードに書き直してテキスト出力してくれます。
🔍 このHEXソースから「何を」読み取るべきか?
:GPS:POS?(位置・経度情報の取得 ➡️ 恒星時計算に必要な経度の自動取得に使えます):TIme:UTMe?または:SYST:TIME?(UTC時刻の取得 ➡️ JST変換や恒星時計算のベースになります):SYST:ERR?(アラーム内容・エラーログの取得 ➡️ アラーム表示に必須です)*CLS(ステータスクリア ➡️ アラームクリアボタンを押した時に本体へ投げるコマンドです)
🎯 最終的な「勝ちルート」の提案
- 抽出したコマンドを定期的に58503A本体へ投げる。
- 返ってきたUTC時刻と経度を受け取る。
- マイコン内の使い慣れたC言語ライブラリで、JST(+9時間) や 恒星時(LAST) を計算し、現代の綺麗なカラー液晶に表示する。
- アラームクリアボタンが押されたら、本体にクリアコマンドを送信する。
1. 現状の回路図の構造分析(RS-232C直叩き)
PD0(RXD0) / PD1(TXD0) を繋いで通信しています。表示は右側の並列(パラレル)接続されたキャラクター液晶
LCD1 へ出力し、ボタンは PA0〜PA3 に割り当てられた極めてストレートな調歩同期シリアル(UART)制御方式です。2. 「フロントパネル用内部SPIバス」に対応させるための回路変更点
① MISO / MOSI / SCK ピンの割り当て変更
回路図最上段にあるISP(書き込み用)コネクタに繋がっている以下のピンを、そのままJ19のSPI通信ピンへ「兼用」として引き出します。
- PB5 (MOSI) ➡️ 本体からの表示データ受信、または本体へのコマンド送信(本体側の仕様に合わせる)
- PB6 (MISO) ➡️ 双方向通信時の割り当て
- PB7 (SCK) ➡️ 本体側から供給される(またはマイコン側から送る)シリアル同期クロック
- 任意の空きGPIO(例:PB4など) ➡️ SS / CS(チップセレクト) として割り当て
② レベルシフタ(電圧変換)の検討
- 現状の回路:ATmega644は +5V で駆動しています。
- 58503Aの内部バス側:もし本体側の内部SPIバスの信号が 3.3Vロジック だった場合、5V駆動のATmegaに直接繋ぐとポートを破損するか、正常に認識しません。これは確認が必要です。
- 3.3Vだった場合の対策:J19のSPI信号線の途中に、安価な 双方向ロジックレベル変換モジュール(FXMA108や4回路タイプのものなど) を挟み、安全に5V ↔ 3.3Vの変換を行います(本体側が5Vロジックであれば直結で構いません)。
③ ADM232(RS-232Cポート)の処遇
3. ファームウェア(移植・アドオン)の設計イメージ
💡 結論
Ghidra 12.1, JDK 21
GhidraでAVR8のベアメタルファームウェア(ATmega644など)を解析するには、ハーバードアーキテクチャとメモリマップドI/Oを使用しているため、特別な処理が必要です。Ghidraは静的解析に依存しているため、バイナリメモリマップを正しくインポートし、プロセッサ言語バリアントを指定することが重要です。 Jonas Lieb +1 1. 初期設定と言語選択 ダンプしたファームウェアをGhidraにインポートする際には、プロセッサアーキテクチャを手動で設定する必要があります。 Ghidraを開き、新しいプロジェクトを作成します。 バイナリ(通常はavrdudeで抽出したもの)をプロジェクトにドラッグアンドドロップします。 Stack Overflow +1 インポートダイアログで、GhidraがATmega644を自動的に検出しない場合があります。「言語」の横にある3つの点(…)をクリックしてください。 アーキテクチャとしてAVR8を選択し、atmega644(644がリストにない場合はatmega64)を選択し、バリアントを16(アドレス指定ビット)に設定して、little / gccを実行します。 Jonas Lieb ベースアドレスが0x0000に設定されていることを確認してください(GhidraはデフォルトでAVRのフラッシュメモリをここにマッピングします)。 Jonas Lieb 2. メモリセクションの定義 最新のオペレーティングシステムバイナリとは異なり、ATmegaファームウェアは特定のメモリセグメント内にコードとデータを混在させています。Ghidraの自動解析でI/OポートまたはEEPROMのマッピングがうまくいかない場合は、手動でマッピングする必要があります。 GitHub +1 ウィンドウ > メモリマップに移動します。 starkeblog.com Atmel ATmega644データシートに記載されているとおりにメモリブロックを追加または確認してください。 フラッシュ/コードセグメント:0x0000から始まります(実行可能、読み出し、実行)。内部SRAM:通常0x0000~0x10FF(読み出し、書き込み)。 I/Oレジスタ:通常0x0020~0x005F(拡張コントローラの場合は最大0x00FF)。 Jonas Lieb +1 3. 自動解析と逆アセンブルの実行 Ghidraの自動解析(解析→自動解析)をデフォルトオプションで実行します。 Jonas Lieb AVRは16ビット命令を使用するため、生の16進数として表示される(または制御フローの切り捨て警告が表示される)未解析バイトは、手動で逆アセンブルする必要があります。 リストビューで未解析バイトを選択します。 キーボードのDキーを押して強制的に逆アセンブルを実行します。 Fキーを押して、逆アセンブルされた命令を関数に変換します。 Medium ·Ryan Cornateanu +1 4. 割り込みベクタテーブルの解決 リストビューを見る際に最も重要な最初のステップは、バイナリの先頭にある割り込みベクタテーブル(IVT)を確認することです。最初の命令は通常、RESETベクタへのJMP命令です。 Jonas Lieb +1 0x0000に移動します。 0x0000の命令をresetと命名します。 Ghidraが制御フローを追跡しやすくするために、後続のベクタ(例:INT0、TIMER0_OVF)をメモリマップに従って命名します。 Jonas Lieb 5. IOレジスタ定義の適用 逆コンパイルされたCコードを読みやすくするために、レジスタマッピングをインポートできます。これにより、コードがRAM_0x3eのような生の16進アドレスを表示するのではなく、レジスタマッピングをインポートできます。 GitHub スクリプトマネージャを開きます(ウィンドウ > スクリプトマネージャ)。 CreateAVR8GDTArchiveScript.javaが存在する場合は実行し、存在しない場合はATmega644周辺機器領域(PORTA、DDRB、TCCR1Aなど)の列挙型を手動で定義してください。 Attify +1 AVRアーキテクチャ向けにGhidraを設定する方法、メモリマップと割り込みベクタを操作する方法については、以下を参照してください。
Chapter 2 .
ebayで売られていた中古、Penter inc.製 Model SA101 260042-01 rev C ; OncoreM12互換インターポーザー付。コントローラ(CPU)は TI MSP430F1471
OncoreM12互換インターポーザー(NMEA>Motorola-BIN変換付き) GT-8031H
(GT-8031F タイプもある模様)
基板サイズ 40x60mm
https://www.ebay.com/itm/285983348465 など
jp¥3000~6000円程度
(裏面)
MCX-fe
10pコネクタの向きなどOncoreVPとは異なる(M12互換)。
ebay紹介文:
「Furuno GT-8031H and GT-8031F GPS module for Symmetricom, Fei Zyfer etc」
「GPS Receiver Card Motorola M12+ Furuno GT-8031 Pentar SA101 /Good TIME Bad DATE」
“このカードは GPS システムから正しい時刻を取得しますが、Furuno GT-8031 モジュールに影響する週番号ロールオーバーイベントのため、日付は 1024 週間前の日付になります。これは、アップグレード中の正常に動作していた GPS 受信機 (Symmetricom Syncserver) から取り外されたものです。そのため、このカードは 2022 年 9 月に同期が停止した Syncserver (S200/S250/S300/S350)/XLi/XL-GPS ユニットの問題を解決しません。このカードは、ユニットを分解する前に (日付の問題を除いて) 正常に動作することがテストされています。M12+ ベースのデバイスが動作しているものの、週番号ロールオーバーイベント (つまり、報告される日付が約 20 年前の日付になっている) が発生している場合、このカードをインストールしてもその問題は解決しません。必要なのが正しい GPS 時刻および/または正確な 1PPS レート (ほとんどの GPS 受信機の 10MHz 発振器を同期させるために使用されるもの) である場合は、このカードは正常に動作するはずです。“
“ 使用済みのFuruno GT-8031HおよびGT-8031F GPSモジュール。Symmetricom、Fei Zyferなどに対応します。1024週ロールオーバー問題のため退役です。最新のGPSモジュールが必要な場合は、検索で「Furuno GT-8736D」または「Trimble MT48」をebays内で確認してください“
...つまり $GPZDA.... コマンド修正が起動都度必要らしい(又はバッテリーバックアップ)。インターポーザーCPUの初期化シーケンスにも追加が必要。ウチの場合、今回(2026)は、UPS故障での電源断なので、過去の全てのアルマナックなど履歴は失われ、再稼働させるにはその点もクリアしないといけない。
(AI(Gemini)検索 /2026-8/3)
“MSP430F1471 の、JTAG 書き込み読み出し、最安の方法は ?
最安の選択肢2選
| 方法 | 概算費用 | メリット | デメリット / 注意点 |
|---|---|---|---|
| MSP430G2 LaunchPadの流用 | 約2,500円〜3,500円 | 信頼性が高い、公式IDEでそのまま動く | ジャンパーピンから4線式JTAGの配線を引き出す工作が必要 |
| MSP-FET430UIF 互換品(海外製) | 約3,000円〜5,000円 | 標準の14ピンJTAGリボンケーブルがそのまま使える | 偽物チップによるドライバトラブルや、最新IDEで認識しないリスクがある |
方法1:MSP430G2 LaunchPadをプログラマとして流用する(最推奨・最安候補)
接続手順(4線式JTAG)
- TCK ➔ MSP430F1471の TESTピン(または専用のTCKピン)
- TMS ➔ MSP430F1471の TMSピン
- TDI ➔ MSP430F1471の TDIピン
- TDO ➔ MSP430F1471の TDO/TDIピン
- GND ➔ MSP430F1471の GND
- VCC ➔ ターゲット基板に電源がない場合のみ、LaunchPadの3.3Vから供給
方法2:MSP-FET430UIF 互換品(中華製サードパーティ品)
注意点
- 古いソフトウェア環境が必要な場合がある:最新の「Code Composer Studio (CCS)」や「IAR Embedded Workbench」では、互換機のファームウェアのバージョンが古いためにエラーで認識されないケースが多発しています。その場合は、古いバージョンのCCS(v5やv6など)を使用するか、書き込み専用ツールの「MSP430 Flasher」の旧バージョンを使用する必要があります。
- 読み出し(ダンプ)の制限:もし既存のマイコンからプログラムを「読み出す(吸い出す)」ことが目的の場合、元々のマイコンのJTAGロック(セキュリティヒューズ)が切断されていないことが前提です。ロックされている場合はどのツールを使っても読み出せません。
ソフトウェア(書き込み・読み出しツール)
- 読み出し(ダンプ)コマンド例:
MSP430Flasher.exe -n MSP430F1471 -r [output.txt, MAIN] - 書き込みコマンド例:
MSP430Flasher.exe -n MSP430F1471 -w "input.txt" -v
ロックされている場合の挙動と再利用方法
パターンA:JTAGヒューズが焼き切られている場合(量産品で多い)
- JTAG経由での消去・書き込みは「不可能」です。物理的にJTAGポートが破壊されているため、MSP-FETなどを繋いでも一切認識しません。
- 解決策(再利用方法):マイコンに内蔵されている「BSL(ブートストラップローダー)」というUART(シリアル)通信機能を使用します。BSL経由であれば、パスワードが不明でも「一括消去(Mass Erase)」コマンドを送ることで、内部データを完全に消去し、新しいプログラムを上書きできるようになります(以降の書き込みもBSL経由で行います)。
パターンB:単に読み出しがガードされている、または未ロックの場合
- JTAGヒューズが切られていなければ、JTAG経由でそのまま「一括消去」をかければ上書き・再利用が可能です。
ツール到着後のチェックポイント
- JTAGピンの導通確認(最優先)
ツールが届いたら、まずはマイコンのJTAGピン(56: TMS, 57: TCK, 58: TDI, 59: TDO)が、基板上のどこに引き出されているかをテスターで特定します。おそらく上部の「P2」パッドか、右下の10ピンヘッダのどこかに繋がっているはずです。 - JTAGロック(ヒューズ)の生死確認
LaunchPadを繋いで、公式ツール(Code Composer StudioやMSP430 Flasher)からターゲット(MSP430F1471)を認識させてみます。- 認識できた場合:メーカーがヒューズを切っていないため、そのまま日付パッチを当てたプログラムを一括消去して書き込めます。
- 「Unknown Device」やアクセス拒否になる場合:残念ながらJTAGヒューズが物理的に焼き切られています。その段階で初めて「CPUを剥がして別の変換基板に載せる」か、「本体(Z3805A等)のEPROM改造にシフトする」かの決断になります。
- JTAGピンの導通確認(最優先)
ツールが届いたら、まずはマイコンのJTAGピン(56: TMS, 57: TCK, 58: TDI, 59: TDO)が、基板上のどこに引き出されているかをテスターで特定します。おそらく上部の「P2」パッドか、右下の10ピンヘッダのどこかに繋がっているはずです。 - JTAGロック(ヒューズ)の生死確認
LaunchPadを繋いで、公式ツール(Code Composer StudioやMSP430 Flasher)からターゲット(MSP430F1471)を認識させてみます。- 認識できた場合:メーカーがヒューズを切っていないため、そのまま日付パッチを当てたプログラムを一括消去して書き込めます。
- 「Unknown Device」やアクセス拒否になる場合:残念ながらJTAGヒューズが物理的に焼き切られています。その段階で初めて「CPUを剥がして別の変換基板に載せる」か、「本体(Z3805A等)のEPROM改造にシフトする」かの決断になります。
画像の基板(Pentar Inc. 260042-01)からの考察
- 右上のヘッダパターンと、右下の10pinヘッダ(オス)
R2,R3の近くにある2列×5ピンのヘッダは、MSP430F1471のJTAG信号(TCK, TMS, TDI, TDO)や、BSL信号(UARTのTX/RX、RST、TEST)が引き出されている可能性が非常に高いです。
- 中央(GT-8031の下)の10ピンソケット
- ここもインターフェース用、もしくはデバッグ用のポートとしてパターンが用意されている可能性があります。
1. 電圧レベル(TTLかRS-232Cか)の確認と工作
- TTLレベル(3.3V)の場合 【工作不要】
- 信号線がマイコンから直接(または数Ωの抵抗を介して)10ピンに届いている場合です。数百円の市販の「USB-UART変換モジュール」をジャンパー線で繋ぐだけでPCと通信できます。
- RS-232Cレベル(±5V〜±12V)の場合 【バイパス工作が必要】
- 基板上のIC(U2など)がレベル変換IC(MAX232等)の場合、信号が反転・高電圧化されています。これを3.3VのUARTとして使いたい場合は、変換ICの手前(マイコンの足)から直接配線をハンダ付けして引き出すか、RS-232Cに対応したUSBシリアルケーブルを使用する必要があります。
2. GPSモジュール(GT-8031)との衝突対策
- GPSモジュールが未実装・取り外してある場合 【工作不要】
- マイコンのUARTピン(RXD/TXD)がフリーになっているため、そのまま外部と通信させても衝突しません。
- GPSモジュールが載ったままの場合 【パターンカット等の工作が必要】
- GPSモジュールが常にデータを送信しようとするため、外部からUART信号を入力するとデータが衝突して壊れるか通信できません。GPSモジュールを取り外すか、基板の信号線をカッター等で切断(パターンカット)する必要があります。
3. マイコン自体の書き換え工作(必須)
“ソケット部分には GT-8031H がハンダ付け配線されているので、撤去が必要になりそう。このボードは3.3Vロジック仕様。残念ながら U1の#12,#13 ピン は、GNDに落とされていた。設計意図はガッカリする方向かもしれない。これを再利用するには、Furuno GT-8031H 初期化コードに日付変更が必要なので、書き換える方法を考えないといけない。
- ソフトウェア(タイマー)シリアルでの実装
ハードウェアUARTではなく、他の汎用GPIOピン(P1〜P4など)をタイマーで制御し、ソフトウェア的にシリアル通信(Bit-Banging)を実装しているパターンです。GPSデータ(Motorola BIN)の速度(一般的に9600bpsなど)であれば、MSP430の性能でもソフトウェア制御で十分に間に合います。 - SPI通信など別のインターフェースの使用
GT-8031H側とUARTではなくSPIや別の通信方法でデータをやり取りし、右下の10ピンへ変換して出力しているパターンです。
今後の「工作」と「再利用」の分かれ道
選択肢A:このボードのマイコンをそのまま活かして書き換える(難易度:高)
選択肢B:GT-8031Hを撤去し、ピンを乗っ取る(難易度:中)
選択肢C:部品取りとして諦め、マイコンだけを剥がす(一番スッキリするかも)
剥ぎ取ったマイコンを市販のQFP48ピン変換基板(数百円)に載せ替えれば、GNDの縛りから解放され、前述の「LaunchPad流用」などで純粋な4線式JTAGプログラマを繋いで、100%自由に再利用できるようになります。
1. 接続方法の選定(JTAG か BSL か)
- 第一候補:JTAG(右下の10ピンヘッダの調査)
右下の10ピンヘッダ(GPSデータ入出力ポート)に、JTAG信号(TCK, TMS, TDI, TDO, RST)が混ざって引き出されている可能性があります。もしここにJTAGが来ていれば、前述の「MSP430G2 LaunchPad」などを繋ぐだけで簡単に消去・書き込みができます。 - 第二候補:JTAG(U2周辺の空きパターン)
基板中央のU2の上や、P2と書かれた5つの四角いパッド(スルーホール)など、メーカーが製造時にテストや書き込みに使ったと思われるポイントがいくつかあります。特にP2の5ピン は、JTAG(またはBSL)のピンアサインである可能性が非常に高いです。
2. 具体的な手順(延命修理への道)
- JTAGピンの特定(テスターでの導通確認)
マイコン(U1)の以下のピンが、基板上のどこ(右下10ピン、またはP2など)に繋がっているかをテスターで探します。- 5番ピン:TMS
- 6番ピン:TCK
- 7番ピン:TDI
- 8番ピン:TDO/TDI
- 58番ピン:RST/NMI(※型番によってピン番号が異なるため要確認、後述)
- プログラムの「一括消去」と「新規書き込み」
メーカーがJTAGロック(ヒューズ切断)をしていない祈るような気持ちでJTAGプログラマを接続します。- ロックされていない場合:ラッキーです。そのまま新しいプログラムを書き込めます。
- ロックされている場合:JTAGでのアクセスが拒否されるため、BSL(ブートストラップローダー)のピン(P1.1, P1.2など)を探してBSL経由で強制一括消去を行います。
- ソフトウェアシリアルによる「新・初期化コード」の作成
元々の純正プログラムを読み出すことは(ロックの有無に関わらず)難しいため、「GT-8031Hに日付変更コマンドを送るためだけの、最小限の初期化用プログラム」を新しく自分で書きます。12, 13番ピンが使えないため、元の基板と同じピン(GT-8031HのRXに繋がっているマイコンのGPIOピン)を使って、9600bpsなどのソフトウェアシリアルで初期化コマンドを送信するコードを作成します。
MSP430F1471 (64ピン) のJTAG/電源ピン配置
P2 パッドへの導通を確認する際の参考にしてください。- 56番ピン:TMS
- 57番ピン:TCK
- 58番ピン:TDI
- 59番ピン:TDO/TDI
- 54番ピン:RST/NMI(リセット)
- 62番ピン:AVCC / 1番ピン:DVCC(3.3V電源)
- 63番ピン:AVSS / 18番ピン:DVSS(GND)
次のステップへの展望
- 本体側EPROM(ファームウェア)の書き換え
Z3805AなどのCPUボードに載っているUV-EPROM(27C512等)のデータをROMライターで吸い出し、日付やコマンド初期化コマンド、又は、日付計算のオフセット(1024週の倍数)を修正して焼き直す方法です。海外のタイムマニア(Time-Nuts)の間で解析されたパッチコードが共有されている場合があります。 - GPSデータのインターセプト(シリアルデータ改変)
GT-8031Hから本体へ送られるNMEAやモトローラバイナリデータの「日付/週数」や初期化コマンドの部分だけを、中間に挟んだ小さなマイコン(ATmegaやRP2040など)でリアルタイムに数値を書き換えて本体に流す方法です。基板のパターンを1箇所カットするだけで済むため、一番安全な修理法としてよく使われます。
Chapter 3 .
2026-8
58503Aファームウェア参考
https://github.com/willhb/HP-58503A-Firmware
rev.Dファームウェアバックアップ
https://github.com/Bluestackson/Z3805A_rev.D_Samsung
---
実行機(Samsung版Z3805A(rev.D版/rev.C版))からのファームウェアチップから .bin 取り出し。-rev.D:Z3805-68003 (5NV00GP), -rev.C:Z3805A-68001 (6E901C3 3627)
(rev.D)
---
バイナリエディタで下見した所、手元のRev.D, Rev.C, 及び、ネット上の Rev.C(など複数)、全てが微妙に違う」困惑する結果に。Rev.Cは、概ね58503Aの物と同一(内部バージョンのみ相違?、Z3805A/Z3801A⇒58503)な様だ。Rev.D と Rev.C の違いは解る(GPSモジュールの違い/Furuno vs, OncoreVP)が、その他の違いは流布している情報以上に派生版が有る可能性を示しているのかもしれない(単に読み出しエラーのオチもありえるが)。また、Z3805A版の方がZ3801A版よりもコード部分が少し多く、逆にZ3805A版のメッセージ総数は減っている様だ。機種コードは「Z3801A」「Z3805A」「58503」の3種類があった。
rev.Dファーム内のGPSモジュール関連と見られるMODEL #記述には、 FURUNO GT-80, GT-77,GT-74, が有り、それらに対応しているらしい。rev.Cファーム内の相同位置のMODEL # は「空欄」の様だ。



0 件のコメント:
コメントを投稿