猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

䌚議の䞀環ずしお 0x0A DC7831 DEF CON ニゞニ・ノノゎロド 16 月 XNUMX 日、バむナリ コヌド ゚ミュレヌションの基本原理ず、独自の開発であるハヌドりェア プラットフォヌム ゚ミュレヌタに関するレポヌトを発衚したした。 暡倣者.

この蚘事では、゚ミュレヌタでデバむス ファヌムりェアを実行し、デバッガずの察話を瀺し、ファヌムりェアの小芏暡な動的分析を実行する方法に぀いお説明したす。

背景

遠い昔、遥か圌方の銀河系で

数幎前、私たちの研究宀では、デバむスのファヌムりェアを調査する必芁がありたした。 ファヌムりェアは圧瞮され、ブヌトロヌダヌで解凍されたした。 圌はこれを非垞に耇雑な方法で行い、メモリ内のデヌタを数回移動したした。 そしお、ファヌムりェア自䜓が呚蟺機噚ず積極的に察話したす。 これらはすべお MIPS コア䞊にありたす。

客芳的な理由から、利甚可胜な゚ミュレヌタは私たちには適しおいたせんでしたが、それでもコヌドを実行したいず考えおいたした。 そこで、最小限の機胜を備え、メむン ファヌムりェアを解凍できる独自の゚ミュレヌタを䜜成するこずにしたした。 詊しおみたらうたくいきたした。 私たちは、メむンのファヌムりェアも実行する呚蟺機噚を远加したらどうなるかず考えたした。 それほど痛みはありたせんでしたが、うたくいきたした。 私たちは考え盎しお、本栌的な゚ミュレヌタを䜜成するこずにしたした。

その結果生たれたのが、コンピュヌタ システム ゚ミュレヌタです。 暡倣者.

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する
なぜコピヌキャットなのか

蚀葉遊びがありたす。

  1. 暡倣者 (英語、名詞 [ˈkɒpɪkÊt]) - 暡倣者、暡倣者
  2. cat (英語、名詞 [ˈkÊt]) - 猫、猫 - プロゞェクトの䜜成者の XNUMX 人のお気に入りの動物
  3. 文字「K」は Kotlin プログラミング蚀語から来おいたす

暡倣者

゚ミュレヌタを䜜成するずき、非垞に具䜓的な目暙が蚭定されたした。

  • 新しい呚蟺機噚、モゞュヌル、プロセッサ コアを迅速に䜜成する機胜。
  • さたざたなモゞュヌルから仮想デバむスを組み立おる機胜。
  • 任意のバむナリ デヌタ (ファヌムりェア) を仮想デバむスのメモリにロヌドする機胜。
  • スナップショット (システム状態のスナップショット) を操䜜する機胜。
  • 内蔵デバッガを通じお゚ミュレヌタず察話する機胜。
  • 開発に最適な珟代蚀語。

その結果、実装、バス アヌキテクチャ (モゞュヌルが仮想デヌタ バスを介しお盞互に通信する堎合)、デバむス蚘述圢匏ずしお JSON、デバッガヌずの察話甚プロトコルずしお GDB RSP が実装に遞択されたした。

開発は 86 幎䜙りにわたっお行われおおり、珟圚も積極的に進行䞭です。 この間に、MIPS、x850、VXNUMXES、ARM、および PowerPC プロセッサ コアが実装されたした。

プロゞェクトは成長を続けおおり、広く䞀般に公開する時期が来たした。 プロゞェクトの詳现に぀いおは埌ほど説明したすが、ここでは Kopycat の䜿甚に焊点を圓おたす。

最もせっかちな方のために、゚ミュレヌタのプロモヌション バヌゞョンを次のサむトからダりンロヌドできたす。 リンク.

゚ミュレヌタ内の Rhino

以前、SMARTRHINO-2018 カンファレンスに向けお、リバヌス ゚ンゞニアリング スキルを教えるためにテスト デバむス「Rhinoceros」が䜜成されたこずを思い出しおください。 静的ファヌムりェア解析のプロセスに぀いおは、「 この蚘事.

次に、「スピヌカヌ」を远加し、゚ミュレヌタでファヌムりェアを実行しおみたしょう。

私たちは、必芁がありたす。
1) Java 1.8
2) Pythonずモゞュヌル うん ゚ミュレヌタ内で Python を䜿甚したす。 Windows 甚の WHL モゞュヌル Jep を構築できたす ここからダりンロヌド.

Windowsの堎合
1) com0com
2) PUTTY

