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