Closed Thread
Page 1 of 2 1 2 LastLast
Results 1 to 20 of 26

Thread: IDA 6.8. Ошибка в скрипте MSP430.py

  1. #1

    Default IDA 6.8. Ошибка в скрипте MSP430.py

    Приветствую всех. Попытался дизассемблировать прошивку от микроконтроллера MSP430 с 20-ти битной адресацией. Выяснилось, что IDA 6.8 неправильно распознает индексный режим адресации, когда адрес задан в 20-ти битном формате. Например, копирование слова по адресу 0x1ED56 с индексом в R15 в память по адресу 0x400 дизассемблируется так: movx.w 0ED56h(R15), &400h. А должно быть так: movx.w 1ED56h(R15), &400h.
    Как я понимаю, за дизасм прошивок от MSP430 отвечает файл MSP430.py. Подскажите, как исправить в нем ошибку.

  2. #2

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Приветствую!
    А у вас спецификации есть же?
    На всякий случай:
    http://www.ti.com/lit/ml/slap109/slap109.pdf
    http://www.ti.com/lit/ug/slau391e/slau391e.pdf

    А можете написать байты инструкции?
    Возможно это все-таки MSP430X Address Instructions With Indexed Mode которая принимает 16битное смещение.

    В противном случае надо будет смотреть функцию decode_format_I (у меня в MSP430.py это строка 947)
    В ней судя по всему за разбор операндов отвечает функция fill_op
    Но она выглядит правдоподобно: op.addr = ua_next_word() | (topaddr << 16) (строка 863)

    Под рукой бинарей нету для msp430x, больше ничего подсказать не могу:(

  3. 2 пользователя(ей) сказали cпасибо:
    Darwin (18-07-2017) d7d1cd (18-07-2017)
  4. #3

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    groke, спасибо за помощь. Вот байты инструкции из окна Hex-View A: C0 18 92 4F 56 ED 76 03. IDA дизассемблирует это как movx.w unk_ED56(R15), &376h, а должно быть что-то типа movx.w unk_1ED56(R15), &376h, то есть нужен адрес не ED56, а 1ED56. По первому адресу нет никаких данных в прошивке. Данная инструкция в IAR дизассемблируется правильно.

  5. #4

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Хм, на самом деле там все как-то странно получается.
    Я добавил пачку дебажных принтов - и скрипт MSP430.py все ставит правильно.
    Плюс через питоновское апи можно по инструкции вытащить правильное смещение
    Code:
    Python>"%x" % DecodeInstruction(here()).Op1.addr
    1ed56


    Проблема похоже в том, что не устанавливается флаг AUX_A при разборе movx и из-за этого при отображении ида режет старшие биты.

    Я вставил следующий код в функцию decode_format_I
    Code:
            
    self.fill_op(self.cmd.Op1, Rsrc, As, BW, True, True, extw)
    self.fill_op(self.cmd.Op2, Rdst, Ad, BW, False, False, extw)
    self.cmd.auxpref = BW + AUX_WORD
    #Добавленные строки
    if self.cmd.Op1.addr > 0x10000:
    self.cmd.auxpref += AUX_A
    #конец добавленных
    if extw and As == AM_REGISTER and Ad == AM_REGISTER:
    self.handle_reg_extw(extw)


    И инструкция отобразилась правильно. Не гарантирую что это верное решение, но конкретно эту инструкцию у меня ida отображает теперь верно :)

  6. #5

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Правда исчез суффикс .w, если честно уже не помню правильно ли это или нет:(
    Code:
            if self.cmd.Op1.addr > 0x10000:
    self.cmd.auxpref = BW + AUX_A

    Если сделать так, то в выводе будет movx.a 1ED56h(R15), &376h

    Вероятно это более корректно

  7. #6

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Вставил инструкцию movx.a 1ED56h(R15), &376h в IAR. После компиляции получаю байты 80 18 d2 4f 56 ed 76 03. Если скомпилировать movx.w 1ED56h(R15), &376h, то получаю байты c0 18 92 4f 56 ed 76 03. Из этого делаю вывод, что суффикс .w и - это разные вещи. Насколько помню .w - это перенос слова (16 бит), а - это перенос 20-ти битного значения.

  8. #7

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Попробуйте вместо оригинального msp430.py
    использовать тот который по ссылке.
    Я не нашел как заатачить файл:(
    Суффиксы теперь корректно сохраняются - я добавил специальный флаг, который ставится в функции decode_format_I и проверяется в функции outop
    https://transfer.sh/HWHsI/msp430.py

    Изменения функции outop
    Code:
                if sz in [AUX_A, AUX_AX]:
    # 20-bit index is not signed
    width = OOFW_24
    sign = 0
    if self.cmd.auxpref & PATCH_WIDE:
    width = OOFW_24
    sign = 0
    OutValue(op, OOF_ADDR | signed | width )


    Изменения в функции decode_format_I
    Code:

    self.fill_op(self.cmd.Op1, Rsrc, As, BW, True, True, extw)
    self.fill_op(self.cmd.Op2, Rdst, Ad, BW, False, False, extw)
    self.cmd.auxpref = BW + AUX_WORD
    if self.cmd.Op1 > 0x10000:
    self.cmd.auxpref |= PATCH_WIDE
    if extw and As == AM_REGISTER and Ad == AM_REGISTER:
    self.handle_reg_extw(extw)

    Плюс надо задефайнить константу
    Code:
    AUX_ZC      = 0x40  # zero carry flag is set

    PATCH_WIDE = 0x80
    # addressing mode field in the opcode
    Attached Files
    Last edited by Darwin; 19-07-2017 at 19:09. Reason: Добавил файл

  9. 2 пользователя(ей) сказали cпасибо:
    Darwin (19-07-2017) d7d1cd (19-07-2017)
  10. #8

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    groke, спасибо. Вроде теперь правильно декодирует инструкции. Теперь надо попробовать дизассемблировать, получить ASM файл, засунуть его в IAR и снова скомпилировать. Далее сравнить с исходной прошивкой. Это покажет, правильно ли теперь IDA распознает все команды.
    Можно еще вопрос. При установке IDA 6.8 устанавливает Python 2.7.6, но ставит его в корень диска С. Можно как-то установить в Program files? IDA 6.1 вообще не требовала установки питона, однако Ваш файл MSP430.py ей не переваривается. Выдает ошибки: global name 'QueueSet' is not defined и global name 'idaapi' is not defined. Почему так происходит?

  11. #9
    Darwin's Avatar

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Потому, что idapython 6.1 может быть не совместим с idapython из 6.8, зачем вы пихаете файл новой версии в старую? Сделайте diff увидите различия.

    В старом idaapi, вместо QueueSet - используется QueueMark.
    Last edited by Darwin; 19-07-2017 at 19:09.
    Счастлив кто отдал, а не взял. (с) Inception

  12. Пользователь сказал cпасибо:
    d7d1cd (19-07-2017)
  13. #10

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Quote Originally Posted by Darwin View Post
    Потому, что idapython 6.1 может быть не совместим с idapython из 6.8, зачем вы пихаете файл новой версии в старую? Сделайте diff увидите различия.
    В старом idaapi, вместо QueueSet - используется QueueMark.
    Я пробовал в файл MSP430.py из IDA 6.1 внести изменения, которые groke внес в такой же файл из IDA 6.8. Но все равно получил ошибку:

  14. #11
    Darwin's Avatar

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    В данной ошибке говорится, что у вас не соблюдено принятое в файле форматирование отступов (косяк с лишним пробелом или табуляцией вместо пробела). В питоне это важно.
    Счастлив кто отдал, а не взял. (с) Inception

  15. #12

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Quote Originally Posted by Darwin View Post
    В данной ошибке говорится, что у вас не соблюдено принятое в файле форматирование отступов (косяк с лишним пробелом или табуляцией вместо пробела). В питоне это важно.
    Программирую на С++ и удивлен такой особенностью питона. Ну да ладно. Все равно надо переходить на более новую версию IDA, поэтому буду использовать IDA 6.8. В ней, кстати, в отличие от версии 6.1, автоматически распознается больше кода. Пока не знаю, хорошо ли это. Напрягает лишь то, что при установке я не могу выбрать куда ставить питон и установка происходит в корень диска С. Подскажите, можно ли каким-то образом (например, удалением после установки IDA только питона и повторной его установкой из отдельного установщика) установить питон по указанному мной пути?

  16. #13
    Darwin's Avatar

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    У всех стоит в корне C и никто не парится. Пробуйте, должно работать.
    Счастлив кто отдал, а не взял. (с) Inception

  17. #14

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    В общем что. Благодаря объяснению Darwin об ошибке, а так же беглому просмотру основных особенностей Питона, был подправлен файл MSP430.py (оказывается, что вместо пробелов была табуляция). В результате в IDA 6.1 исправления groke заработали (Ура!). Спасибо groke и Darwin.
    Но, как я уже говорил, хочется перейти на IDA 6.8, а тут засада (для меня лично) с установкой Питона в корень диска С (Darwin, оно то все работает). Скажите, пожалуйста, если я удалю Питон из диска С и установлю его из дистрибутива той же версии (который позволяет выбрать путь установки), то как мне "объяснить" IDA где теперь установлен Питон?

  18. #15
    Darwin's Avatar

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Вы сколько времени жалуетесь на Питон в корне диска С:\ ? Вам трудно удалить, установить наново и посмотреть будет работать или нет? Я не понимаю...

    Пробуйте, удалить, должно работать!

    Найдет ваш питон IDA, без ваших телодвижений.
    Счастлив кто отдал, а не взял. (с) Inception

  19. #16

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Quote Originally Posted by Darwin View Post
    Найдет ваш питон IDA, без ваших телодвижений.
    Спасибо большое. Все получилось и работает. Теперь, как и писал, сделаю реверс, содам ассемблерный файл и скомпилирую его в IAR. Далее сравню с исходником. Может еще ошибки в скрипте МСП обнаружатся. О результатах отпишусь.

  20. #17

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Ну что. Небольшой отчет. Для начала я решил посмотреть как IDA 6.8 с подправленным файлом msp430.py дизассемблирует прошивку от "обычного" (то есть не с 20-ти битной адресацией) процессора MSP430F149, которую я раньше реверсил с помощью IDA 6.1. Результат немного не впечатлил. Как только я загрузил прошивку в IDA, она тут же начала его рьяно разбирать на инструкции не обращая в некоторых местах на то, что в там расположены не инструкции, а данные. Видимо в результате этого один раз при автоанализе выдалось сообщение об ошибке, приведенное внизу. Еще одной неприятной вещью стало то, что инструкция вида BR #1234h интерпретируется как MOV #1234h, PC. Я конечно понимаю, что это одно и то же, но все же. Вопрос, можно ли отключить автоанализ и разбирать код самому?

  21. #18

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Quote Originally Posted by d7d1cd View Post
    Вопрос, можно ли отключить автоанализ и разбирать код самому?
    <IDA68 home>\cfg\ida.cfg
    //-------------------------------------------------------------------------
    //
    // Analysis parameters
    //
    //-------------------------------------------------------------------------

    ENABLE_ANALYSIS = YES // Background analysis is enabled

    Заменить на NO

  22. Пользователь сказал cпасибо:
    d7d1cd (26-07-2017)
  23. #19

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Повозился я с IDA 6.8. Не нравится мне ее слишком агрессивный метод анализа. Весь код распознается либо как инструкции, либо как данные. Не распознанных мест нет. И все бы ничего, но в некоторых местах инструкции распознаются как данные, а данные - как инструкции. Отключение автоанализа усложнило работу с другой стороны: дизассемблирование идет медленно, так как надо самому указывать что дизассемблировать.
    В IDA 6.1 автоанализ не такой напористый. Если где-то есть сомнения, то код остается не распознанным. Мне это удобнее, а может все от того, что раньше я работал именно с версией 6.1. Поэтому далее буду работать с этой версией IDA.
    Необходимые изменения в файл msp430.py я внес. Если декодированную инструкцию представить примерно в таком виде movx.w 1ED56h(R15), &376h, то все правильно, однако если заменить адрес на имя, то получается бред: movx.w unk_ED56(R15), &376h (правильно должно быть: movx.w word_1ED56(R15), &376h). Кроме этого, схожая проблема наблюдается с инструкциями вида calla #11796h. Вместо имени функции отображается либо ее адрес, либо что-то в виде #unk_D498. Можно это как-то побороть?

  24. #20

    Default Re: IDA 6.8. Ошибка в скрипте MSP430.py

    Можно сначала запустить автоанализ на 6.1, а потом открыть эту базу в 6.8.

Closed Thread

Tags for this 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