背景:仕様書もソースコードもない状態からの再開発
製造業のお客様から「15年前に開発した産業用計測機器の制御基板を再生産したいが、仕様書もソースコードも紛失してしまった。残っているのは実機と、コンパイル済みのelfファイルのみ」というご相談をいただきました。
対象のマイコンはルネサス RL78/G13。当時のメーカー担当者は既に退職しており、開発環境も失われている状態でした。部品の生産終了も迫っており、最新のマイコン(STM32F4シリーズ)への移植も同時に求められました。
本記事の対象読者
- 仕様書なしのレガシーシステム再開発を検討している方
- バイナリ解析・逆アセンブル技術に興味がある組込みエンジニア
- 古いマイコンから最新マイコンへの移植を計画している方
払拭すべき3つの課題
このプロジェクトを進めるにあたり、以下の課題を整理しました。
1. アルゴリズムの特定とデータテーブルの存在
計測機器の核心である「制御ロジック」が、プログラム上の計算によるものか、あるいはROM/EEPROMに格納された独自のデータテーブルによるものかを特定する必要がありました。
elfファイル内にデータテーブルが不完全な場合、実機からのメモリダンプが必要になります。
2. ハードウェア依存のタイミング調整
15年前のマイコン特有の処理待ち(ディレイループ)が、現在の高速なマイコンでは再現できないリスクがあります。
計測機器としての「正確なパルス幅・サンプリング周期」を担保するため、実機の出力波形をオシロスコープで実測し、復元コードとのベンチマークを行う工程が不可欠でした。
3. 周辺回路仕様の把握
GPIOポートの先にあるアナログ回路(増幅器・フィルター等)の特性はバイナリからは読み取れません。
基板上の回路構成を実機から解析し、レジスタ設定値との整合性を確認する作業が必要でした。
逆アセンブルの実践手順
以下の手順でelfファイルからC言語への復元を進めました。
ステップ1:elfファイルの解析
# RL78用objdumpでディスアセンブル
rl78-elf-objdump -d firmware.elf > disasm.txt
# シンボルテーブルを抽出
rl78-elf-nm firmware.elf > symbols.txt
# セクション情報を確認
rl78-elf-readelf -S firmware.elf
RL78のアーキテクチャ固有のレジスタ名(P0, ADM, TDRなど)を手がかりに、ペリフェラル設定箇所を特定しました。
ステップ2:フローチャートの作成
ディスアセンブル結果から、以下の構造を読み取りました:
- 初期化ルーチン:クロック設定、GPIO設定、ADC設定
- メインループ:センサーデータ取得 → 演算処理 → 出力制御
- タイマー割り込みハンドラ:10ms周期でのサンプリング制御
- UART通信ハンドラ:外部PCとのデータ送受信
ポイント:レジスタ操作の解読
RL78のレジスタは8ビット単位で直接操作されており、以下のようなアセンブラ命令が頻出しました。
; P0レジスタ(ポート0)のビット3をセット
SET1 P0.3
; ADMレジスタ(AD変換モード)に0x80を書き込み
MOV ADM, #80h
これらをルネサスのハードウェアマニュアルと照合し、C言語のビット操作マクロに変換しました。
ステップ3:C言語への復元
解析結果をもとに、以下のようなC言語コードを復元しました。
// RL78/G13 ADC初期化(復元コード)
void ADC_Init(void) {
ADCEN = 1; // ADコンバータ有効化
ADM0 = 0x00; // ソフトウェアトリガモード
ADM1 = 0x20; // 10ビット分解能
ADM2 = 0x00; // Vref = VDD
ADCE = 1; // 比較器有効化
}
// タイマー割り込みハンドラ(10ms周期)
__attribute__((interrupt))
void INTTM00(void) {
static uint16_t adc_value;
// ADC開始
ADCS = 1;
while(!ADCS); // 変換完了待ち
adc_value = ADCR; // 結果読み取り
// データ処理(省略)
process_sensor_data(adc_value);
}
ステップ4:実機波形との突合
復元したコードをRL78評価ボードで動作させ、以下の検証を行いました:
- オシロスコープで実機とのGPIO出力波形を比較
- ADC値のサンプリングタイミングを実測
- UART通信のボーレートとデータフォーマットを確認
この工程で、タイマー設定値の微調整や、ディレイループの補正を実施しました。
STM32への移植
復元したC言語コードを、最新のSTM32F4マイコンに移植しました。
移植のポイント
| 項目 | RL78/G13 | STM32F4 |
|---|---|---|
| クロック周波数 | 32MHz | 168MHz(5倍高速) |
| ADC分解能 | 10ビット | 12ビット |
| タイマー | 8ビットタイマー | 16/32ビット高精度タイマー |
| 開発環境 | CS+ (ルネサス) | STM32CubeIDE + HAL |
クロック周波数が5倍になったため、ディレイループを以下のように調整しました。
// RL78版(32MHz想定)
void delay_us(uint16_t us) {
for(uint16_t i = 0; i < us * 8; i++) {
__nop();
}
}
// STM32版(168MHz想定)
void delay_us(uint16_t us) {
// HALのマイクロ秒ディレイを使用
HAL_Delay_us(us);
}
成果:完全な動作再現に成功
プロジェクトは以下の成果を得ました:
- elfファイルから完全なC言語復元:約2,000行のコードを復元
- 実機との波形一致率99%以上:オシロスコープでの検証
- STM32への移植完了:開発期間3ヶ月(通常の新規開発の半分)
- 暫定仕様書の作成:今後のメンテナンス用ドキュメント整備
お客様の声
「諦めていた製品の再生産が実現できました。復元された仕様書により、今後の改良も可能になりました。テクノスフィアさんの逆アセンブル技術は驚異的です。」
— 製造業A社 開発部長
まとめ:レガシーシステムの逆アセンブルで押さえるべきポイント
本プロジェクトを通じて得られた知見をまとめます。
技術的なポイント
- ハードウェアマニュアルの徹底活用:レジスタ操作の意味を正確に把握
- 実機検証の重要性:波形測定によるタイミング検証は必須
- 段階的な復元:初期化→メインループ→割り込みの順で解析
- ツールの選定:objdump, IDA Pro, Ghidraなど複数ツールを併用
プロジェクト管理のポイント
- 初期調査フェーズの確保:実現可能性を見極める期間が重要
- 実機の確保:動作する実機があれば成功率が飛躍的に向上
- 段階的なマイルストーン設定:解析→復元→検証→移植の各フェーズで区切る
テクノスフィアの逆アセンブル・レガシーシステム再構築サービス
弊社では、仕様書やソースコードがない古い組込み機器の再開発に対応しています。
- 対応マイコン:Z80, 8051, AVR, ARM, ルネサス, TI, 日立系MCU
- 対応ファイル形式:elf, hex, bin, s19など
- 実績アーキテクチャ:8ビット〜32ビット幅広く対応
「古い機器を現代に蘇らせたい」「部品廃止で困っている」といったご相談は、お問い合わせフォームからお気軽にご連絡ください。