Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Mar phàirt den choinneamh 0x0A DC7831 DEF CON Nizhny Novgorod Air 16 Gearran, thug sinn seachad aithisg air na prionnsapalan bunaiteach ann an aithris còd binary agus an leasachadh againn fhèin - emuladair àrd-ùrlar bathar-cruaidh Leth-bhreac.

Anns an aiste seo bidh sinn a 'toirt cunntas air mar a ruith an inneal firmware ann an Emulator, a' sealltainn eadar-obrachadh leis an debugger, agus a 'dèanamh mion-sgrùdadh beag fiùghantach air a' firmware.

ro-eachdraidheil

O chionn fhada ann an galaxy fada air falbh

Dà bhliadhna air ais anns an obair-lann againn bha feum air sgrùdadh a dhèanamh air firmware inneal. Chaidh am firmware a dhlùthadh agus a dhì-phapadh le bootloader. Rinn e seo ann an dòigh gu math toinnte, ag atharrachadh an dàta mar chuimhneachan grunn thursan. Agus bha am firmware fhèin an uairsin ag eadar-obrachadh gu gnìomhach leis na peripherals. Agus seo uile air cridhe MIPS.

Airson adhbharan reusanta, cha robh na h-emuladairean a bha rim faighinn freagarrach dhuinn, ach bha sinn fhathast airson an còd a ruith. An uairsin chuir sinn romhainn an emuladair againn fhèin a dhèanamh, a dhèanadh an ìre as ìsle agus a leigeadh leinn am prìomh firmware a dhì-phapadh. Dh'fheuch sinn e agus dh'obraich e. Bha sinn a’ smaoineachadh, dè ma chuireas sinn peripherals ris gus am prìomh firmware a choileanadh cuideachd. Cha do ghoirtich e gu mòr - agus dh’ obraich e a-mach cuideachd. Smaoinich sinn a-rithist agus chuir sinn romhainn emuladair làn-chuimseach a dhèanamh.

Mar thoradh air an sin bha emuladair siostaman coimpiutair Leth-bhreac.

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat
Carson a tha Kopycat?

Tha dealbh-chluich air faclan.

  1. copcat (Beurla, ainmear [ˈkɒpɪkæt]) - imitator, imitator
  2. cat (Beurla, ainmear [ˈkæt]) - cat, cat - am beathach as fheàrr le fear de luchd-cruthachaidh a’ phròiseict
  3. Tha an litir “K” bhon chànan prògramaidh Kotlin

Leth-bhreac

Nuair a chaidh an emuladair a chruthachadh, chaidh amasan sònraichte a shuidheachadh:

  • an comas iomaill ùra, modalan, coraichean pròiseasar a chruthachadh gu luath;
  • an comas inneal brìgheil a chruinneachadh bho dhiofar mhodalan;
  • an comas dàta binary sam bith (firmware) a luchdachadh a-steach do chuimhne inneal brìgheil;
  • comas a bhith ag obair le snapshots (dealbhan de staid an t-siostam);
  • an comas eadar-obrachadh leis an emuladair tron ​​​​debugger togte;
  • cànan ùr-nodha math airson leasachadh.

Mar thoradh air an sin, chaidh Kotlin a thaghadh airson a bhuileachadh, ailtireachd nam busaichean (seo nuair a bhios modalan a’ conaltradh ri chèile tro bhusaichean dàta brìgheil), JSON mar chruth tuairisgeul an inneal, agus GDB RSP mar am pròtacal airson eadar-obrachadh leis an dì-bhugadair.

Tha leasachadh air a bhith a’ dol air adhart airson beagan is dà bhliadhna agus tha e a’ dol air adhart gu gnìomhach. Rè na h-ùine seo, chaidh coraichean pròiseasar MIPS, x86, V850ES, ARM, agus PowerPC a chuir an gnìomh.

Tha am pròiseact a’ fàs agus tha an t-àm ann a thaisbeanadh don mhòr-shluagh. Nì sinn tuairisgeul mionaideach air a 'phròiseact nas fhaide air adhart, ach airson a-nis cuiridh sinn fòcas air a bhith a' cleachdadh Kopycat.

Airson an fheadhainn as mì-fhoighidneach, faodar dreach promo den emuladair a luchdachadh sìos bho cheangal.

Rhino ann an emulator