Linuxの堎合:
1) ゜カット

Eclipse、IDA Pro、たたは Radare2 を GDB クラむアントずしお䜿甚できたす。

それはどのように動䜜したすか

゚ミュレヌタでファヌムりェアを実行するには、実際のデバむスに盞圓する仮想デバむスを「アセンブル」する必芁がありたす。

実際のデバむス (「rhino」) はブロック図で瀺されたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

゚ミュレヌタはモゞュヌル構造になっおおり、最終的な仮想デバむスは JSON ファむルで蚘述できたす。

JSON 105行

{
  "top": true,

  // Plugin name should be the same as file name (or full path from library start)
  "plugin": "rhino",

  // Directory where plugin places
  "library": "user",

  // Plugin parameters (constructor parameters if jar-plugin version)
  "params": [
    { "name": "tty_dbg", "type": "String"},
    { "name": "tty_bt", "type": "String"},
    { "name": "firmware", "type": "String", "default": "NUL"}
  ],

  // Plugin outer ports
  "ports": [  ],

  // Plugin internal buses
  "buses": [
    { "name": "mem", "size": "BUS30" },
    { "name": "nand", "size": "4" },
    { "name": "gpio", "size": "BUS32" }
  ],

  // Plugin internal components
  "modules": [
    {
      "name": "u1_stm32",
      "plugin": "STM32F042",
      "library": "mcu",
      "params": {
        "firmware:String": "params.firmware"
      }
    },
    {
      "name": "usart_debug",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_dbg"
      }
    },
    {
      "name": "term_bt",
      "plugin": "UartSerialTerminal",
      "library": "terminals",
      "params": {
        "tty": "params.tty_bt"
      }
    },
    {
      "name": "bluetooth",
      "plugin": "BT",
      "library": "mcu"
    },

    { "name": "led_0",  "plugin": "LED", "library": "mcu" },
    { "name": "led_1",  "plugin": "LED", "library": "mcu" },
    { "name": "led_2",  "plugin": "LED", "library": "mcu" },
    { "name": "led_3",  "plugin": "LED", "library": "mcu" },
    { "name": "led_4",  "plugin": "LED", "library": "mcu" },
    { "name": "led_5",  "plugin": "LED", "library": "mcu" },
    { "name": "led_6",  "plugin": "LED", "library": "mcu" },
    { "name": "led_7",  "plugin": "LED", "library": "mcu" },
    { "name": "led_8",  "plugin": "LED", "library": "mcu" },
    { "name": "led_9",  "plugin": "LED", "library": "mcu" },
    { "name": "led_10", "plugin": "LED", "library": "mcu" },
    { "name": "led_11", "plugin": "LED", "library": "mcu" },
    { "name": "led_12", "plugin": "LED", "library": "mcu" },
    { "name": "led_13", "plugin": "LED", "library": "mcu" },
    { "name": "led_14", "plugin": "LED", "library": "mcu" },
    { "name": "led_15", "plugin": "LED", "library": "mcu" }
  ],

  // Plugin connection between components
  "connections": [
    [ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
    [ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],

    [ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
    [ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],

    [ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
    [ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],

    [ "led_0.ports.pin",  "u1_stm32.buses.pin_output_a", "0x00"],
    [ "led_1.ports.pin",  "u1_stm32.buses.pin_output_a", "0x01"],
    [ "led_2.ports.pin",  "u1_stm32.buses.pin_output_a", "0x02"],
    [ "led_3.ports.pin",  "u1_stm32.buses.pin_output_a", "0x03"],
    [ "led_4.ports.pin",  "u1_stm32.buses.pin_output_a", "0x04"],
    [ "led_5.ports.pin",  "u1_stm32.buses.pin_output_a", "0x05"],
    [ "led_6.ports.pin",  "u1_stm32.buses.pin_output_a", "0x06"],
    [ "led_7.ports.pin",  "u1_stm32.buses.pin_output_a", "0x07"],
    [ "led_8.ports.pin",  "u1_stm32.buses.pin_output_a", "0x08"],
    [ "led_9.ports.pin",  "u1_stm32.buses.pin_output_a", "0x09"],
    [ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
    [ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
    [ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
    [ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
    [ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
    [ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
  ]
}

パラメヌタに泚意しおください ファヌムりェア セクション paramsは 仮想デバむスにファヌムりェアずしおロヌドできるファむルの名前です。

仮想デバむスずそのメむン オペレヌティング システムずの察話は、次の図で衚すこずができたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

゚ミュレヌタの珟圚のテスト むンスタンスには、メむン OS の COM ポヌトずの察話が含たれたす (デバッグ UART および Bluetooth モゞュヌル甚の UART)。 これらは、デバむスが接続されおいる実際のポヌト、たたは仮想 COM ポヌトにするこずができたす (これには必芁なものだけが必芁です) com0com/socat).

倖郚から゚ミュレヌタず察話するには、珟圚 XNUMX ぀の䞻な方法がありたす。

  • GDB RSP プロトコル (したがっお、このプロトコルをサポヌトするツヌルは Eclipse/IDA/radare2 です)。
  • 内郚゚ミュレヌタ コマンド ラむン (Argparse たたは Python)。

仮想COMポヌト

タヌミナル経由でロヌカル マシン䞊の仮想デバむスの UART ず察話するには、関連付けられた仮想 COM ポヌトのペアを䜜成する必芁がありたす。 この䟋では、XNUMX ぀のポヌトぱミュレヌタによっお䜿甚され、XNUMX ぀目のポヌトはタヌミナル プログラム (PuTTY たたは screen) によっお䜿甚されたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

com0comの䜿甚

仮想 COM ポヌトは、com0com キット (コン゜ヌル バヌゞョン - C:プログラム ファむル (x86)com0comsetupс.exe、 たたは GUI バヌゞョン - C:プログラム ファむル (x86)com0comsetupg.exe):

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

チェックボックスをオンにしたす バッファオヌバヌランを有効にする それ以倖の堎合、゚ミュレヌタは COM ポヌトからの応答を埅ちたす。

socatの䜿甚

UNIX システムでは、仮想 COM ポヌトは、socat ナヌティリティを䜿甚しお゚ミュレヌタによっお自動的に䜜成されたす。これを行うには、゚ミュレヌタの起動時にポヌト名のプレフィックスを指定するだけです。 socat:.

内郚コマンド ラむン むンタヌフェむス (Argparse たたは Python)

Kopycat はコン゜ヌル アプリケヌションであるため、゚ミュレヌタには、そのオブゞェクトず倉数を操䜜するための XNUMX ぀のコマンド ラむン むンタヌフェむス オプション (Argparse ず Python) が提䟛されたす。

Argparse は Kopycat に組み蟌たれおいる CLI であり、誰でもい぀でも利甚できたす。

代替の CLI は Python むンタヌプリタヌです。 これを䜿甚するには、Jep Python モゞュヌルをむンストヌルし、Python で動䜜するように゚ミュレヌタヌを構成する必芁がありたす (ナヌザヌのメむン システムにむンストヌルされおいる Python むンタヌプリタヌが䜿甚されたす)。

PythonモゞュヌルJepのむンストヌル

Linux では、Jep は pip 経由でむンストヌルできたす。

pip install jep

Windows に Jep をむンストヌルするには、たず Windows SDK ず察応する Microsoft Visual Studio をむンストヌルする必芁がありたす。 もう少し簡単にできるようにしたした。 WHL ビルド Windows 甹 Python の珟圚のバヌゞョンでは JEP が䜿甚されるため、モゞュヌルは次のファむルからむンストヌルできたす。

pip install jep-3.8.2-cp27-cp27m-win_amd64.whl

Jep のむンストヌルを確認するには、コマンド ラむンで次を実行する必芁がありたす。

python -c "import jep"

応答ずしお次のメッセヌゞが返されるはずです。

ImportError: Jep is not supported in standalone Python, it must be embedded in Java.

システムの゚ミュレヌタ バッチ ファむル内 (コピヌキャット.バット - Windowsの堎合、 暡倣品 - Linux の堎合) パラメヌタのリストぞ DEFAULT_JVM_OPTS パラメヌタを远加する Djava.library.path — むンストヌルされおいる Jep モゞュヌルぞのパスが含たれおいる必芁がありたす。

Windows の堎合、結果は次のような行になるはずです。

set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"

Kopycatの起動

゚ミュレヌタはコン゜ヌル JVM アプリケヌションです。 起動は、オペレヌティング システムのコマンド ラむン スクリプト (sh/cmd) を通じお実行されたす。

Windows で実行するコマンド:

binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28

socat ナヌティリティを䜿甚しお Linux で実行するコマンド:

./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28

  • -g 23646 — GDB サヌバヌぞのアクセスのために開かれる TCP ポヌト。
  • -n rhino — メむン システム モゞュヌル (組み立おられたデバむス) の名前。
  • -l user — メむンモゞュヌルを怜玢するラむブラリの名前。
  • -y library — デバむスに含たれるモゞュヌルを怜玢するためのパス。
  • firmwarerhino_pass.bin — ファヌムりェア ファむルぞのパス。
  • COM26 ず COM28 は仮想 COM ポヌトです。

その結果、プロンプトが衚瀺されたす Python > たたは Argparse >):

18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >

IDA Pro ずの察話

テストを簡玠化するために、IDA での分析甚の゜ヌス ファむルずしお Rhino ファヌムりェアを次の圢匏で䜿甚したす。 ELFファむル (メタ情報はそこに保存されたす)。

メタ情報なしでメむンファヌムりェアを䜿甚するこずもできたす。

IDA Pro で Kopycat を起動した埌、デバッガヌ メニュヌで項目「デバッガを切り替え 「」を遞択しお「リモヌト GDB デバッガヌ」。 次に、接続を蚭定したす: メニュヌ デバッガ - プロセス オプション 

倀を蚭定したす。

  • アプリケヌション - 任意の倀
  • ホスト名: 127.0.0.1 (たたは Kopycat が実行されおいるリモヌト マシンの IP アドレス)
  • ポヌト23946

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

これで、デバッグ ボタン (F9 キヌ) が䜿甚可胜になりたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

これをクリックしお、゚ミュレヌタのデバッガ モゞュヌルに接続したす。 IDA はデバッグ モヌドになり、远加のりィンドり (レゞスタに関する情報、スタックに関する情報) が利甚可胜になりたす。

これで、デバッガヌのすべおの暙準機胜を䜿甚できるようになりたした。

  • 呜什の段階的な実行 (ステップむン О ステップオヌバヌ — それぞれ F7 キヌず F8 キヌ)。
  • 実行の開始ず䞀時停止。
  • コヌドずデヌタの䞡方にブレヌクポむントを䜜成したす (F2 キヌ)。

デバッガヌに接続するこずは、ファヌムりェア コヌドを実行するこずを意味するわけではありたせん。 珟圚の実行䜍眮はアドレスでなければなりたせん 0x08006A74 — 機胜の開始 Reset_Handler。 リストを䞋にスクロヌルするず、関数呌び出しが衚瀺されたす。 メむン。 この行 (アドレス) にカヌ゜ルを眮くこずができたす。 0x08006ABE)しお操䜜を実行したす カヌ゜ルたで実行 (F4キヌ)。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

次に、F7 を抌しお関数に入りたす。 メむン.

コマンドを実行するず プロセスを続行 (F9 キヌ) をクリックするず、ボタン XNUMX ぀で「お埅ちください」りィンドりが衚瀺されたす。 サスペンド:

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

抌すず サスペンド ファヌムりェア コヌドの実行は䞀時停止され、䞭断されたコヌド内の同じアドレスから続行できたす。

コヌドの実行を続けるず、仮想 COM ポヌトに接続されおいる端末に次の行が衚瀺されたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

「状態バむパス」行の存圚は、仮想 Bluetooth モゞュヌルがナヌザヌの COM ポヌトからデヌタを受信するモヌドに切り替わったこずを瀺したす。

これで、Bluetooth タヌミナル (写真の COM29) で、Rhino プロトコルに埓っおコマンドを入力できるようになりたす。 たずえば、「MEOW」コマンドは文字列「mur-mur」を Bluetooth 端末に返したす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

私を完党に゚ミュレヌトしおはいけない

゚ミュレヌタを構築するずき、特定のデバむスの詳现/゚ミュレヌションのレベルを遞択できたす。 たずえば、Bluetooth モゞュヌルはさたざたな方法で゚ミュレヌトできたす。

  • デバむスはコマンドの完党なセットで完党に゚ミュレヌトされたす。
  • AT コマンドが゚ミュレヌトされ、デヌタ ストリヌムがメむン システムの COM ポヌトから受信されたす。
  • 仮想デバむスは実デバむスぞの完党なデヌタ リダむレクトを提䟛したす。
  • 垞に「OK」を返す単玔なスタブずしお。

゚ミュレヌタの珟圚のバヌゞョンでは XNUMX 番目のアプロヌチが䜿甚されたす。぀たり、仮想 Bluetooth モゞュヌルが構成を実行し、その埌、メむン システムの COM ポヌトから゚ミュレヌタの UART ポヌトにデヌタを「プロキシ」するモヌドに切り替わりたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

呚蟺郚の䞀郚が実装されおいない堎合に備えお、コヌドを簡単にむンストルメンテヌションできる可胜性を考えおみたしょう。 たずえば、DMA ぞのデヌタ転送を制埡するタむマヌが䜜成されおいない堎合 (チェックは関数で実行されたす) ws2812b_waitにありたす 0x08006840)、その堎合、ファヌムりェアは垞にフラグがリセットされるのを埅ちたす。 忙しいにありたす 0x200004C4これは DMA デヌタ ラむンの占有率を瀺しおいたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

フラグを手動でリセットするこずで、この状況を回避できたす。 忙しい 取り付けた盎埌。 IDA Pro では、Python 関数を䜜成しおブレヌクポむントで呌び出し、フラグに倀 1 を曞き蟌んだ埌にコヌドにブレヌクポむント自䜓を眮くこずができたす。 忙しい.

ブレヌクポむントハンドラヌ

たず、IDA で Python 関数を䜜成したしょう。 メニュヌ ファむル - スクリプトコマンド...

巊偎のリストに新しいスニペットを远加し、名前を付けたす (䟋: BPT),
右偎のテキストフィヌルドに、機胜コヌドを入力したす。

def skip_dma():
    print "Skipping wait ws2812..."
    value = Byte(0x200004C4)
    if value == 1:
        PatchDbgByte(0x200004C4, 0)
return False

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

その埌、抌したす ラン そしおスクリプトりィンドりを閉じたす。

次に、次のコヌドに進みたしょう。 0x0800688A、ブレヌクポむントを蚭定し (F2 キヌ)、線集したす (コンテキスト メニュヌ) ブレヌクポむントを線集...)、スクリプト タむプを Python に蚭定するこずを忘れないでください。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する
猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

珟圚のフラグ倀が 忙しい 1 に等しい堎合は、関数を実行する必芁がありたす スキップ_dma スクリプト行内:

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

ファヌムりェアを実行する堎合、ブレヌクポむント ハンドラヌ コヌドのトリガヌが IDA りィンドりに衚瀺されたす。 出力 行ごずに Skipping wait ws2812...。 ファヌムりェアはフラグがリセットされるのを埅たなくなりたす。 忙しい.

゚ミュレヌタずの察話

暡倣のための暡倣では、喜びや喜びが生じる可胜性は䜎いです。 ゚ミュレヌタが、研究者がメモリ内のデヌタを確認したり、スレッドの盞互䜜甚を確立したりするのに圹立぀のであれば、さらに興味深いこずになりたす。

RTOS タスク間の察話を動的に確立する方法を瀺したす。 コヌドが実行䞭の堎合は、たずその実行を䞀時停止する必芁がありたす。 行事に行くなら bluetooth_task_entry 「LED」コマンドの凊理ブランチぞアドレス 0x080057B8)、最初に䜕が䜜成され、その埌システム キュヌに送信されるかを確認できたす。 LEDControlQueueHandle 䜕かのメッセヌゞ。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

倉数にアクセスするにはブレヌクポむントを蚭定する必芁がありたす LEDControlQueueHandleにありたす 0x20000624 コヌドの実行を続けたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

その結果、アドレスで最初にストップが発生したす。 0x080057CA 関数を呌び出す前に osMailAlloc、次にアドレスで 0x08005806 関数を呌び出す前に osMailPut、しばらくしおから、アドレスに 0x08005BD4 (関数を呌び出す前に osメヌル取埗)、関数に属したす LEDs_task_entry (LED タスク)、぀たりタスクが切り替わり、LED タスクが制埡を受け取りたした。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

この簡単な方法で、RTOS タスクが盞互に察話する方法を確立できたす。

もちろん、実際にはタスクの盞互䜜甚はさらに耇雑になる可胜性がありたすが、゚ミュレヌタヌを䜿甚するず、この盞互䜜甚の远跡の手間が軜枛されたす。

ここで ゚ミュレヌタの起動ず IDA Pro ずの察話の短いビデオをご芧ください。

Radare2 で起動

Radare2 のような䞇胜ツヌルを無芖するこずはできたせん。

r2 を䜿甚しお゚ミュレヌタに接続するには、コマンドは次のようになりたす。

radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf

珟圚起動可胜です (dc) し、実行を䞀時停止したす (Ctrl+C)。

残念ながら、珟時点では、r2 にはハヌドりェア gdb サヌバヌずメモリ レむアりトの操䜜時に問題があり、このためブレヌクポむントずステップが機胜したせん (コマンド ds。 この問題がすぐに修正されるこずを願っおいたす。

Eclipse で実行する

゚ミュレヌタを䜿甚するオプションの XNUMX ぀は、開発䞭のデバむスのファヌムりェアをデバッグするこずです。 わかりやすくするために、Rhino ファヌムりェアも䜿甚したす。 ファヌムりェアの゜ヌスをダりンロヌドできたす 故に.

セットの Eclipse を IDE ずしお䜿甚したす。 STM32甚システムワヌクベンチ.

゚ミュレヌタが Eclipse でコンパむルされたファヌムりェアを盎接ロヌドするには、パラメヌタを远加する必芁がありたす。 firmware=null ゚ミュレヌタ起動コマンドに次のように入力したす。

binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28

デバッグ構成のセットアップ

Eclipse でメニュヌを遞択したす 実行 - デバッグ構成... 開いたりィンドりのセクションで GDB ハヌドりェアのデバッグ 新しい構成を远加し、「メむン」タブでデバッグ甚の珟圚のプロゞェクトずアプリケヌションを指定する必芁がありたす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

「デバッガヌ」タブで、GDB コマンドを指定する必芁がありたす。
${openstm32_compiler_path}arm-none-eabi-gdb

たた、GDB サヌバヌに接続するためのパラメヌタヌ (ホストずポヌト) も入力したす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

「スタヌトアップ」タブで、次のパラメヌタを指定する必芁がありたす。

  • チェックボックスを有効にする 画像を読み蟌む (アセンブルされたファヌムりェア むメヌゞが゚ミュレヌタにロヌドされるように);
  • チェックボックスを有効にする シンボルをロヌドする;
  • 起動コマンドを远加したす。 set $pc = *0x08000004 (PC レゞスタをアドレスのメモリの倀に蚭定したす) 0x08000004 - アドレスはそこに保存されたす リセットハンドラ).

泚意、Eclipse からファヌムりェア ファむルをダりンロヌドしたくない堎合は、オプション 画像を読み蟌む О コマンドを実行する 瀺す必芁はありたせん。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

[デバッグ] をクリックするず、デバッガヌ モヌドで䜜業できるようになりたす。

  • ステップバむステップのコヌド実行
    猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する
  • ブレヌクポむントずの察話
    猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

泚意. Eclipse には、うヌん...いく぀かの癖がありたす...そしお、それらず共存しなければなりたせん。 たずえば、デバッガの起動時に「"0x0" に䜿甚できる゜ヌスがありたせん」ずいうメッセヌゞが衚瀺された堎合は、ステップ コマンド (F5) を実行したす。

猫の䞭のサむ - Kopycat ゚ミュレヌタヌでファヌムりェアを実行する

代わりに、結論の

ネむティブ コヌドの゚ミュレヌションは非垞に興味深いものです。 デバむス開発者は、実際のデバむスを䜿甚せずにファヌムりェアをデバッグできるようになりたす。 研究者にずっお、これは、デバむスがあっおも垞に可胜であるずは限らない動的コヌド分析を実行する機䌚です。

私たちは、䟿利で適床にシンプルで、セットアップず実行に倚くの劎力ず時間がかからないツヌルを専門家に提䟛したいず考えおいたす。

ハヌドりェア ゚ミュレヌタを䜿甚した経隓に぀いおコメントに曞き蟌んでください。 ぜひご議論ください。ご質問には喜んでお答えいたしたす。

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

゚ミュレヌタを䜕に䜿甚したすか?

  • ファヌムりェアを開発デバッグしたす

  • ファヌムりェアを研究䞭です

  • ゲヌムを起動したす (Dendi、Sega、PSP)

  • 他に䜕かコメントに曞いおください

7 人のナヌザヌが投祚したした。 2名のナヌザヌが棄暩した。

ネむティブ コヌドを゚ミュレヌトするためにどの゜フトりェアを䜿甚したすか?

  • QEMU

  • ナニコヌン゚ンゞン

  • プロテりス

  • 他に䜕かコメントに曞いおください

6 人のナヌザヌが投祚したした。 2名のナヌザヌが棄暩した。

䜿甚しおいる゚ミュレヌタで改善したい点は䜕ですか?

  • スピヌドが欲しい

  • セットアップ/起動を簡単にしたい

  • ゚ミュレヌタず察話するためのオプション (API、フック) がもっず欲しい

  • すべおに満足しおいたす

  • 他に䜕かコメントに曞いおください

8 人のナヌザヌが投祚したした。 1 ナヌザヌが棄暩したした。

出所 habr.com

コメントを远加したす