Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Görüşün bir hissəsi olaraq 0x0A DC7831 DEF CON Nijni Novqorod Fevralın 16-da biz ikili kod emulyasiyasının əsas prinsipləri və öz inkişafımız - hardware platforma emulyatoru haqqında hesabat təqdim etdik. surətçi.

Bu yazıda biz cihazın proshivka proqramını emulyatorda necə işə salacağımızı, sazlayıcı ilə qarşılıqlı əlaqəni nümayiş etdirəcəyik və mikroproqramın kiçik dinamik təhlilini aparacağıq.

Prehistorya

Uzun müddət əvvəl uzaq bir qalaktikada

Bir neçə il əvvəl laboratoriyamızda bir cihazın proqram təminatının araşdırılmasına ehtiyac var idi. Firmware sıxılmış və yükləyici ilə açılmışdır. O, bunu çox mürəkkəb bir şəkildə etdi, yaddaşdakı məlumatları bir neçə dəfə dəyişdirdi. Firmware özü daha sonra periferiya ilə aktiv şəkildə qarşılıqlı əlaqədə oldu. Və bütün bunlar MIPS nüvəsində.

Obyektiv səbəblərə görə mövcud emulyatorlar bizə uyğun gəlmədi, lakin biz yenə də kodu işə salmaq istədik. Sonra öz emulyatorumuzu yaratmağa qərar verdik, bu, minimumu yerinə yetirəcək və əsas proqram təminatını açmağa imkan verəcəkdir. Biz bunu sınadıq və nəticə verdi. Fikirləşdik ki, əsas proqram təminatını da yerinə yetirmək üçün periferik qurğular əlavə etsək nə olacaq? Çox zərər vermədi - və o da işlədi. Yenidən düşündük və tam hüquqlu bir emulyator hazırlamaq qərarına gəldik.

Nəticə kompüter sistemlərinin emulyatoru oldu surətçi.

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın
Niyə Kopycat?

Söz oyunu var.

  1. kopik (İngilis, isim [ˈkɒpɪkæt]) - təqlid edən, təqlid edən
  2. pişik (İngilis, isim [ˈkæt]) - pişik, pişik - layihənin yaradıcılarından birinin sevimli heyvanı
  3. “K” hərfi Kotlin proqramlaşdırma dilindəndir

surətçi

Emulator yaratarkən çox xüsusi məqsədlər qoyuldu:

  • tez yeni periferik qurğular, modullar, prosessor nüvələri yaratmaq imkanı;
  • müxtəlif modullardan virtual cihazı yığmaq imkanı;
  • virtual cihazın yaddaşına hər hansı ikili məlumatı (firmware) yükləmək imkanı;
  • snapshots ilə işləmək bacarığı (sistem vəziyyətinin anlıq görüntüləri);
  • quraşdırılmış sazlayıcı vasitəsilə emulyatorla qarşılıqlı əlaqə qurmaq imkanı;
  • inkişaf üçün gözəl müasir dil.

Nəticədə, Kotlin həyata keçirmək üçün seçildi, avtobus arxitekturası (bu, modulların bir-biri ilə virtual məlumat avtobusları vasitəsilə əlaqə saxlamasıdır), cihazın təsviri formatı kimi JSON və sazlayıcı ilə qarşılıqlı əlaqə üçün protokol kimi GDB RSP.

İnkişaf iki ildən bir qədər artıqdır ki, davam edir və fəal şəkildə davam edir. Bu müddət ərzində MIPS, x86, V850ES, ARM və PowerPC prosessor nüvələri tətbiq olundu.

Layihə böyüyür və onu daha geniş ictimaiyyətə təqdim etməyin vaxtıdır. Layihənin ətraflı təsvirini daha sonra edəcəyik, lakin hələlik Kopycat istifadəsinə diqqət yetirəcəyik.

Ən səbirsizlər üçün emulyatorun promo versiyasını buradan yükləmək olar əlaqə.

Emulatorda kərgədan