Cuimhnichidh sinn na bu thràithe airson co-labhairt SMARTHINO-2018, chaidh inneal deuchainn “Rhinoceros” a chruthachadh airson sgilean innleadaireachd cùil a theagasg. Chaidh am pròiseas mion-sgrùdadh firmware statach a mhìneachadh ann an an artaigil seo.

A-nis feuchaidh sinn ri “luchd-labhairt” a chuir ris agus am firmware a ruith san emuladair.

Feumaidh sinn:
1) Java 1.8
2) Python agus modal jep gus Python a chleachdadh taobh a-staigh an emuladair. Faodaidh tu modal WHL Jep a thogail airson Windows luchdaich sìos an seo.

Airson Windows:
1) com0com
2) PuTTY

Airson Linux:
1) socat

Faodaidh tu Eclipse, IDA Pro no radare2 a chleachdadh mar neach-dèiligidh GDB.

Ciamar a dh'obraicheas e?

Gus firmware a dhèanamh anns an emuladair, feumar inneal brìgheil a “chruinneachadh”, a tha na analogue de fhìor inneal.

Faodar an fhìor inneal (“rhino”) a shealltainn anns an diagram bloca:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Tha structar modular aig an emuladair agus faodar an inneal brìgheil mu dheireadh a mhìneachadh ann am faidhle JSON.

JSON 105 sreath

{
  "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"]
  ]
}

Thoir aire don pharamadair firmware earrann paramadairean is e ainm faidhle a ghabhas luchdachadh a-steach do inneal brìgheil mar firmware.

Faodar an inneal brìgheil agus an eadar-obrachadh leis a’ phrìomh shiostam obrachaidh a riochdachadh leis an diagram a leanas:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Tha an eisimpleir deuchainn gnàthach den emuladair a’ toirt a-steach eadar-obrachadh le puirt COM den phrìomh OS (debug UART agus UART airson modal Bluetooth). Faodaidh iad sin a bhith nam fìor phuirt ris a bheil innealan ceangailte no puirt COM brìgheil (airson seo chan fheum thu ach com0com/socat).

