Как стать автором
Обновить

Комментарии 16

Спасибо, обязательно попробую на досуге, с таблицами виртуальных прямо то, что надо. Напомнило HexRaysCodeXplorer, который регулярно выручает, но как я понимаю, если взять вместе с ClassInformer у вас тут функционал покруче.

Раз уж делаете трансформации кода, и есть предложения по feature requests, не добавите code folding? Я пользуюсь Hexlight, конечно, но иногда так и тянет убрать большой блок, чтобы не маячил перед глазами. Впрочем, настаивать не буду.
Я задумывался об этом и есть идея, как реализовать. Но там кое-какие проблемы, например, как сделать адекватное автооткрытие при отладке. Впрочем в отладочном режиме можно пока что все в развёрнутом режиме держать. Попробую добавить, как с дипломом разберусь.

Есть "Collapse/uncollapse item" (https://www.hex-rays.com/products/decompiler/manual/interactive.shtml). Не то ли это что вам нужно?


В любом случае, code folding, как мне кажется, это не трансформация кода. Дерево же при этом не меняется, просто скрываются отдельные его части при отображении.

Вот, добрался до IDA:

image

Тут сразу напрашивается feature request. Иногда в коде встречается слишком много inline функций. Приходилось разбирать бинарник где чуть ли не в каждой десятой строчке был заинлайнен деструктор строк. Удобно было бы скрыть их все автоматически. В идеале их хорошо бы вообще вынести отдельно, но это уже более сложная задача.
Спасибо однако, сколько лет пользуюсь, никогда не догадывался залезть в ман/ткнуть непосредственно по if/while. Хотя реализация в очередной раз не самая приятная, можно было раскрытие хотя бы по двойному клику сделать, это прогресс.

А вот сокрытие произвольных областей по маске было бы интересно, не часто вижу обфусцированный код, но полагаю, там особенно актуально.
Там же хоткей есть. Если не нравится стандартный — можно поменять. Мне кажется вполне удобно.

Перестройка дерева довольно мудрено сделана в IDA — там нужно унаследовать класс, у которого паттерн Visitor. Затем, в процессе обхода всего дерева, распознать то, что хотим изменять и там же или отдельным классом-наследником Visitor перестроить дерево. Можно у меня посмотреть как это делается с отрицательными смещениями и переворачиванием условий в конструкции if. В общем, каждый такой случай, который хочется скрывать скорее всего придется программировать отдельно (впрочем можно этому научиться и, если потратив на это некоторое время, можно будет потом сэкономить гораздо больше, то это стоит того)


Насчет folding. Ида прячет сразу всё, но хотелось бы всё же условие у for, while и if видеть и иметь возможность отдельно True и False ветки сворачивать.

Есть неочевидные вещи, например, IDA Pro будет падать, если не отключать Garbage Collector для объектов, добавленных с помощью idaapi в абстрактное синтаксическое дерево

Какое-то время назад при реверсинге прошивки под ARM столкнулся с тем, что Hex-Rays не распознает одну инструкцию и оставляет ее в asm {}. Она использовалась повсюду и это очень сильно портило код. Попытался написать плагин, который бы заменял эти блоки asm {}. Но как только я стал добавлять свои узлы в дерево — IDA сразу падала. Никогда бы не подумал что проблема может быть в Garbage Collector.


В итоге проблему решил, заменив везде инструкцию на аналогичную, с которой у Hex-Rays было все в порядке. Но тут можно сказать повезло, так как такой могло и не оказаться.

Я сначала придумал костыль в виде хранения объектов в глобальном массиве, чтобы Garbage Collector их не трогал и их число постоянно росло в ходе сессии, но потом обнаружил, что у Swig-объектов создаваемых IDA, есть поле thisown и, если поставить туда False, то изменение дерево больше не приводит к крашам.
Можно было бы, используя стандартную опцию "map to another variable", избавиться от них. Но это не всегда удобно при отладке, может быть ошибочно и к тому же невозможно откатить не пересоздавая функцию заново.

Почему невозможно? Есть же "unmap variable": https://www.hex-rays.com/products/decompiler/manual/cmd_map_lvar.shtml

Действительно, как-то я его прозевал
Здравствуйте! Сколько примерно времени заняло написание и отладка данного плагина?
Где-то 2 — 2.5 месяца очень плотно сидел и затем на протяжении полугода иногда что-то фиксил и потихоньку добавлял.
Автор, это очень классно, я так не умею). А как вообще пишутся плагины для IDA?
Могу посоветовать:
— «IDA Pro Book, 2nd Edition» https://www.nostarch.com/idapro2.htm
— «The Beginner's Guide to IDAPython» hooked-on-mnemonics.blogspot.ru/2015/04/the-beginners-guide-to-idapython.html
— «Gray Hat Python» https://www.nostarch.com/ghpython.htm
— Читать код чужих плагинов
Зарегистрируйтесь на Хабре, чтобы оставить комментарий