Xatırladaq ki, daha əvvəl SMARTRHINO-2018 konfransı üçün tərs mühəndislik bacarıqlarının öyrədilməsi üçün “Rhinoceros” test cihazı yaradılmışdı. Statik proqram təminatının təhlili prosesi burada təsvir edilmişdir Bu məqalə.

İndi "dinamiklər" əlavə etməyə və emulyatorda proqram təminatını işə salmağa çalışaq.

Bizə lazımdır:
1) Java 1.8
2) Python və modul Cep emulator daxilində Python istifadə etmək. Siz Windows üçün WHL modulu Jep qura bilərsiniz buradan yükləyin.

Windows üçün:
1) com0com
2) PuTTY

Linux üçün:
1) socat

Siz GDB müştərisi kimi Eclipse, IDA Pro və ya radare2-dən istifadə edə bilərsiniz.

Necə işləyir?

Emulatorda proqram təminatını yerinə yetirmək üçün real cihazın analoqu olan virtual cihazı “yığmaq” lazımdır.

Həqiqi cihaz ("kərgədan") blok diaqramda göstərilə bilər:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Emulator modul quruluşa malikdir və son virtual cihaz JSON faylında təsvir edilə bilər.

JSON 105 xətləri

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

Parametrə diqqət yetirin Firmware bölmə params virtual cihaza proqram təminatı kimi yüklənə bilən faylın adıdır.

Virtual cihaz və onun əsas əməliyyat sistemi ilə qarşılıqlı əlaqəsi aşağıdakı diaqramla göstərilə bilər:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Emulatorun hazırkı sınaq nümunəsi əsas OS-nin COM portları ilə qarşılıqlı əlaqəni əhatə edir (Bluetooth modulu üçün UART və UART debug). Bunlar cihazların qoşulduğu real portlar və ya virtual COM portları ola bilər (bunun üçün sizə sadəcə lazımdır com0com/socat).

Hal-hazırda emulyatorla xaricdən qarşılıqlı əlaqə qurmağın iki əsas yolu var:

  • GDB RSP protokolu (müvafiq olaraq, bu protokolu dəstəkləyən alətlər Eclipse / IDA / radare2);
  • daxili emulyator əmr xətti (Argparse və ya Python).

Virtual COM portları

Terminal vasitəsilə yerli maşındakı virtual cihazın UART ilə qarşılıqlı əlaqə yaratmaq üçün bir cüt əlaqəli virtual COM portu yaratmalısınız. Bizim vəziyyətimizdə bir port emulyator tərəfindən, ikincisi isə terminal proqramı (PuTTY və ya ekran) tərəfindən istifadə olunur:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

com0com istifadə edərək

Virtual COM portları com0com dəstindəki quraşdırma yardım proqramı ilə konfiqurasiya edilir (konsol versiyası - C:Proqram Faylları (x86)com0comsetupс.exe, və ya GUI versiyası - C: Proqram Faylları (x86)com0comsetupg.exe):

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Qutuları yoxlayın bufer aşmasını aktivləşdirin bütün yaradılmış virtual portlar üçün, əks halda emulyator COM portundan cavab gözləyəcək.

socat istifadə

UNIX sistemlərində virtual COM portları emulyator tərəfindən avtomatik olaraq socat yardım proqramından istifadə etməklə yaradılır; bunun üçün emulyatoru işə salarkən port adında prefiksi göstərmək kifayətdir. socat:.

Daxili komanda xətti interfeysi (Argparse və ya Python)

Kopycat bir konsol tətbiqi olduğundan, emulator onun obyektləri və dəyişənləri ilə qarşılıqlı əlaqə üçün iki komanda xətti interfeysi variantını təqdim edir: Argparse və Python.

Argparse Kopycat-da qurulmuş bir CLI-dir və həmişə hamı üçün əlçatandır.