An-dràsta tha dà phrìomh dhòigh air eadar-obrachadh leis an emuladair bhon taobh a-muigh:

  • protocol GDB RSP (a rèir sin, is e Eclipse / IDA / radare2 na h-innealan a tha a 'toirt taic don phròtacal seo);
  • loidhne-àithne emuladair a-staigh (Argparse no Python).

Mas-fhìor puirt COM

Gus eadar-obrachadh leis an UART de inneal brìgheil air an inneal ionadail tro inneal-crìochnachaidh, feumaidh tu paidhir de phuirt COM brìgheil co-cheangailte a chruthachadh. Anns a 'chùis againn, tha aon phort air a chleachdadh leis an emuladair, agus tha an dàrna fear air a chleachdadh le prògram deireannach (PuTTY no sgrion):

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

A’ cleachdadh com0com

Tha puirt mas-fhìor COM air an rèiteachadh a’ cleachdadh a’ ghoireas rèiteachaidh bhon phasgan com0com (dreach console - C: Faidhlichean a’ Phrògraim (x86) com0comsetupс.exe, no dreach GUI - C: Faidhlichean a’ Phrògraim (x86) com0comsetupg.exe):

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Thoir sùil air na bogsaichean comas a thoirt do thar-ruith bufair airson a h-uile port brìgheil a chaidh a chruthachadh, air neo fuirichidh an emuladair airson freagairt bhon phort COM.

A 'cleachdadh socat

Air siostaman UNIX, bidh puirt COM brìgheil air an cruthachadh gu fèin-ghluasadach leis an emuladair a’ cleachdadh an socat utility; gus seo a dhèanamh, dìreach sònraich an ro-leasachan ann an ainm a’ phuirt nuair a thòisicheas tu air an emuladair socat:.

Eadar-aghaidh loidhne-àithne a-staigh (Argparse no Python)

Leis gur e tagradh tòcan a th’ ann an Kopycat, tha an emuladair a’ toirt seachad dà roghainn eadar-aghaidh loidhne-àithne airson a bhith ag eadar-obrachadh leis na nithean agus na caochladairean aige: Argparse agus Python.

Is e CLI a th’ ann an Argparse a chaidh a thogail a-steach do Kopycat agus tha e an-còmhnaidh ri fhaighinn leis a h-uile duine.

Is e CLI eile an eadar-theangair Python. Gus a chleachdadh, feumaidh tu modal Jep Python a stàladh agus an emuladair a rèiteachadh gus obrachadh le Python (thèid an eadar-theangair Python a chuir a-steach air prìomh shiostam an neach-cleachdaidh a chleachdadh).

A’ stàladh modal Python Jep

Fo Linux Faodar Jep a chuir a-steach tro pip:

pip install jep

Gus Jep a stàladh air Windows, feumaidh tu an toiseach an SDK Windows agus an Microsoft Visual Studio co-fhreagarrach a stàladh. Tha sinn air a dhèanamh beagan nas fhasa dhut agus Bidh WHL a’ togail JEP airson dreachan gnàthach de Python airson Windows, gus an gabh am modal a chuir a-steach bhon fhaidhle:

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

Gus sgrùdadh a dhèanamh air stàladh Jep, feumaidh tu ruith air an loidhne-àithne:

python -c "import jep"

Bu chòir an teachdaireachd a leanas fhaighinn mar fhreagairt:

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

Ann am faidhle baidse an emuladair airson an t-siostam agad (leth-bhreac.bat - airson Windows, leth-bhreac - airson Linux) chun liosta de pharamadairean DEFAULT_JVM_OPTS cuir paramadair a bharrachd ris Djava.library.path - feumaidh an t-slighe chun mhodal Jep a chaidh a chuir a-steach a bhith ann.

Bu chòir an toradh airson Windows a bhith na loidhne mar seo:

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

A’ cur air bhog Kopycat

Tha an emuladair na thagradh tòcan JVM. Tha an cur air bhog air a dhèanamh tro sgriobt loidhne-àithne an t-siostaim obrachaidh (sh / cmd).

Òrdugh airson ruith fo Windows:

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

Òrdugh airson ruith fo Linux a’ cleachdadh an goireas socat:

./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 - port TCP a bhios fosgailte airson faighinn a-steach don fhrithealaiche GDB;
  • -n rhino - ainm modal a’ phrìomh shiostam (inneal cruinnichte);
  • -l user - ainm an leabharlainn gus am prìomh mhodal a lorg;
  • -y library - slighe gu bhith a’ lorg mhodalan a tha san inneal;
  • firmwarerhino_pass.bin - slighe gu faidhle firmware;
  • Tha COM26 agus COM28 nam puirt COM brìgheil.

Mar thoradh air an sin, thèid pasgan a thaisbeanadh Python > (no 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 >

Eadar-obrachadh le IDA Pro

Gus deuchainn a dhèanamh nas sìmplidhe, bidh sinn a’ cleachdadh firmware Rhino mar am faidhle tùsail airson mion-sgrùdadh ann an IDA san fhoirm faidhle ELF (tha fiosrachadh meta air a stòradh an sin).

Faodaidh tu cuideachd am prìomh firmware a chleachdadh gun fhiosrachadh meta.

Às deidh dhut Kopycat a chuir air bhog ann an IDA Pro, anns a ’chlàr Debugger rachaibh chun rud“Atharraich dì-bhugadair…" agus tagh "Debugger GDB aig astar". An ath rud, stèidhich an ceangal: clàr-taice Debugger - Roghainnean pròiseas…

Suidhich na luachan:

  • Iarrtas - luach sam bith
  • Ainm an òstair: 127.0.0.1 (no seòladh IP an inneal iomallach far a bheil Kopycat a 'ruith)
  • Port: 23946

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

A-nis bidh am putan deasbaid ri fhaighinn (iuchair F9):

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Cliog air gus ceangal ris a’ mhodal debugger san emuladair. Bidh IDA a’ dol a-steach don mhodh deasbaid, bidh uinneagan a bharrachd rim faighinn: fiosrachadh mu chlàran, mun chruaich.

A-nis is urrainn dhuinn na feartan àbhaisteach uile den debugger a chleachdadh:

  • cur an gnìomh stiùireadh ceum air cheum (Gabh a-steach и Ceum thairis - iuchraichean F7 agus F8, fa leth);
  • tòiseachadh agus stad a chur gu bàs;
  • cruthachadh puingean brisidh airson an dà chuid còd agus dàta (iuchair F2).

Chan eil ceangal ri dì-bhugadair a’ ciallachadh a bhith a’ ruith a’ chòd firmware. Feumaidh an suidheachadh cur gu bàs a bhith na sheòladh 0x08006A74 - toiseach gnìomh Ath-shuidheachadh_Handler. Ma sgrolaicheas tu sìos an liostadh, chì thu a’ ghairm gnìomh prìomh. Faodaidh tu an cursair a chuir air an loidhne seo (seòladh 0x08006ABE) agus an obair a dhèanamh Ruith gus an cursor (iuchair F4).

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

An uairsin, faodaidh tu briogadh air F7 gus a dhol a-steach don ghnìomh prìomh.

Ma ruitheas tu an àithne Lean air adhart leis a 'phròiseas (Iuchrach F9), an uairsin nochdaidh an uinneag “Feuch an fuirich thu” le aon phutan A 'crochadh air:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Nuair a bhrùthas tu A 'crochadh air tha cur an gnìomh a’ chòd firmware air a chuir dheth agus faodar a leantainn bhon aon sheòladh sa chòd far an deach stad a chuir air.

Ma leanas tu a’ cur a’ chòd an gnìomh, chì thu na loidhnichean a leanas anns na cinn-uidhe ceangailte ris na puirt COM mas-fhìor:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Tha làthaireachd na loidhne “seach-rathad stàite” a’ nochdadh gu bheil am modal brìgheil Bluetooth air atharrachadh gu modh faighinn dàta bho phort COM an neach-cleachdaidh.

A-nis anns an inneal Bluetooth (COM29 san dealbh) faodaidh tu òrdughan a chuir a-steach a rèir protocol Rhino. Mar eisimpleir, tillidh an àithne “MEOW” an sreang “mur-mur” chun cheann-uidhe Bluetooth:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Dèan aithris orm nach eil gu tur

Nuair a bhios tu a’ togail emuladair, faodaidh tu ìre mion-fhiosrachaidh / aithris inneal sònraichte a thaghadh. Mar eisimpleir, faodar am modal Bluetooth aithris ann an diofar dhòighean:

  • tha an inneal làn atharrais le seata iomlan de òrdughan;
  • Thathas ag aithris air òrdughan AT, agus gheibhear an sruth dàta bho phort COM a’ phrìomh shiostam;
  • bidh an inneal brìgheil a’ toirt seachad ath-stiùireadh dàta iomlan chun fhìor inneal;
  • mar stub sìmplidh a bhios an-còmhnaidh a’ tilleadh “OK”.

Bidh an dreach gnàthach den emuladair a ’cleachdadh an dàrna dòigh-obrach - bidh am modal brìgheil Bluetooth a’ coileanadh rèiteachadh, às deidh sin bidh e ag atharrachadh gu modh dàta “proxying” bho phort COM den phrìomh shiostam gu port UART an emuladair.

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Beachdaichidh sinn air comasachd ionnstramaid sìmplidh den chòd gun fhios nach tèid pàirt den iomall a chuir an gnìomh. Mar eisimpleir, mura deach timer le uallach airson smachd a chumail air gluasad dàta gu DMA a chruthachadh (tha an sgrùdadh air a dhèanamh anns a’ ghnìomh ws2812b_feitheamhsuidhichte aig 0x08006840), an uairsin bidh am firmware an-còmhnaidh a’ feitheamh ris a’ bhratach ath-shuidheachadh trangsuidhichte aig 0x200004C4a tha a’ sealltainn còmhnaidh air loidhne dàta DMA:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Is urrainn dhuinn faighinn timcheall air an t-suidheachadh seo le bhith ag ath-shuidheachadh a’ bhratach le làimh trang dìreach às deidh a stàladh. Ann an IDA Pro, faodaidh tu gnìomh Python a chruthachadh agus a ghairm ann an àite brisidh, agus am briseadh fhèin a chuir sa chòd às deidh dhut an luach 1 a sgrìobhadh chun bhratach trang.

Inneal-làimhseachaidh brisidh

An toiseach, cruthaichidh sinn gnìomh Python ann an IDA. Clàr-taice Faidhle - Sgriobt àithne...

Cuir criomag ùr ris an liosta air an taobh chlì, thoir ainm dha (mar eisimpleir, BPT),
Anns an raon teacsa air an taobh cheart, cuir a-steach an còd gnìomh:

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

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Às deidh sin bidh sinn a 'bruthadh Run agus dùin uinneag an sgriobt.

A-nis rachamaid chun chòd aig 0x0800688A, suidhich puing-briseadh (iuchair F2), deasaich e (clàr co-theacsa Deasaich brisidh...), na dìochuimhnich an seòrsa sgriobt a shuidheachadh gu Python:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat
Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Ma tha luach na brataich làithreach trang co-ionann ri 1, bu chòir dhut an gnìomh a choileanadh sgiob_dma ann an loidhne an sgriobt:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Ma ruitheas tu am firmware airson a chuir gu bàs, chithear spionnadh a’ chòd làimhseachaidh brisidh ann an uinneag an IDA Species le loidhne Skipping wait ws2812.... A-nis cha bhith am firmware a’ feitheamh gus am bratach ath-shuidheachadh trang.

Eadar-obrachadh leis an emulator

Chan eil e coltach gum bi aithris air sgàth emulation ag adhbhrachadh toileachas agus toileachas. Tha e tòrr nas inntinniche ma tha an emuladair a 'cuideachadh an neach-rannsachaidh an dàta fhaicinn mar chuimhneachan no a' stèidheachadh eadar-obrachadh snàithleanan.

Seallaidh sinn dhut mar a stèidhicheas tu eadar-obrachadh eadar gnìomhan RTOS gu dinamach. Bu chòir dhut an toiseach stad a chur air coileanadh a’ chòd ma tha e a’ ruith. Ma thèid thu chun an gnìomh bluetooth_task_inntrigeadh gu meur giollachd an àithne “LED” (seòladh 0x080057B8), an uairsin chì thu dè a chaidh a chruthachadh an toiseach agus an uairsin a chuir gu ciudha an t-siostaim ledControlQueueHandle teachdaireachd air choireigin.

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Bu chòir dhut puing-briseadh a shuidheachadh gus faighinn chun chaochladair ledControlQueueHandlesuidhichte aig 0x20000624 agus lean ort a’ cur an gnìomh a’ chòd:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Mar thoradh air an sin, bidh an stad an toiseach aig an t-seòladh 0x080057CA mus cuir thu fios chun ghnìomh osMailAlloc, an uairsin aig an t-seòladh 0x08005806 mus cuir thu fios chun ghnìomh osMailPut, an uair sin an dèidh greis - chun an t-seòladh 0x08005BD4 (mus cuir thu fios chun ghnìomh osMailGet), a bhuineas don ghnìomh leds_task_entry (Tasc-LED), is e sin, thionndaidh na gnìomhan, agus a-nis fhuair an gnìomh LED smachd.

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

San dòigh shìmplidh seo faodaidh tu faighinn a-mach mar a bhios gnìomhan RTOS ag eadar-obrachadh le chèile.

Gu dearbh, ann an da-rìribh, faodaidh an eadar-obrachadh de ghnìomhan a bhith nas iom-fhillte, ach a 'cleachdadh emuladair, a' cumail sùil air an eadar-obrachadh seo a 'fàs nas lugha saothair.

an seo Faodaidh tu coimhead air bhidio goirid den emuladair a’ cur air bhog agus ag eadar-obrachadh le IDA Pro.

Cuir air bhog le Radare2

Chan urrainn dhut inneal cho uile-choitcheann a leigeil seachad mar Radare2.

Gus ceangal ris an emuladair a’ cleachdadh r2, bhiodh an àithne a’ coimhead mar seo:

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

Cur air bhog ri fhaighinn a-nis (dc) agus stad air coileanadh (Ctrl+C).

Gu mì-fhortanach, aig an àm seo, tha duilgheadasan aig r2 nuair a bhios iad ag obair leis an t-seirbheisiche bathar-cruaidh gdb agus cruth cuimhne; air sgàth seo, chan eil puingean-briseadh agus Ceumannan ag obair (òrdugh ds). Tha sinn an dòchas gun tèid seo a rèiteachadh a dh’ aithghearr.

A 'ruith le Eclipse

Is e aon de na roghainnean airson an emuladair a chleachdadh a bhith a’ dì-bhugachadh firmware an uidheim a thathar a’ leasachadh. Airson soilleireachd, cleachdaidh sinn am firmware Rhino cuideachd. Faodaidh tu na stòran firmware a luchdachadh sìos bho seo.

Cleachdaidh sinn Eclipse bhon t-seata mar IDE Siostam workbench airson STM32.

Gus an urrainn don emuladair firmware a chuir ri chèile gu dìreach ann an Eclipse a luchdachadh, feumaidh tu am paramadair a chuir ris firmware=null gu òrdugh cur air bhog an emuladair:

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

A 'suidheachadh rèiteachadh debug

Ann an Eclipse, tagh an clàr-taice Ruith - rèiteachaidhean Debug... Anns an uinneag a tha a’ fosgladh, anns an earrainn Debugging bathar-cruaidh GDB feumaidh tu rèiteachadh ùr a chuir ris, an uairsin air an taba “Prìomh” sònraich am pròiseact gnàthach agus an tagradh airson debugging:

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Air an taba “Debugger” feumaidh tu an àithne GDB a shònrachadh:
${openstm32_compiler_path}arm-none-eabi-gdb

Agus cuideachd cuir a-steach na crìochan airson ceangal ris an fhrithealaiche GDB (aoigheachd agus port):

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Air an tab "Startup", feumaidh tu na paramadairean a leanas a shònrachadh:

  • cuir an comas bogsa-dearbhaidh Dealbh a luchdadh (gus am bi an ìomhaigh firmware cruinnichte air a luchdachadh a-steach don emuladair);
  • cuir an comas bogsa-dearbhaidh Luchdaich a-nuas suaicheantasan;
  • cuir òrdugh tòiseachaidh ris: set $pc = *0x08000004 (suidhich an clàr PC chun luach bhon chuimhne aig an t-seòladh 0x08000004 - tha an seòladh air a stòradh an sin Ath-shuidheachadh Làimhseachadh).

Thoir aire, mura h-eil thu airson am faidhle firmware a luchdachadh sìos bho Eclipse, an uairsin na roghainnean Dealbh a luchdadh и Ruith òrdughan chan eil feum air comharrachadh.

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

Às deidh dhut briogadh air Debug, faodaidh tu obrachadh ann am modh debugger:

  • cur an gnìomh còd ceum air cheum
    Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat
  • eadar-obrachadh le puingean briste
    Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

thuirt. Tha, hmm ... aig Eclipse ... agus feumaidh tu fuireach còmhla riutha. Mar eisimpleir, ma nochdas an teachdaireachd “Chan eil stòr ri fhaighinn airson“ 0x0 ″ ”nuair a thòisicheas tu air an dì-bhugadair, cuir an gnìomh an àithne Ceum (F5)

Rhinoceros taobh a-staigh cat - ruith am firmware anns an emuladair Kopycat

An àite a bhith co-dhùnadh

Tha e gu math inntinneach a bhith ag aithris còd dùthchasach. Bidh e comasach do leasaiche inneal am firmware a dhì-cheadachadh às aonais inneal fìor. Airson neach-rannsachaidh, tha e na chothrom mion-sgrùdadh còd fiùghantach a dhèanamh, nach eil an-còmhnaidh comasach eadhon le inneal.

Tha sinn airson inneal a thoirt do eòlaichean a tha goireasach, meadhanach sìmplidh agus nach toir mòran oidhirp agus ùine airson a chuir air dòigh agus a ruith.

Sgrìobh anns na beachdan mun eòlas agad a’ cleachdadh emuladairean bathar-cruaidh. Tha sinn a’ toirt cuireadh dhut bruidhinn agus bidh sinn toilichte ceistean a fhreagairt.

Chan fhaod ach luchd-cleachdaidh clàraichte pàirt a ghabhail san sgrùdadh. Soidhnig a-steach, mas e do thoil e.

Carson a tha thu a’ cleachdadh an emulator?

  • Bidh mi a’ leasachadh firmware (debug).

  • Tha mi a' rannsachadh firmware

  • Bidh mi a’ cur air bhog geamannan (Dendi, Sega, PSP)

  • rudeigin eile (sgrìobh anns na beachdan)

Bhòt 7 neach-cleachdaidh. Cha do stad 2 neach-cleachdaidh.

Dè am bathar-bog a bhios tu a’ cleachdadh gus aithris a dhèanamh air còd dùthchasach?

  • QEMU

  • Einnsean aon-adharcach

  • Proteus

  • rudeigin eile (sgrìobh anns na beachdan)

Bhòt 6 neach-cleachdaidh. Cha do stad 2 neach-cleachdaidh.

Dè a bhiodh tu airson a leasachadh anns an emuladair a tha thu a’ cleachdadh?

  • Tha mi ag iarraidh luaths

  • Tha mi ag iarraidh suidheachadh / cur air bhog gu furasta

  • Tha mi ag iarraidh barrachd roghainnean airson eadar-obrachadh leis an emuladair (API, dubhan)

  • Tha mi toilichte leis a h-uile càil

  • rudeigin eile (sgrìobh anns na beachdan)

Bhòt 8 neach-cleachdaidh. Cha do stad 1 neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann