Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Toplantı kapsamında 0x0A DC7831 DEF CON Nijniy Novgorod 16 Şubat'ta ikili kod emülasyonunun temel ilkeleri ve kendi geliştirmemiz olan bir donanım platformu emülatörü hakkında bir rapor sunduk. Taklitçi.

Bu makalede, aygıt donanım yazılımının emülatörde nasıl çalıştırılacağını, hata ayıklayıcı ile etkileşimin nasıl gösterileceğini ve aygıt yazılımının küçük bir dinamik analizinin nasıl gerçekleştirileceğini açıklayacağız.

tarih öncesi

Uzun zaman önce çok uzak bir galakside

Birkaç yıl önce laboratuvarımızda bir cihazın donanım yazılımını incelemeye ihtiyaç vardı. Ürün yazılımı sıkıştırılmış ve bir önyükleyici ile paketinden çıkarılmıştır. Bunu, hafızadaki verileri birkaç kez değiştirerek çok karmaşık bir şekilde yaptı. Ve bellenimin kendisi daha sonra çevre birimleriyle aktif olarak etkileşime girdi. Ve bunların hepsi MIPS çekirdeğinde.

Nesnel nedenlerden dolayı mevcut emülatörler bize uymuyordu ama yine de kodu çalıştırmak istiyorduk. Daha sonra minimumu yapacak ve ana donanım yazılımını açmamıza izin verecek kendi emülatörümüzü yapmaya karar verdik. Biz denedik ve işe yaradı. Ana donanım yazılımını da gerçekleştirmek için çevre birimleri eklesek ne olur diye düşündük. Çok fazla acı vermedi ve işe de yaradı. Tekrar düşündük ve tam teşekküllü bir emülatör yapmaya karar verdik.

Sonuç bir bilgisayar sistemi emülatörüydü Taklitçi.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın
Neden Kopycat?

Kelime oyunu var.

  1. taklitçi (İngilizce, isim [ˈkɒpɪkæt]) - taklitçi, taklitçi
  2. kedi (İngilizce, isim [ˈkæt]) - kedi, kedi - projenin yaratıcılarından birinin en sevdiği hayvan
  3. “K” harfi Kotlin programlama dilindendir

Taklitçi

Emülatörü oluştururken çok spesifik hedefler belirlendi:

  • hızlı bir şekilde yeni çevre birimleri, modüller, işlemci çekirdekleri oluşturma yeteneği;
  • çeşitli modüllerden sanal bir cihazı birleştirme yeteneği;
  • herhangi bir ikili veriyi (ürün yazılımı) sanal bir cihazın belleğine yükleme yeteneği;
  • anlık görüntülerle çalışma yeteneği (sistem durumunun anlık görüntüleri);
  • yerleşik hata ayıklayıcı aracılığıyla öykünücüyle etkileşime girme yeteneği;
  • gelişim için güzel ve modern bir dil.

Sonuç olarak, uygulama için Kotlin, veri yolu mimarisi (bu, modüllerin sanal veri yolları aracılığıyla birbirleriyle iletişim kurduğu zamandır), cihaz açıklama formatı olarak JSON ve hata ayıklayıcıyla etkileşim protokolü olarak GDB RSP seçildi.

Geliştirme iki yıldan biraz fazla bir süredir devam ediyor ve aktif olarak devam ediyor. Bu süre zarfında MIPS, x86, V850ES, ARM ve PowerPC işlemci çekirdekleri hayata geçirildi.

Proje büyüyor ve bunu daha geniş kitlelere sunmanın zamanı geldi. Projenin detaylı anlatımını daha sonra yapacağız ancak şimdilik Kopycat kullanımına odaklanacağız.

En sabırsız olanlar için emülatörün promosyon sürümü şuradan indirilebilir: bağlantı.

Emülatördeki gergedan

Daha önce SMATRHINO-2018 konferansı için tersine mühendislik becerilerini öğretmek için bir “Rhinoceros” test cihazının oluşturulduğunu hatırlayalım. Statik ürün yazılımı analizi süreci şurada açıklanmıştır: Bu makalede.

Şimdi “hoparlörler” eklemeye çalışalım ve ürün yazılımını emülatörde çalıştırmaya çalışalım.

İhtiyacımız:
1)Java 1.8
2) Python ve modül Jep öykünücünün içinde Python'u kullanmak için. Windows için WHL modülü Jep'i oluşturabilirsiniz buradan indirin.

Windows için:
1) com0com
2) PuTTY

Linux için:
1) sokat

Eclipse, IDA Pro veya radare2'yi GDB istemcisi olarak kullanabilirsiniz.

Nasıl çalışır?

Emülatörde ürün yazılımını gerçekleştirmek için, gerçek bir cihazın analogu olan sanal bir cihazın "birleştirilmesi" gerekir.

Gerçek cihaz (“gergedan”) blok diyagramda gösterilebilir:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Emülatör modüler bir yapıya sahiptir ve son sanal cihaz bir JSON dosyasında tanımlanabilmektedir.

JSON 105 satır

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

Parametreye dikkat edin firmware bölüm params sanal bir cihaza firmware olarak yüklenebilen bir dosyanın adıdır.

Sanal cihaz ve ana işletim sistemiyle etkileşimi aşağıdaki diyagramla gösterilebilir:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Emülatörün mevcut test örneği, ana işletim sisteminin COM bağlantı noktalarıyla etkileşimi içerir (Bluetooth modülü için UART ve UART'ta hata ayıklama). Bunlar, cihazların bağlı olduğu gerçek bağlantı noktaları veya sanal COM bağlantı noktaları olabilir (bunun için yalnızca com0com/socat).

Şu anda öykünücüyle dışarıdan etkileşim kurmanın iki ana yolu vardır:

  • GDB RSP protokolü (buna göre bu protokolü destekleyen araçlar Eclipse / IDA / radare2'dir);
  • dahili emülatör komut satırı (Argparse veya Python).

Sanal COM bağlantı noktaları

Yerel makinedeki bir sanal cihazın UART'ı ile bir terminal aracılığıyla etkileşim kurmak için, bir çift ilişkili sanal COM bağlantı noktası oluşturmanız gerekir. Bizim durumumuzda, bir bağlantı noktası emülatör tarafından, ikincisi ise bir terminal programı (PuTTY veya ekran) tarafından kullanılır:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

com0com'u kullanma

Sanal COM bağlantı noktaları, com0com kitindeki kurulum yardımcı programı kullanılarak yapılandırılır (konsol sürümü - C:Program Dosyaları (x86)com0comsetupс.exe, veya GUI sürümü - C:Program Dosyaları (x86)com0comsetupg.exe):

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Kutuları kontrol et arabellek taşmasını etkinleştir oluşturulan tüm sanal bağlantı noktaları için, aksi takdirde emülatör COM bağlantı noktasından bir yanıt bekleyecektir.

Socat'ı kullanma

UNIX sistemlerinde, emülatör tarafından socat yardımcı programı kullanılarak sanal COM bağlantı noktaları otomatik olarak oluşturulur; bunu yapmak için emülatörü başlatırken bağlantı noktası adında öneki belirtmeniz yeterlidir. socat:.

Dahili komut satırı arayüzü (Argparse veya Python)

Kopycat bir konsol uygulaması olduğundan emülatör, nesneleri ve değişkenleriyle etkileşim kurmak için iki komut satırı arayüzü seçeneği sunar: Argparse ve Python.

Argparse, Kopycat'te yerleşik bir CLI'dir ve her zaman herkesin kullanımına açıktır.

Alternatif bir CLI Python yorumlayıcısıdır. Kullanmak için Jep Python modülünü kurmanız ve emülatörü Python ile çalışacak şekilde yapılandırmanız gerekir (kullanıcının ana sisteminde kurulu Python yorumlayıcısı kullanılacaktır).

Python modülünün kurulumu Jep

Linux altında Jep pip aracılığıyla kurulabilir:

pip install jep

Jep'i Windows'a yüklemek için önce Windows SDK'yı ve ilgili Microsoft Visual Studio'yu yüklemelisiniz. Bunu sizin için biraz daha kolaylaştırdık ve WHL'nin yapıları Windows için Python'un güncel sürümleri için JEP, böylece modül dosyadan kurulabilir:

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

Jep kurulumunu kontrol etmek için komut satırında çalıştırmanız gerekir:

python -c "import jep"

Yanıt olarak aşağıdaki mesaj alınmalıdır:

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

Sisteminizin emülatör toplu dosyasında (taklitçi.bat - pencereler için, taklitçi - Linux için) parametreler listesine DEFAULT_JVM_OPTS ek bir parametre ekleyin Djava.library.path — kurulu Jep modülünün yolunu içermelidir.

Windows için sonuç şöyle bir satır 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'in Başlatılması

Emülatör bir konsol JVM uygulamasıdır. Başlatma, işletim sisteminin komut satırı komut dosyası (sh/cmd) aracılığıyla gerçekleştirilir.

Windows altında çalıştırılacak komut:

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

socat yardımcı programını kullanarak Linux altında çalıştırma komutu:

./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 sunucusuna erişime açık olacak TCP bağlantı noktası;
  • -n rhino — ana sistem modülünün adı (birleştirilmiş cihaz);
  • -l user — ana modülün aranacağı kütüphanenin adı;
  • -y library — cihazda bulunan modülleri aramanın yolu;
  • firmwarerhino_pass.bin — ürün yazılımı dosyasının yolu;
  • COM26 ve COM28 sanal COM bağlantı noktalarıdır.

Sonuç olarak, bir bilgi istemi görüntülenecektir Python > (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 ile etkileşim

Testi basitleştirmek amacıyla, IDA'da analiz için kaynak dosya olarak Rhino aygıt yazılımını kullanıyoruz. ELF dosyası (meta bilgileri orada saklanır).

Ana ürün yazılımını meta bilgisi olmadan da kullanabilirsiniz.

IDA Pro'da Kopycat'i başlattıktan sonra Hata Ayıklayıcı menüsünde "Hata ayıklayıcıyı değiştir…" ve seç "Uzak GDB hata ayıklayıcı". Ardından bağlantıyı kurun: menü Hata ayıklayıcı - İşlem seçenekleri…

Değerleri ayarlayın:

  • Uygulama - herhangi bir değer
  • Ana bilgisayar adı: 127.0.0.1 (veya Kopycat'in çalıştığı uzak makinenin IP adresi)
  • Liman: 23946

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Artık hata ayıklama düğmesi kullanılabilir hale gelir (F9 tuşu):

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Emülatördeki hata ayıklayıcı modülüne bağlanmak için buna tıklayın. IDA hata ayıklama moduna girer, ek pencereler kullanılabilir hale gelir: kayıtlar ve yığın hakkında bilgiler.

Artık hata ayıklayıcının tüm standart özelliklerini kullanabiliriz:

  • talimatların adım adım yürütülmesi (İçine adım и Adım atmak — sırasıyla F7 ve F8 tuşları);
  • yürütmeyi başlatmak ve duraklatmak;
  • hem kod hem de veriler için kesme noktaları oluşturma (F2 tuşu).

Bir hata ayıklayıcıya bağlanmak, ürün yazılımı kodunu çalıştırmak anlamına gelmez. Geçerli yürütme konumu adres olmalıdır 0x08006A74 - işlevin başlangıcı Reset_Handler. Listeyi aşağı kaydırırsanız işlev çağrısını görebilirsiniz. ana. İmleci bu satıra yerleştirebilirsiniz (adres 0x08006ABE) ve işlemi gerçekleştirin İmlece kadar çalıştır (F4 tuşu).

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Daha sonra fonksiyona girmek için F7 tuşuna basabilirsiniz. ana.

Esli vypolnit komutu İşleme devam et (F9 tuşu), ardından tek tuşla “Lütfen bekleyin” penceresi açılacaktır. Askıya almak:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

bastığınızda Askıya almak Ürün yazılımı kodunun yürütülmesi askıya alınır ve kesintiye uğradığı koddaki aynı adresten devam ettirilebilir.

Kodu çalıştırmaya devam ederseniz sanal COM portlarına bağlı terminallerde aşağıdaki satırları göreceksiniz:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

"Durum bypass" hattının varlığı, sanal Bluetooth modülünün kullanıcının COM bağlantı noktasından veri alma moduna geçtiğini gösterir.

Artık Bluetooth terminalinde (resimde COM29) Rhino protokolüne göre komutlar girebilirsiniz. Örneğin, “MEOW” komutu “mur-mur” dizesini Bluetooth terminaline döndürecektir:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Beni tamamen taklit etme

Bir emülatör oluştururken belirli bir cihazın ayrıntı/emülasyon düzeyini seçebilirsiniz. Örneğin, Bluetooth modülü farklı şekillerde taklit edilebilir:

  • cihaz tam bir komut seti ile tamamen taklit edilmiştir;
  • AT komutları taklit edilir ve veri akışı ana sistemin COM bağlantı noktasından alınır;
  • sanal cihaz, gerçek cihaza tam veri yönlendirmesi sağlar;
  • her zaman "Tamam" değerini döndüren basit bir saplama olarak.

Öykünücünün mevcut sürümü ikinci yaklaşımı kullanır - sanal Bluetooth modülü yapılandırmayı gerçekleştirir ve ardından ana sistemin COM bağlantı noktasından öykünücünün UART bağlantı noktasına "proxy" veri moduna geçer.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Çevre biriminin bir kısmının uygulanmaması durumunda kodun basit bir şekilde enstrümantasyonunun olasılığını düşünelim. Örneğin, DMA'ya veri aktarımını kontrol etmekten sorumlu bir zamanlayıcı oluşturulmamışsa (kontrol, fonksiyonda gerçekleştirilir) ws2812b_wait, rastgele bir adres 0x08006840), bu durumda ürün yazılımı her zaman bayrağın sıfırlanmasını bekleyecektir meşgulda yerleşmiş 0x200004C4DMA veri hattının doluluğunu gösteren:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bayrağı manuel olarak sıfırlayarak bu durumu aşabiliriz meşgul kurduktan hemen sonra. IDA Pro'da bir Python fonksiyonu oluşturup onu bir kesme noktasında çağırabilir ve bayrağa 1 değerini yazdıktan sonra kesme noktasının kendisini koda koyabilirsiniz. meşgul.

Kesme noktası işleyicisi

Öncelikle IDA'da bir Python fonksiyonu oluşturalım. Menü Dosya - Komut Dosyası komutu...

Soldaki listeye yeni bir snippet ekleyin, ona bir ad verin (örneğin, BPT),
Sağdaki metin alanına fonksiyon kodunu girin:

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

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bundan sonra tıklayın koşmak ve komut dosyası penceresini kapatın.

Şimdi koda geçelim 0x0800688A, bir kesme noktası ayarlayın (F2 tuşu), düzenleyin (bağlam menüsü Kesme noktasını düzenle...), komut dosyası türünü Python olarak ayarlamayı unutmayın:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın
Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Geçerli bayrak değeri ise meşgul 1'e eşitse, o zaman işlevi çalıştırmalısınız skip_dma komut dosyası satırında:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Firmware'i yürütmek için çalıştırırsanız, kesme noktası işleyici kodunun tetiklenmesi IDA penceresinde görülebilir. Çıktı satıra göre Skipping wait ws2812.... Artık ürün yazılımı bayrağın sıfırlanmasını beklemeyecek meşgul.

Emülatörle etkileşim

Öykünme uğruna öykünmenin zevk ve neşe yaratması pek olası değildir. Emülatörün araştırmacının hafızadaki verileri görmesine veya iş parçacıklarının etkileşimini kurmasına yardımcı olması çok daha ilginçtir.

RTOS görevleri arasında dinamik olarak etkileşimin nasıl kurulacağını size göstereceğiz. Eğer çalışıyorsa öncelikle kodun yürütülmesini duraklatmalısınız. Eğer etkinliğe gidersen bluetooth_task_entry “LED” komutunun işleme dalına (adres 0x080057B8), ardından ilk olarak neyin oluşturulduğunu ve ardından sistem kuyruğuna gönderildiğini görebilirsiniz. ledControlQueueHandle bazı mesajlar.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Değişkene erişmek için bir kesme noktası ayarlamalısınız ledControlQueueHandle, rastgele bir adres 0x20000624 ve kodu çalıştırmaya devam edin:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Sonuç olarak, durdurma ilk olarak adreste gerçekleşecektir. 0x080057CA işlevi çağırmadan önce osMailAlloc, ardından adreste 0x08005806 işlevi çağırmadan önce osMailPut, sonra bir süre sonra - adrese 0x08005BD4 (işlevi çağırmadan önce osMailGet), fonksiyona ait olan leds_task_entry (LED görevi), yani görevler değişti ve artık LED görevi kontrolü aldı.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bu basit yöntemle RTOS görevlerinin birbirleriyle nasıl etkileşime girdiğini belirleyebilirsiniz.

Elbette gerçekte görevlerin etkileşimi daha karmaşık olabilir, ancak bir emülatör kullanarak bu etkileşimi izlemek daha az zahmetli hale gelir.

Burada Emülatörün başlatılmasını ve IDA Pro ile etkileşime girmesini gösteren kısa bir videoyu izleyebilirsiniz.

Radare2 ile başlatın

Radare2 gibi evrensel bir aracı görmezden gelemezsiniz.

Öykünücüye r2 kullanarak bağlanmak için komut şu şekilde görünecektir:

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

Lansman şu anda mevcut (dc) ve yürütmeyi duraklatın (Ctrl+C).

Ne yazık ki şu anda r2, donanım gdb sunucusuyla ve bellek düzeniyle çalışırken sorunlar yaşıyor, bu nedenle kesme noktaları ve Adımlar çalışmıyor (komut; ds). Bu durumun yakında düzeltileceğini umuyoruz.

Eclipse ile Çalıştırma

Emülatörü kullanma seçeneklerinden biri, geliştirilmekte olan cihazın donanım yazılımında hata ayıklamaktır. Anlaşılır olması açısından Rhino donanım yazılımını da kullanacağız. Ürün yazılımı kaynaklarını indirebilirsiniz bundan dolayı.

Setteki Eclipse'i IDE olarak kullanacağız STM32 için Sistem Tezgahı.

Emülatörün doğrudan Eclipse'de derlenmiş ürün yazılımını yüklemesi için parametreyi eklemeniz gerekir. firmware=null emülatör başlatma komutuna:

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

Hata ayıklama yapılandırmasını ayarlama

Eclipse'de menüyü seçin Çalıştır - Yapılandırmalarda Hata Ayıklama... Açılan pencerede bölümde GDB Donanım Hata Ayıklama yeni bir konfigürasyon eklemeniz ve ardından “Ana” sekmesinde mevcut projeyi ve hata ayıklama için uygulamayı belirtmeniz gerekir:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

“Hata Ayıklayıcı” sekmesinde GDB komutunu belirtmeniz gerekir:
${openstm32_compiler_path}arm-none-eabi-gdb

Ayrıca GDB sunucusuna (ana bilgisayar ve bağlantı noktası) bağlanmak için parametreleri de girin:

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

“Başlangıç” sekmesinde aşağıdaki parametreleri belirtmeniz gerekir:

  • onay kutusunu etkinleştir Resmi yükle (böylece birleştirilmiş ürün yazılımı görüntüsü emülatöre yüklenir);
  • onay kutusunu etkinleştir Sembolleri yükle;
  • başlatma komutunu ekleyin: set $pc = *0x08000004 (PC kaydını adresteki bellekteki değere ayarlayın 0x08000004 - adres orada saklanır Resetİşleyici).

Dikkat, ürün yazılımı dosyasını Eclipse'den indirmek istemiyorsanız seçenekler Resmi yükle и Komutları çalıştır belirtmeye gerek yok.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Hata Ayıkla'ya tıkladıktan sonra hata ayıklayıcı modunda çalışabilirsiniz:

  • adım adım kod yürütme
    Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın
  • kesme noktalarıyla etkileşim kurma
    Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Dikkat. Eclipse'in bazı tuhaflıkları var... ve onlarla yaşamak zorundasın. Örneğin, hata ayıklayıcıyı başlatırken ““0x0″ için kaynak yok” mesajı görünürse, Adım komutunu (F5) yürütün.

Bir kedinin içindeki gergedan - ürün yazılımını Kopycat öykünücüsünde çalıştırın

Bunun yerine bir sonuca

Yerel kodu taklit etmek çok ilginç bir şeydir. Bir cihaz geliştiricisi için, gerçek bir cihaz olmadan ürün yazılımında hata ayıklamak mümkün hale gelir. Bir araştırmacı için, bir cihazla bile her zaman mümkün olmayan dinamik kod analizi yapmak bir fırsattır.

Uzmanlara kullanışlı, orta derecede basit ve kurulumu ve çalıştırılması çok fazla çaba ve zaman gerektirmeyen bir araç sunmak istiyoruz.

Donanım emülatörlerini kullanma deneyiminiz hakkındaki yorumlarınızı yazın. Sizi tartışmaya davet ediyoruz ve soruları yanıtlamaktan mutluluk duyacağız.

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

Emülatörü ne için kullanıyorsunuz?

  • Firmware geliştiriyorum (hata ayıklıyorum)

  • Ürün yazılımını araştırıyorum

  • Oyunları başlatıyorum (Dendi, Sega, PSP)

  • başka bir şey (yorumlara yazın)

7 kullanıcı oy kullandı. 2 kullanıcı çekimser kaldı.

Yerel kodu taklit etmek için hangi yazılımı kullanıyorsunuz?

  • QEMU

  • Tek boynuzlu at motoru

  • Mağara semenderi

  • başka bir şey (yorumlara yazın)

6 kullanıcı oy kullandı. 2 kullanıcı çekimser kaldı.

Kullandığınız emülatörde neyi geliştirmek istersiniz?

  • hız istiyorum

  • Kurulum/başlatma kolaylığı istiyorum

  • Emülatörle etkileşime geçmek için daha fazla seçenek istiyorum (API, kancalar)

  • Her şeyden memnunum

  • başka bir şey (yorumlara yazın)

8 kullanıcı oy kullandı. 1 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle