+ Reply to Thread
Results 1 to 6 of 6

Thread: IDA6.8 plugin STM32

  1. #1

    Default IDA6.8 plugin STM32

    Здравствуйте.
    Есть плагин к IDA https://github.com/alexhude/LoadProcConfig,
    Добавляет имена регистров
    , векторы прерываний .
    С IDA64 работает на ура , все вроде в норме, но в IDA64 нет hex rays.
    На IDA32 :
    с родным плагином вызывает эксепшен.
    Перекомпилировали именно с sdk 6.8 под IDA32 .
    Вылетать перестал , но работает с тормозами и причина видимо в том что после его работы база IDA *.id1 увеличилась до 6Гб , в то время как под ida64 эта база весит всего 16Кб.
    Помогите ...
    Заранее благодарен.

  2. #2

    Default Re: IDA6.8 plugin STM32

    Понял что плагин сырой. Решил делать все ручками (ибо пока дуб в работе с IDA)а затем пробовать все телодвижения переводить в скрипт.
    Если кто поможет буду весьма благодарен.
    Если и не помогут то возможно кому пригодятся мои потуги.

    После загрузки *.hex в IDA , переименовываю созданный сегмент в ROM.
    Здесь непонятки что делать с атрибутами сегмента align , Base и т.д. пока оставляю как есть.
    Создаю новые сегменты RAM , SFR, CORE_PER. Все сегменты типа public . Base ставлю равной началу сегмента.
    Здесь скрипт для F072
    SegRename(0x08000000,"ROM");
    SegCreate(0x20000000, 0x20004FFF, 0x20000000, 1, 0, scPub);
    SegRename(0x20000000,"RAM");
    SegCreate(0x40000000, 0x400233FF, 0x40000000, 1, 0, scPub);
    SegRename(0x40000000,"SFR");
    SegCreate(0xE0000000, 0xE0100000, 0xE0000000, 1, 0, scPub);
    SegRename(0xE0000000,"CORE_PER");

    Здесь пока ручками в сегменте SFR переименовываю регистры периферии + добавляю repeatable comment

    Выставляю в опциях ассеблер GNU assembler и жму Reanalyze program, компилятор CNU C++.

    Далее иду к началу сегмента ROM и переопределяю всю таблицу векторов как DWORD (пока ручками)
    Здесь снова таки затык , для скрипта надо сделать всю таблицу unknown ,
    но из-за BASE равной 0 SegByName выдает соответственно 0 и MakeDword получает неверный адрес.
    Вручную - MakeUnkn(0x8000000,1) и MakeDword(0x8000000) работает .
    Но хотелось бы автоматизировать .
    Пока надумки :
    Для каждого камня (линейки) своя таблица векторов .
    Имеем в скрипте фиксированые адреса таблицы.
    В цикле делать unknown для всех адресов таблицы , затем так же в цикле переопределять как DWORD.
    или
    С помощью FindCode() находим конец таблицы векторов а далее так же как и выше.

  3. Пользователь сказал cпасибо:
    Darwin (24-09-2017)
  4. #3

    Default Re: IDA6.8 plugin STM32

    Продолжаю свои "изыскания"
    На данный момент скрипт выглядит:
    from idautils import *
    from idc import *
    from idaapi import *


    SegRename(0x08000000,"ROM");
    SegAlign(0x08000000,saRelByte);
    SegCreate(0x20000000, 0x20004FFF, 0x20000000, 1, saRelByte, scPub);
    SegRename(0x20000000,"RAM");
    SegCreate(0x40000000, 0x400233FF, 0x40000000, 1, saRelDble, scPub);
    SegRename(0x40000000,"SFR");
    SegCreate(0xE0000000, 0xE0100000, 0xE0000000, 1,saRelDble, scPub);
    SegRename(0xE0000000,"CORE_PER");

    for ea in range(0x08000000,0x080000BF,1):
    MakeUnkn(ea,1)
    for ea in range(0x08000000,0x080000BF,4):
    MakeDword(ea)

    per_table=[0x40020000,"GPIOA_MODER",
    0x40020400,"GPIOB_MODER",
    0x40020800,"GPIOC_MODER",
    0x40020C00,"GPIOD_MODER"]

    for i in range(0,len(per_table),2):
    MakeName(per_table[i],per_table[i+1])
    print i
    MakeRptCmt(per_table[i],per_table[i+1])
    Что добавил :
    for ea in range(0x08000000,0x080000BF,1):
    MakeUnkn(ea,1)
    for ea in range(0x08000000,0x080000BF,4):
    MakeDword(ea)
    В цикле делаю undef таблице векторов
    и так же в цикле создаю DWORD
    Далее надо бы добавить репетибле комменты на каждый вектор .

    Ну и вкусное -
    per_table=[0x40020000,"GPIOA_MODER",
    0x40020400,"GPIOB_MODER",
    0x40020800,"GPIOC_MODER",
    0x40020C00,"GPIOD_MODER"]

    for i in range(0,len(per_table),2):
    MakeName(per_table[i],per_table[i+1])
    print i
    MakeRptCmt(per_table[i],per_table[i+1]
    Создаем список из адресов и имен периферии и воплощаем их .
    Осталось только соорудить вменяемый парсер svd

    Это все пока наметки и сумбур, пока только осваиваю как и питон так и IDA ....
    Last edited by dosikus; 24-09-2017 at 13:51.

  5. Пользователь сказал cпасибо:
    Darwin (24-09-2017)
  6. #4

    Default Re: IDA6.8 plugin STM32

    Подцепился к JLink gdb серверу ,отладка более менее вменяемая , однако есть масса вопросов:

    Как грузить тот же hex из IDA ?
    На офсайте segger писано что грузить из JLink commander. То есть возможно только аттачиться к уже работающму девайсу ?
    В принципе сие норм, но возникает вопрос о адекватном ресете девайса:
    Ресет делаю через посылку команды gdb серверу , в консоли JLink вижу что ресет проходит но содержимое окон IDA не меняется .
    Для рефреша надо или сделать шаг в отладчике либо брякнуться на уже выставленном бряке.
    Как-то не айс...
    Jlink самопальный на F072, подключал так же переделанный из STM32VL дискавери , плюшки лицензий сгенерированы ...

  7. #5

    Default Re: IDA6.8 plugin STM32

    Потихоньку, ручками набиваю скрипт.
    Кто хотит присоединяйтесь .
    Здесь выделил для периферии:
    В теги оформлять не стал ибо код не адекватно воспринимает а цитата нечитаемо.
    Строки после цикла должны быть с отступами из пробелов!
    #########################
    #STM32F103ZET 512 ROM 64 RAM
    from idautils import *
    from idc import *
    from idaapi import *

    per_table=[0x40013800,"USART1_SR",
    0x40013804,"USART1_DR",
    0x40013808,"USART1_BRR",
    0x4001380C,"USART1_CR1",
    0x40013810,"USART1_CR2",
    0x40013814,"USART1_CR3",
    0x40013818,"USART1_GTPR",
    0x40021000,"RCC_CR",
    0x40021004,"RCC_CFGR",
    0x40021008,"RCC_CIR",
    0x4002100C,"RCC_APB2RSTR",
    0x40021010,"RCC_APB1RSTR",
    0x40021014,"RCC_AHBENR",
    0x40021018,"RCC_APB2ENR",
    0x4002101C,"RCC_APB1ENR",
    0x40021020,"RCC_BDCR",
    0x40021024,"RCC_CSR",
    0x40021028,"RCC_AHBSTR",
    0x4002102C,"RCC_CFGR2",
    0x40010000,"AFIO_EVCR",
    0x40010004,"AFIO_MAPR",
    0x40010008,"AFIO_EXTICR1",
    0x4001000C,"AFIO_EXTICR2",
    0x40010010,"AFIO_EXTICR3",
    0x40010014,"AFIO_EXTICR4",
    0x4001001C,"AFIO_MAPR2",

    0x40010800,"GPIOA_CRL",
    0x40010804,"GPIOA_CRH",
    0x40010808,"GPIOA_IDR",
    0x4001080C,"GPIOA_ODR",
    0x40010810,"GPIOA_BSRR",
    0x40010814,"GPIOA_BRR",
    0x40010818,"GPIOA_LCKR",

    0x40010C00,"GPIOB_CRL",
    0x40010C04,"GPIOB_CRH",
    0x40010C08,"GPIOB_IDR",
    0x40010C0C,"GPIOB_ODR",
    0x40010C10,"GPIOB_BSRR",
    0x40010C14,"GPIOB_BRR",
    0x40010C18,"GPIOB_LCKR",

    0x40011000,"GPIOC_CRL",
    0x40011004,"GPIOC_CRH",
    0x40011008,"GPIOC_IDR",
    0x4001100C,"GPIOC_ODR",
    0x40011010,"GPIOC_BSRR",
    0x40011014,"GPIOC_BRR",
    0x40011018,"GPIOC_LCKR",

    0x40011400,"GPIOD_CRL",
    0x40011404,"GPIOD_CRH",
    0x40011408,"GPIOD_IDR",
    0x4001140C,"GPIOD_ODR",
    0x40011410,"GPIOD_BSRR",
    0x40011414,"GPIOD_BRR",
    0x40011418,"GPIOD_LCKR",

    0x40011800,"GPIOE_CRL",
    0x40011804,"GPIOE_CRH",
    0x40011808,"GPIOE_IDR",
    0x4001180C,"GPIOE_ODR",
    0x40011810,"GPIOE_BSRR",
    0x40011814,"GPIOE_BRR",
    0x40011818,"GPIOE_LCKR"]



    for i in range(0,len(per_table),2):
    MakeUnkn(per_table[i],1)
    MakeDword(per_table[i])
    MakeName(per_table[i],per_table[i+1])
    print i
    MakeRptCmt(per_table[i],per_table[i+1])

    ###########################

  8. #6

    Default Re: IDA6.8 plugin STM32

    Нашел здесь парсер svd http://catethysis.ru/iar_svd_files/
    Но как его применить -не понимаю...

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:21
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org