Alternativ CLI Python tərcüməçisidir. Onu istifadə etmək üçün Jep Python modulunu quraşdırmalı və emulyatoru Python ilə işləmək üçün konfiqurasiya etməlisiniz (istifadəçinin əsas sistemində quraşdırılmış Python tərcüməçisindən istifadə olunacaq).

Python modulunun quraşdırılması Jep

Linux altında Jep pip vasitəsilə quraşdırıla bilər:

pip install jep

Jep-i Windows-da quraşdırmaq üçün əvvəlcə Windows SDK-nı və müvafiq Microsoft Visual Studio proqramını quraşdırmalısınız. Biz sizin üçün bir az asanlaşdırdıq və WHL qurur Windows üçün Python-un cari versiyaları üçün JEP, beləliklə modul fayldan quraşdırıla bilər:

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

Jep-in quraşdırılmasını yoxlamaq üçün əmr satırında işləməlisiniz:

python -c "import jep"

Cavab olaraq aşağıdakı mesaj alınmalıdır:

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

Sisteminiz üçün emulator toplu faylında (copycat.bat - Windows üçün, surətçi - Linux üçün) parametrlər siyahısına DEFAULT_JVM_OPTS əlavə parametr əlavə edin Djava.library.path — orada quraşdırılmış Jep moduluna gedən yol olmalıdır.

Windows üçün nəticə belə bir xətt olmalıdır:

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

Kopycat işə salınır

Emulator konsol JVM proqramıdır. Başlatma əməliyyat sisteminin əmr xətti skripti (sh/cmd) vasitəsilə həyata keçirilir.

Windows altında işləmək üçün əmr:

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

Socat yardım proqramından istifadə edərək Linux altında işləmək əmri:

./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 serverinə daxil olmaq üçün açıq olacaq TCP portu;
  • -n rhino — əsas sistem modulunun adı (yığılmış qurğu);
  • -l user — əsas modulu axtarmaq üçün kitabxananın adı;
  • -y library — cihaza daxil olan modulları axtarmaq yolu;
  • firmwarerhino_pass.bin — proqram təminatı faylına gedən yol;
  • COM26 və COM28 virtual COM portlarıdır.

