IDA Pro меняет цвет переменных в псевдокоде

Очень простой плагин Ida Pro, который меняет цвет MyVar123 внутри окна псевдокода.

Проблема в том, что этот подход ограничен использованием констант ida_lines.SCOLOR_... для цвета. Как определить свой собственный цвет текста, например. #00FF00 или как-то иначе?

Я прочитал SDK и не нашел функции, отвечающей за пользовательские цветовые коды.

import idaapi, ida_kernwin, ida_lines

class ColorizeVariable(ida_kernwin.action_handler_t):

    def __init__(self):
        ida_kernwin.action_handler_t.__init__(self)

    def activate(self, ctx):

        if ida_kernwin.get_widget_type(ctx.widget) == ida_kernwin.BWN_PSEUDOCODE:
            vu = idaapi.get_widget_vdui(ctx.widget)
            pc = vu.cfunc.get_pseudocode()


            find = "MyVar"

            vu.refresh_view(False)


            for sl in pc:
                sl.line = sl.line.replace(find, ida_lines.COLSTR(find, ida_lines.SCOLOR_DNAME))
                #sl.line = sl.line.replace(find, f'{ida_lines.COLOR_ON}{ida_lines.COLOR_CHAR}{find}{ida_lines.COLOR_OFF}{ida_lines.COLOR_CHAR}')  # broken
                #sl.line = sl.line.replace(find, f'{ida_lines.COLOR_ON}\x0A{find}{ida_lines.COLOR_OFF}\x0A')  #working
                #sl.line = sl.line.replace(find, f'\1\x0A{find}\2\x0A')  #short version

        return 0

    def update(self, ctx):
        return ida_kernwin.AST_ENABLE_ALWAYS




class ida_plugin_container(idaapi.plugin_t):

    flags         = idaapi.PLUGIN_UNL
    comment       = 'plugin comment'
    help          = 'help message'
    wanted_name   = "myPlugin"
    wanted_hotkey = 'Shift-Q'

    def init(self):

        action_desc = idaapi.action_desc_t(
            'myAction',
            'Colorize Variable',
            ColorizeVariable(),
            'Ctrl+R',
            'Colorize Variable in Pseudocode',
            10)

        ida_kernwin.unregister_action('myAction')
        ida_kernwin.register_action(action_desc)

        ida_kernwin.attach_action_to_toolbar("SearchToolBar", 'myAction')
        print('loaded')
        return idaapi.PLUGIN_OK


    def run(self, arg):
        pass


    def term(self):
        pass

def PLUGIN_ENTRY():
    return ida_plugin_container()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Цвет текста в окне псевдокода IDA Pro, вы можете использовать функцию set_node_info2. из Модуль idaapi для создания пользовательского цветного текста. Это позволяет вам указать свой собственный цвет, используя значения RGB или шестнадцатеричные значения.

Проверьте этот пример: `import idaapi импортировать ida_kernwin импортировать ida_lines

класс ColorizeVariable(ida_kernwin.action_handler_t):

def __init__(self):
    ida_kernwin.action_handler_t.__init__(self)

def activate(self, ctx):

    if ida_kernwin.get_widget_type(ctx.widget) == ida_kernwin.BWN_PSEUDOCODE:
        vu = idaapi.get_widget_vdui(ctx.widget)
        pc = vu.cfunc.get_pseudocode()

        find = "MyVar"

        for sl in pc:
            sl.line = sl.line.replace(find, f'<color=#00FF00>{find}</color>')

        vu.refresh_view(False)

    return 0

def update(self, ctx):
    return ida_kernwin.AST_ENABLE_ALWAYS 

класс ida_plugin_container(idaapi.plugin_t):

flags         = idaapi.PLUGIN_UNL
comment       = 'plugin comment'
help          = 'help message'
wanted_name   = "myPlugin"
wanted_hotkey = 'Shift-Q'

def init(self):

    action_desc = idaapi.action_desc_t(
        'myAction',
        'Colorize Variable',
        ColorizeVariable(),
        'Ctrl+R',
        'Colorize Variable in Pseudocode',
        10)

    ida_kernwin.unregister_action('myAction')
    ida_kernwin.register_action(action_desc)

    ida_kernwin.attach_action_to_toolbar("SearchToolBar", 'myAction')
    print('loaded')
    return idaapi.PLUGIN_OK

def run(self, arg):
    pass

def term(self):
    pass

защита PLUGIN_ENTRY(): вернуть ida_plugin_container() `

ida_graph.set_node_info2() был переименован в ida_graph.set_node_info() начиная с версии 7.4, я использую версию 8.3, согласно этому сайту, вы привели пример кода о том, как его использовать. Вы хотя бы тестировали этот код? Похоже, ответ от ChatGPT <color=#00FF00>{find}</color> не работает.

Roman Toasov 24.06.2024 10:32
Ответ принят как подходящий

Кажется, нет возможности использовать цветовые коды RGB или какие-либо другие способы указания пользовательского цвета?

Читаю этот документ

Типичная последовательность цветов выглядит так:

COLOR_ON COLOR_xxx текст COLOR_OFF COLOR_xxx

Первые два элемента включают цвет «xxx», затем следует текст и цвет отключается двумя последними пунктами.

я обнаружил дополнительный способ использования предопределенных цветовых кодов Константы COLOR_xxx (они не работают в IDA 8.3 или я не знаю, как их правильно использовать).

Пример этой строки (также в примере кода выше) не работает.

