リバースエンジニアリングESP8266-パート1

スマートホームシステムに対する一般的な熱狂に負け、ACS TPエンジニアとしての専門教育を受けたので、このトピックを趣味として扱うことができてうれしいです。 この記事では、人気のあるESP8266モジュールのリバースエンジニアリングの経験を紹介します。


内容


  1. はじめに
  2. アーキテクチャESP8266
  3. ツール
  4. 研究用ファームウェアのダウンロード
    • ELF
    • モジュールファームウェア
    • カスタムファームウェア
  5. アセンブラーXtensa
    • 登録
    • 基本的な演算子
    • 機能
    • 条件付きジャンプ
  6. おわりに
  7. 参照資料


1.はじめに


私は主に、内部SoCデバイス、プロセッサコマンドのアーキテクチャとシステム、ファームウェアの起動とダウンロードの手順、その他の興味深いことに興味がありました。 このモジュールの学習を開始した後、必要な情報があまり多くないという事実に直面しました。多くの場合、それは非常に矛盾しています。 したがって、私は多くのことを再確認し、経験的に何かを見つけ、何かについて推測する必要がありました。 あなたのコメントや追加を喜んでいます。

受け取ったすべての情報を体系化するために、この記事は作成されました。

2. ESP8266のアーキテクチャ


技術的な仕様については説明しませんが、これについてはHabréを含め、多くのことが書かれています。 興味のある方は、例えばこちらをご覧ください

全体的なシステムアーキテクチャから始めましょう。 モジュールはSocであり、Xtensaファミリーのプロセッサ-米国の会社Cadenceが製造したテンシリカのL106 Diamondシリーズ、および512kBフラッシュメモリチップに基づいています。 モジュール自体は、中国の会社Espressif Systemsによって開発されました。 したがって、ESP8266の主要な公式情報はEspressif(中国語および翻訳版)からのものであり、いくつかの一般的なデータはCadenceから入手できます。

このプロセッサフ​​ァミリの機能は、顧客が提案されたXtensa Processor Generatorツールを使用して、必要な特性を備えたチップを組み立て、メーカーに注文できる設計者を表すことです。 そのため、たとえば、コアの数、追加の命令、DSPモジュールなど、さまざまな変更が大きく異なる場合があります。

メモリカード(アドレス空間)

前述したように、このモデルは512 KBのフラッシュROMとSoCで構成されており、未確認レポートによると、最大248 KBのRAMが搭載されています。

一般に、記憶に関連するすべてのもの-セグメントの場所、プロパティ、および属性-はコミュニティ研究です。 元の中国語のドキュメントでは、この質問は何らかの理由で回避されています。

現在知られているメモリカードのオプションの1つ(他のソースと矛盾があります)は、 ここで表示できます 。 最も興味深いアドレスのみを示します。

内部メモリ:
範囲説明
3FFE8000h-3FFFBFFFhユーザーアプリケーション用のRAM。 モジュールが起動すると、ユーザーファームウェアの値で初期化できます。
3FFFC000h-3FFFFFFFhシステムRAM
40000000h-4000FFFFhシステムROM。 ここからプロセッサが起動し、ユーザーファームウェアがロードされ、メインシステムライブラリがここにあります。
40100000h-4010FFFFhRAM、カスタムファームウェアを含む
40240000h-40271FFFhユーザーファームウェアの2番目の部分。 接続されたライブラリとSDKのコードは次のとおりです。 40000hでフラッシュにマッピングされます。

アドレス空間の異なるセグメントは、RAM、ROM、またはフラッシュに直接マッピングできます。 マップされた領域は、速度のためにキャッシュされます。

フラッシュ:
範囲説明
00000h-3DFFFhカスタムファームウェアダウンロードアドレス
40000h-7BFFFhSDKライブラリのダウンロードアドレス(ユーザーファームウェアの一部にすることもできます)

ファームウェア形式

ここで、モジュールの起動プロセスに進む前に、ファームウェアのフォーマットを検討してください。 カスタムファームウェアをロードするには、通常、アドレス00000hと40000hに2つのデータブロックを書き込むだけで十分です。 残りのブロックでは、たとえば、互換性のないデータ形式で新しいファームウェアをアップロードする場合、設定をリセットするためにフラッシュが必要になる場合があります。

40000hで始まるブロックには、変更せずにロードして動作する単純なバイナリコードが含まれています。 ただし、00000hで始まるブロックは、その中のセグメントに関する構造化データであり、次のようになります。
オフセット説明
0ファームウェア識別子、常に「0xE9」
1ファームウェアのセグメント数
2,3SPIフラッシュオプション
4-7ファームウェア起動アドレス(エントリポイント)
8 ...次に、セグメントデータが来ます

セグメント構造:
オフセット説明
0-3セグメントダウンロードアドレス
4-7セグメントサイズ
8 ...次はセグメントデータです

最後のブロック:

16バイトから1バイトを引いた境界に揃えるためにゼロで埋められます。 その後、最後のバイトが追加されます。これは、すべてのバイトのxor関数と定数「0xEF」によって計算された、すべてのセグメントのデータのチェックサムです。

ファームウェア形式は、 esptoolユーティリティの説明から取得されます。

起動プロセス

ここで、この知識を武器に、ESP8266モジュールの起動プロセスをファームウェアの初期化と起動の観点から検討します。

電源が投入されるか、リセット信号が受信されると、プロセッサはアドレス40000080h(システムROM)から命令の実行を開始します。 40001308hで、00000hフラッシュブロックを読み取り、指定されたアドレスに格納されているセグメントをコピーするプロシージャが検索されます。


図では、このプロセスは紫色で示されています。 ここでは、ファームウェアの一部が実行可能コードであり、RAM内のデータを初期化することがわかります。 緑色は、プロセッサのアドレス空間に直接マップされたブロックを示します。

すべての初期化後、制御はファームウェアヘッダーで指定されたアドレスに転送されます。 これは通常、ユーザーコード40100000hのアドレスです。

3.ツール


さて、ESP8266モジュールを起動するためのアーキテクチャと手順を理解したので、次にプログラムコードの検証に移りましょう。 これにはどのようなリソースとツールがありますか?

SoC Xtensaに基づいた製品の設計、開発、デバッグ用に、プロセッサメーカーのXtensa Xplorerパッケージがあり、これにはSoCシミュレーターであるTurboXIMを含む多くのユーティリティが含まれています。 理論的には、このユーティリティは便利ですが、無料版でもリクエストに応じて発行されるライセンスキーが必要です。 そのような要求を書いたので、応答を受け取らなかったため、シミュレータを使用できませんでした。 ここからツールのセット全体をダウンロードできます。もっと幸運かもしれません。

ファームウェアの開発、ビルド、およびデバッグ情報のアップロードを行うには、 ここで説明するように、開発環境を展開することが役立ちます

従来のツールのうち、IDA ProとHIEWを使用します。

Xtensaプロセッサコードを学習するには、ビルトインpythonインタープリターを備えたIDA Proバージョン6.6以降を使用して、スクリプトを実行する必要があります。 Xtensaは標準的にサポートされているプロセッサのリストに含まれていないため、IDA Proを起動するたびに、テストファイルを開く前に、スクリプト「xtensa.py」をダウンロードする必要があります

また、セグメントを自動的に作成し、システムROMの機能に名前を付けるには、IDA Proのスクリプトが必要です。 システムファームウェアのスクリプトとダンプは、 ここからダウンロードできます

HIEWは、ELFおよび既製のバイナリファームウェアファイルの構造を調査するのに役立ちます。

次のパートでは、調査のためにファームウェアをダウンロードするプロセスを見ていきます。

更新する ここに続きます

Source: https://habr.com/ru/post/J255135/


All Articles