Nəticə olaraq, bir sorğu göstərilir Python > (Və ya 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 ilə qarşılıqlı əlaqə

Testi sadələşdirmək üçün biz Rhino proqram təminatından IDA-da təhlil üçün mənbə faylı kimi istifadə edirik ELF faylı (meta məlumat orada saxlanılır).

Siz həmçinin meta məlumat olmadan əsas proqram təminatından istifadə edə bilərsiniz.

IDA Pro-da Kopycat-ı işə saldıqdan sonra Debugger menyusunda elementə keçin "Sazlayıcıya keçin..."Və seçin"Uzaqdan GDB sazlayıcı". Sonra, əlaqəni qurun: menyu Sazlayıcı - Proses seçimləri...

Dəyərləri təyin edin:

  • Tətbiq - istənilən dəyər
  • Host adı: 127.0.0.1 (və ya Kopycat-ın işlədiyi uzaq maşının IP ünvanı)
  • Port: 23946

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

İndi sazlama düyməsi əlçatan olur (F9 düyməsi):

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Emulatorda sazlama moduluna qoşulmaq üçün üzərinə klikləyin. IDA sazlama rejiminə keçir, əlavə pəncərələr əlçatan olur: registrlər, yığın haqqında məlumat.

İndi sazlayıcının bütün standart xüsusiyyətlərindən istifadə edə bilərik:

  • təlimatların addım-addım icrası (İçəri girin и Üstünə addımlayın — müvafiq olaraq F7 və F8 düymələri);
  • icraya başlamaq və dayandırmaq;
  • həm kod, həm də verilənlər üçün kəsilmə nöqtələrinin yaradılması (F2 düyməsi).

Sazlayıcıya qoşulmaq firmware kodunu işə salmaq demək deyil. Cari icra mövqeyi ünvan olmalıdır 0x08006A74 - funksiyanın başlanğıcı Reset_Handler. Siyahını aşağı sürüşdürsəniz, funksiya çağırışını görə bilərsiniz Elanlar . Kursoru bu sətirdə yerləşdirə bilərsiniz (ünvan 0x08006ABE) və əməliyyatı yerinə yetirin Kursor qədər işləyin (F4 düyməsi).

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Sonra, funksiyaya daxil olmaq üçün F7 düyməsini sıxa bilərsiniz Elanlar .

Əgər əmri icra etsəniz Prosesi davam etdirin (F9 düyməsi), sonra bir düymə ilə “Lütfən gözləyin” pəncərəsi görünəcək dayandırmaq:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Basdığınız zaman dayandırmaq proshivka kodunun icrası dayandırılır və onun kəsildiyi koddakı eyni ünvandan davam etdirilə bilər.

Kodu icra etməyə davam etsəniz, virtual COM portlarına qoşulmuş terminallarda aşağıdakı sətirləri görəcəksiniz:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

“Dövlət bypass” xəttinin olması virtual Bluetooth modulunun istifadəçinin COM portundan məlumat qəbulu rejiminə keçdiyini göstərir.

İndi Bluetooth terminalında (şəkildə COM29) Rhino protokoluna uyğun əmrlər daxil edə bilərsiniz. Məsələn, "MEOW" əmri "mur-mur" sətirini Bluetooth terminalına qaytaracaq:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Məni tam təqlid etmə

Emulator qurarkən, müəyyən bir cihazın təfərrüat / emulyasiya səviyyəsini seçə bilərsiniz. Məsələn, Bluetooth modulu müxtəlif yollarla təqlid edilə bilər:

  • cihaz tam əmrlər dəsti ilə tam təqlid edilir;
  • AT əmrləri emulyasiya edilir və məlumat axını əsas sistemin COM portundan qəbul edilir;
  • virtual cihaz məlumatların real cihaza tam yönləndirilməsini təmin edir;
  • həmişə "OK" qaytaran sadə stub kimi.

Emulatorun cari versiyası ikinci yanaşmadan istifadə edir - virtual Bluetooth modulu konfiqurasiyanı həyata keçirir, bundan sonra o, əsas sistemin COM portundan emulyatorun UART portuna məlumatların "proxy" rejiminə keçir.

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Periferiyanın hansısa hissəsi həyata keçirilmədiyi halda kodun sadə cihazlaşdırılmasının mümkünlüyünü nəzərdən keçirək. Məsələn, məlumatların DMA-ya ötürülməsinə nəzarət etmək üçün cavabdeh olan taymer yaradılmayıbsa (yoxlama funksiyada aparılır) ws2812b_waitünvanında yerləşir 0x08006840), onda proqram təminatı həmişə bayrağın sıfırlanmasını gözləyəcək məşğulünvanında yerləşir 0x200004C4DMA məlumat xəttinin doldurulmasını göstərir:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Bayrağı əl ilə sıfırlamaqla bu vəziyyətdən çıxa bilərik məşğul quraşdırdıqdan dərhal sonra. IDA Pro-da siz Python funksiyası yarada və onu kəsmə nöqtəsində çağıra və bayrağa 1 dəyərini yazdıqdan sonra kəsilmə nöqtəsinin özünü kodda qoya bilərsiniz. məşğul.

Breakpoint handler

Əvvəlcə IDA-da Python funksiyasını yaradaq. Menyu Fayl - Skript əmri...

Soldakı siyahıya yeni bir parça əlavə edin, ona ad verin (məsələn, BPT),
Sağdakı mətn sahəsinə funksiya kodunu daxil edin:

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

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Bundan sonra basırıq qaçış və skript pəncərəsini bağlayın.

