R0 CREW

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

Приветствую!
Можете приложить байты неправильно декодируемой инструкции? Под рукой нет инструментов для транслирования в машинный код :frowning:

И, на всякий случай, и машинное представление правильно кодируемой инструкции.

Подозреваю что проблема в этом месте:

def is_movpc(self):
    # mov xxx, PC
    return self.cmd.itype == self.itype_mov and self.cmd.Op2.is_reg(self.ireg_PC) and self.cmd.auxpref == AUX_WORD

Из-за того что мы модифицируем auxpref (в правках оригинального скрипта из прошлой темы) у нас последнее условие не срабатывает и IDA не распознает что это инструкция меняющяя PC
Можно заменить на следующий код:

def is_movpc(self):
    # mov xxx, PC
    return self.cmd.itype == self.itype_mov and self.cmd.Op2.is_reg(self.ireg_PC) and ((self.cmd.auxpref & 0x7f) == AUX_WORD)

Попробуйте найти следующие строчки в скрипте

            self.itype_movx: [
                # movx #0, dst -> clrx dst
                [ lambda: is_imm_op(self.cmd.Op1, 0), self.itype_clrx, 2 ],
            ],

и заменить на следующий код:

            self.itype_movx: [
                # movx #0, dst -> clrx dst
                [ lambda: is_imm_op(self.cmd.Op1, 0), self.itype_clrx, 2 ],
                [ lambda: is_autoinc(self.cmd.Op1, self.ireg_SP), self.itype_popx, 2 ],
            ],

Я так понимаю в функции simpilfy словарь maptbl как раз определяет список замен инструкций на эмулируемые.

После этой правки у меня эти байты отображается как popx.w &300h

Надо заменить

def init_instructions(self):
        Instructions = []
        i = 0
        for x in self.instruc:
            if x['name'] != '':
                setattr(self, 'itype_' + x['name'], i)
            else:
                setattr(self, 'itype_null', i)
            i += 1

на

def init_instructions(self):
        Instructions = []
        i = 0
        for x in self.instruc:
            if x['name'] != '':
                setattr(self, 'itype_' + x['name'].lower(), i)
            else:
                setattr(self, 'itype_null', i)
            i += 1

Но это если мы в том самом массиве руками заменим имена.

Возможно, в функции out можно добавить где-нибудь приведение к верхнему регистру и тогда не придется заменять все в том самом массиве

Прошу прощения - второй способ наверное все-таки будет потруднее, потому что код который надо будет править находится в стандартном классе Иды - processor_t

Все-таки придется в массиве instruc поменять имена и изменить код, как я написал выше :frowning:

  • в функции out поменять постфиксы “.a” … на “.A”

p.s - приведение к верхнему регистру функция .upper() в питоне

Рад помочь:)
Сам когда-то пытался ковырять прошивку от фитнес браслета на msp430, но как-то со временем не вышло:(
Правильно ли я понял, что задача состоит в том, чтобы просто автоматически проименовать определенные адреса в базе?
Если да, то можно сделать простенький скрипт на питоне следующего вида:

MakeName(addr1, "name1")
MakeName(addr2, "name2")
...

Затем загрузить его по alt+f7

Чтобы выбирать между байтом, словом или двойным словом есть функции MakeByte(addr), MakeWord(addr), MakeDword(addr)

Вот с этим подсказать не смогу:(
Ни разу не пытался, а в настройках вроде такого не нашел

Word(addr), Byte(addr), Dword(addr)

Изучайте документацию по API:
https://www.hex-rays.com/products/ida/support/idapython_docs/

Надо использовать дебаггер. Есть стандартный pdb, но простое pdb.runcall(…) не работает из-за особенностей консоли в IDA, по идее, можно в классе pdb.Pdb задать пайпы на input и output, и посылать команды из другой консоли.
Ещё есть ссылки типа таких http://wingware.com/doc/howtos/idapython.

Не знаю как в IDA Python, а в IDC OpOffset это макрос для совместимости который фактически вызывает встроенную функцию OpOff с тремя параметрами
#define OpOffset(ea, base) OpOff(ea,-1,base)

А в описании к ней все понятно, хотя БАЗА она и есть БАЗА если речь идет о смещении (быстро все привыкли к плоской модели памяти) :slight_smile:
// Convert operand to an offset
// ea - linear address
// n - number of operand
// 0 - the first operand
// 1 - the second, third and all other operands
// -1 - all operands
// base - base of the offset as a linear address
// If base == BADADDR then the current operand becomes non-offset
// Example:
// seg000:2000 dw 1234h
// and there is a segment at paragraph 0x1000 and there is a data item
// within the segment at 0x1234:
// seg000:1234 MyString db ‘Hello, world!’,0
// Then you need to specify a linear address of the segment base to
// create a proper offset:
// OpOff(MK_FP(“seg000”,0x2000),0,0x10000);
// and you will have:
// seg000:2000 dw offset MyString

success OpOff (long ea, int n, long base);

Во первых, не понятно, что у вас установлено в ИДА, что перекрываются стандартные пункты меню USCIAB1TX_VECTOR.

А, во вторых, не понятно в чем у вас проблема, т.к. не понятно какая среда, какая модель памяти, какая система адресации. Я в своих проектах вообще использую OpOffEx, где 6 параметров и можно к любому режиму приладить.
Вот мультик про использование OpOff на плоской модели памяти архитектуры х86 (2й операнд, n = 1, плоская модель, база = 0).
[ATTACH]257[/ATTACH]

Исправил, все отображается как надо. Спасибо Вам! Буду изучать далее. Может еще будут недочеты…

This post was flagged by the community and is temporarily hidden.