sl.line.replace(find, f'{ida_lines.COLOR_ON}{ida_lines.COLOR_CHAR}{find}{ida_lines.COLOR_OFF}{ida_lines.COLOR_CHAR}')

Рабочий способ использования предопределенных цветовых кодов:

sl.line.replace(find, f'{ida_lines.COLOR_ON}\x0A{find}{ida_lines.COLOR_OFF}\x0A')

где ida_lines.COLOR_ON — открывающий тег цвета, \x0A — код цвета (предопределенные цвета находятся между шестнадцатеричными значениями \x01 и \x27), ida_lines.COLOR_OFF закрывающий тег цвета, \x0A повторяющийся тег цветового кода (требуется ida).

Укороченная версия:

sl.line.replace(find, f'\1\x0A{find}\2\x0A')

Хорошо, что цвета можно переопределить с помощью меню «Параметры» > «Цвета» > «Разборка» в раскрывающемся списке «Цвета текста».

Настройки сохраняются в файл %APPDATA%\Hex-Rays\IDA Pro\themes\dark\user.css

Вот цветовой код для отображения пунктов меню.

Color #  HEX     COLOR_xxx               IDA Menu Item                        CSS Class                         
1        '\x01'  COLOR_DEFAULT           Default                              qproperty-line-fg-default         
2        '\x02'  COLOR_REGCMT            Regular comment                      qproperty-line-fg-regular-comment 
3        '\x03'  COLOR_RPTCMT            Repeatable commen                    qproperty-line-fg-repeatable-comment
4        '\x04'  COLOR_AUTOCMT           Automatic comment                    qproperty-line-fg-automatic-comment
5        '\x05'  COLOR_INSN              Instruction                          qproperty-line-fg-insn            
6        '\x06'  COLOR_DATNAME           Dummy Data Name                      qproperty-line-fg-dummy-data-name 
7        '\x07'  COLOR_DNAME             Regular Data Name                    qproperty-line-fg-regular-data-name
8        '\x08'  COLOR_DEMNAME           Demangled Name                       qproperty-line-fg-demangled-name  
9        '\x09'  COLOR_SYMBOL            Punctuation                          qproperty-line-fg-punctuation     
10       '\x0A'  COLOR_CHAR              Char constant                        qproperty-line-fg-charlit-in-insn 
11       '\x0B'  COLOR_STRING            String constant                      qproperty-line-fg-strlit-in-insn  
12       '\x0C'  COLOR_NUMBER            Numeric constant                     qproperty-line-fg-numlit-in-insn  
13       '\x0D'  COLOR_VOIDOP            Void operand                         qproperty-line-fg-void-opnd       
14       '\x0E'  COLOR_CREF              Code reference                       qproperty-line-fg-code-xref       
15       '\x0F'  COLOR_DREF              Data reference                       qproperty-line-fg-data-xref       
16       '\x10'  COLOR_CREFTAIL          Code reference to tail byte          qproperty-line-fg-code-xref-to-tail
17       '\x11'  COLOR_DREFTAIL          Data reference to tail byte          qproperty-line-fg-data-xref-to-tail
18       '\x12'  COLOR_ERROR             Error or problem                     qproperty-line-fg-error           
19       '\x13'  COLOR_PREFIX            Line prefix Regular function         qproperty-line-pfx-func           
20       '\x14'  COLOR_BINPREF           Opcode bytes                         qproperty-line-fg-opcode-byte     
21       '\x15'  COLOR_EXTRA             Extra line                           qproperty-line-fg-extra-line      
22       '\x16'  COLOR_ALTOP             Alternative operand                  qproperty-line-fg-alt-opnd        
23       '\x17'  COLOR_HIDNAME           Hidden name                          qproperty-line-fg-hidden          
24       '\x18'  COLOR_LIBNAME           Library function name                qproperty-line-fg-libfunc         
25       '\x19'  COLOR_LOCNAME           Local variable name                  qproperty-line-fg-locvar          
26       '\x1A'  COLOR_CODNAME           Dummy code name                      qproperty-line-fg-dummy-code-name 
27       '\x1B'  COLOR_ASMDIR            Assembler directive                  qproperty-line-fg-asm-directive   
28       '\x1C'  COLOR_MACRO             Macro                                qproperty-line-fg-macro           
29       '\x1D'  COLOR_DSTR              String constant in data directive    qproperty-line-fg-strlit-in-data  
30       '\x1E'  COLOR_DCHAR             Char constant in data directive      qproperty-line-fg-charlit-in-data 
31       '\x1F'  COLOR_DNUM              Numeric constant in data directive   qproperty-line-fg-numlit-in-data 
32       '\x20'  COLOR_KEYWORD           Keywords (offset, byte ptr, near)    qproperty-line-fg-keyword         
33       '\x21'  COLOR_REG               Register name                        qproperty-line-fg-register-name   
34       '\x22'  COLOR_IMPNAME           Imported name                        qproperty-line-fg-import-name     
35       '\x23'  COLOR_SEGNAME           Segment name                         qproperty-line-fg-segment-name    
36       '\x24'  COLOR_UNKNAME           Dummy unknown name                   qproperty-line-fg-dummy-unknown-name
37       '\x25'  COLOR_CNAME             Regular Code Name                    qproperty-line-fg-code-name       
38       '\x26'  COLOR_UNAME             Regular Unknown Name                 qproperty-line-fg-unknown-name    
39       '\x27'  COLOR_COLLAPSED         Collapsed line                       qproperty-line-fg-collapsed-line  

Другие вопросы по теме