İndi koda keçək 0x0800688A, kəsmə nöqtəsi təyin edin (F2 düyməsi), onu redaktə edin (kontekst menyusu Kəsmə nöqtəsini redaktə edin...), skript növünü Python-a təyin etməyi unutmayın:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın
Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Əgər cari bayraq dəyəri məşğul 1-ə bərabərdir, onda siz funksiyanı yerinə yetirməlisiniz skip_dma skript xəttində:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Proqram təminatını icra üçün işə salırsınızsa, o zaman kəsilmə nöqtəsi idarəedici kodunun işə salınması IDA pəncərəsində görünə bilər. Buraxılış xətt üzrə Skipping wait ws2812.... İndi proqram təminatı bayrağın sıfırlanmasını gözləməyəcək məşğul.

Emulator ilə qarşılıqlı əlaqə

Təqlid naminə təqlid, çətin ki, həzz və sevinc doğursun. Emulator tədqiqatçıya yaddaşdakı məlumatları görməyə və ya iplərin qarşılıqlı əlaqəsini qurmağa kömək edərsə, daha maraqlıdır.

RTOS tapşırıqları arasında qarşılıqlı əlaqənin dinamik şəkildə necə qurulacağını sizə göstərəcəyik. Əgər kodu işlədirsə, əvvəlcə onun icrasını dayandırmalısınız. Funksiyaya keçsəniz bluetooth_task_girişi "LED" əmrinin emal şöbəsinə (ünvan 0x080057B8), onda siz əvvəlcə yaradılan və sonra sistem növbəsinə göndərilənləri görə bilərsiniz ledControlQueueHandle bəzi mesaj.

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Dəyişənə daxil olmaq üçün kəsmə nöqtəsi təyin etməlisiniz ledControlQueueHandleünvanında yerləşir 0x20000624 və kodu icra etməyə davam edin:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Nəticədə dayanma ilk olaraq ünvanda olacaq 0x080057CA funksiyanı çağırmadan əvvəl osMailAlloc, sonra ünvanda 0x08005806 funksiyanı çağırmadan əvvəl osMailPut, sonra bir müddət sonra - ünvana 0x08005BD4 (funksiyaya zəng etməzdən əvvəl osMailGet), funksiyasına aid olan leds_task_entry (LED-task), yəni tapşırıqlar dəyişdirildi və indi LED-tapşırıq nəzarəti aldı.

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Bu sadə yolla siz RTOS tapşırıqlarının bir-biri ilə necə qarşılıqlı əlaqədə olduğunu müəyyən edə bilərsiniz.

Əlbəttə ki, reallıqda tapşırıqların qarşılıqlı əlaqəsi daha mürəkkəb ola bilər, lakin emulyatordan istifadə etməklə bu qarşılıqlı əlaqəni izləmək daha az zəhmət tələb edir.

Burada Siz emulyatorun işə salınması və IDA Pro ilə qarşılıqlı əlaqəsi haqqında qısa videoya baxa bilərsiniz.

Radare2 ilə işə salın

Radare2 kimi universal bir alətə laqeyd qala bilməzsiniz.

R2 istifadə edərək emulyatora qoşulmaq üçün əmr belə görünür:

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

İndi işə salın (dc) və icraya fasilə verin (Ctrl+C).

Təəssüf ki, hazırda r2-də hardware gdb server və yaddaş tərtibatı ilə işləyərkən problemlər var; buna görə kəsilmə nöqtələri və addımlar işləmir (komanda). ds). Ümid edirik ki, bu, tezliklə düzələcək.

Eclipse ilə işləyir

Emulatordan istifadə variantlarından biri hazırlanmaqda olan cihazın proshivka proqramının debug edilməsidir. Aydınlıq üçün biz Rhino proqram təminatından da istifadə edəcəyik. Firmware mənbələrini yükləyə bilərsiniz buradan.

Biz IDE kimi dəstdən Eclipse-dən istifadə edəcəyik STM32 üçün System Workbench.

Emulatorun birbaşa Eclipse-də tərtib edilmiş proqram təminatını yükləməsi üçün parametr əlavə etməlisiniz. firmware=null emulyatorun işə salınması əmrinə:

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

Sazlama konfiqurasiyasının qurulması

Eclipse-də menyunu seçin Çalıştır - Sazlama Konfiqurasiyaları... Açılan pəncərədə, bölmədə GDB Hardware Debugging yeni bir konfiqurasiya əlavə etməlisiniz, sonra "Əsas" sekmesinde cari layihəni və sazlama üçün tətbiqi göstərin:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

"Debugger" sekmesinde GDB əmrini təyin etməlisiniz:
${openstm32_compiler_path}arm-none-eabi-gdb

Həm də GDB serverinə (host və port) qoşulmaq üçün parametrləri daxil edin:

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

"Başlanğıc" sekmesinde aşağıdakı parametrləri göstərməlisiniz:

  • onay qutusunu aktivləşdirin Şəkli yükləyin (belə ki, yığılmış proqram təminatının görüntüsü emulyatora yüklənsin);
  • onay qutusunu aktivləşdirin Simvolları yükləyin;
  • işə salma əmri əlavə edin: set $pc = *0x08000004 (Kompüter registrini ünvandakı yaddaşdan qiymətə təyin edin 0x08000004 - ünvan orada saxlanılır ResetHandler).

Xahiş edirik, Firmware faylını Eclipse-dən yükləmək istəmirsinizsə, seçimlər Şəkli yükləyin и Əmrləri işə salın göstərməyə ehtiyac yoxdur.

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Debug düyməsini kliklədikdən sonra siz sazlama rejimində işləyə bilərsiniz:

  • addım-addım kodun icrası
    Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın
  • kəsilmə nöqtələri ilə qarşılıqlı əlaqə
    Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Qeyd. Eclipse, hmm... bəzi qəribəliklər var... və siz onlarla yaşamaq məcburiyyətindəsiniz. Məsələn, sazlayıcını işə salarkən “0x0″ üçün mənbə yoxdur” mesajı görünürsə, Addım əmrini yerinə yetirin (F5)

Pişik içərisində kərgədan - Kopycat emulyatorunda proqram təminatını işə salın

Bunun əvəzinə bir nəticəyə

Doğma kodu təqlid etmək çox maraqlı bir şeydir. Bir cihaz tərtibatçısının real cihaz olmadan proqram təminatını sazlaması mümkün olur. Tədqiqatçı üçün bu, hətta bir cihazla belə həmişə mümkün olmayan dinamik kod təhlili aparmaq imkanıdır.

Biz mütəxəssisləri rahat, orta dərəcədə sadə və qurmaq və işə salmaq çox səy və vaxt tələb etməyən alətlə təmin etmək istəyirik.

Aparat emulyatorlarından istifadə təcrübəniz haqqında şərhlərdə yazın. Sizi müzakirəyə dəvət edirik və suallara cavab verməkdən məmnun olarıq.

Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. Daxil olunxahiş edirəm.

Emulatordan nə üçün istifadə edirsiniz?

  • Mikroproqram hazırlayıram (debug).

  • Mən proqram təminatını araşdırıram

  • Oyunları işə salıram (Dendi, Sega, PSP)

  • başqa bir şey (şərhlərdə yazın)

7 istifadəçi səs verib. 2 istifadəçi bitərəf qalıb.

Doğma kodu təqlid etmək üçün hansı proqram təminatından istifadə edirsiniz?

  • QEMU

  • Unicorn mühərriki

  • Proteus

  • başqa bir şey (şərhlərdə yazın)

6 istifadəçi səs verib. 2 istifadəçi bitərəf qalıb.

İstifadə etdiyiniz emulyatorda nəyi təkmilləşdirmək istərdiniz?

  • Mən sürət istəyirəm

  • Quraşdırma/başlatma asanlığı istəyirəm

  • Emulator ilə qarşılıqlı əlaqə üçün daha çox seçim istəyirəm (API, qarmaqlar)

  • Mən hər şeydən razıyam

  • başqa bir şey (şərhlərdə yazın)

8 istifadəçi səs verib. 1 istifadəçi bitərəf qaldı.

Mənbə: www.habr.com

Добавить комментарий