GHIDRA vs. IDA Pro


    Приветствую,


    Думаю, пришла пора. Наболело/накипело/есть мнение. С выходом Гидры ситуация с инструментарием для реверс-инженеров достаточно сильно изменилась. Если раньше выбора чем пользоваться особо не было (здесь не будут упоминаться Binary Ninja, Hopper, JEB или Radare2, потому как в известных мне ИБ-компаниях и комьюнити ими пользуется очень малое количество человек, либо же порог вхождения в некоторые (привет, Радар) очень высок, либо же покрытие архитектур ограничено лишь x86/x64/ARM/ARM64/MIPS), то теперь мы имеем очень мощного конкурента Hex-Rays в лице АНБ с их GHIDRA.


    Но так ли Гидра хороша? Так ли плоха IDA (или наоборот)? Давайте разбираться. В данной "статье" я постарался свести все плюсы и минусы обоих инструментов. У меня не было цели сказать, что тот или другой инструмент лучше — выводы делайте сами. К тому же, и один и второй инструмент развиваются. И статья будет содержать лишь результаты сравнения на момент написания. Сравнение будет производиться по следующим категориям:


    1. Поддерживаемые архитектуры
      Если вы — реверс-инженер, работающий только с Intel-платформами (x86/x64), то наличие всех остальных для вас не имеет особого значения. Но, если вам приходится работать с множеством различных файлообменников архитектур, то чем больше их будет в дефолтной поставке, тем лучше.
    2. Поддерживаемые форматы
      То же самое, что и в предыдущем пункте, только касаемо форматов данных.
    3. Качество декомпиляции
      Чуть ли не самый нужный и важный компонент — декомпилятор. От одного только дизассемблера смысла особо нет, поэтому здесь — обзор того, что умеет/выдаёт Ghidra/IDA.
    4. Расширяемость функционала, SDK/API
      Реверс-инженерам, работающим с различными архитектурами, форматами, и выполняющим множество однотипных задач регулярно, важно иметь возможность быстро и удобно писать дополнительные модули/загрузчики/скрипты. Также, было бы хорошо иметь возможность
      их отлаживать. Посмотрим, как обстоят дела у каждого из продуктов.
    5. Документация
      Казалось бы, зачем она нужна? Мы уже все давно привыкли к горячим клавишам, нашли маны по написанию плагинов и т.п., в интерфейсе тоже разобрались. Но, как много на это ушло времени? С документацией, особенно качественной, сделать это получится быстрее и спокойнее.
    6. Отладчик (для исследуемых файлов)
      Важный и необходимый компонент для среды реверс-инжиниринга. В статике тоже можно, но в динамике всяко проще.
    7. Скорость анализа файлов
      Если дело касается очень больших файлов (от 10 МБ и больше), важно, чтобы среда для реверс-инжиниринга не заставляла уходить пить чай, ложиться спать, пока идёт анализ файла.
    8. Удобство работы (интерфейс, горячие клавиши, ориентированность на ввод с клавиатуры)
      Несмотря на то, что главное — функционал, то, как он подаётся пользователю, как он выглядит, играет немаловажную роль. Если интерфейс позволяет не использовать для часто используемых формочек и команд мышь, это плюс. Если же нужно продираться через кучу окон для того, чтобы добавить входной аргумент в функцию, это уже минус. Сравним.
    9. Выход новых версий
      То, как быстро фиксятся баги, добавляются новые фичи, а, соответственно, выходят новые версии, является показателем хорошей команды разработчиков и серьёзного подхода.
    10. Сложность получения дистрибутива
      Купить, скачать, собрать дистрибутив — это всё здесь.
    11. Поддержка
      Вы хотите сообщить об ошибке авторам, предложить новую фичу, или же просто о чём-то спросить — всё это о саппорте. Разберёмся, кто лучше — платный, или бесплатный продукт.
    12. Комьюнити
      Наличие комьюнити, и возможности с ним пообщаться, обсудить проблемы разработки, вопросы по функционалу, или просто получить дельный совет от знающих людей (не разработчиков) — это вот и есть комьюнити.
    13. Совместная работа над проектом
      Работа нескольких человек над одним проектом достаточно важный пункт, чтобы его игнорировать.

    Сравнение


    1. Поддерживаемые архитектуры (IDA)


    Из коробки IDA Pro поддерживает очень большое количество процессоров и их модификаций. Список внушает уважение: https://hex-rays.com/products/ida/processors.shtml
    Список процессоров отличается для Starter и Professional Edition, 64-bit поддерживается только в Pro-версии (а также в демо-версии, спасибо slinkinone). Платформы в последней достаточно редкие, но, тем не менее.


    Если работа не ориентирована на IoT, то хватит и Starter, иначе — придётся покупать Pro-версию.
    Декомпиляция имеется лишь для x86/x64/arm/arm64/PowerPC, в первой половине следующего года обещают выкатить декомпилятор MIPS.


    1. Поддерживаемые архитектуры (GHIDRA)


    Онлайн версии списка нет, поэтому привожу его здесь:



    Здесь список представлен в виде базовых процессоров (без модификаций), но это не значит, что они не поддерживаются. Декомпиляторы имеются для каждого из процессорных модулей.


    2. Поддерживаемые форматы (IDA)


    Список форматов здесь: https://hex-rays.com/products/ida/file_formats.shtml


    Список достаточно большой. Плюс есть плагины от комьюнити, которые никогда не будут добавлены в коробку, т.к. для этого нужно будет обсудить данный момент с Ильфаком Гильфановым (главным разработчиком).


    2. Поддерживаемые форматы (GHIDRA)


    Список форматов 1
    • android
      1. apk
      2. bootimg
      3. dex
      4. kernel
      5. odex
      6. xml
    • bplist
    • coff
    • complzss
    • cpio
    • ext4
    • gzip
    • ios
      1. apple8900
      2. btree
      3. decmpfs
      4. dmg
      5. dyldcache
      6. generic
      7. ibootim
      8. img2
      9. img3
      10. img4
      11. ipsw
      12. png
      13. prelink
      14. xattr
    • iso9660
    • java
    • lzss
    • omf
    • sevenzip
    • sparseimage
    • tar
    • ubi
    • xar
    • yaffs2
    • zip
    • zlib

    Список форматов 2
    • coff
    • dwarf
    • dwarf4
    • elf
    • lx
    • macho
    • macos
    • mz
    • ne
    • objc2
    • objectiveC
    • omf
    • pdb
    • pe
    • pef
    • ubi
    • xcoff

    Список выше — это лишь список каталогов в https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats
    Другой список файлов здесь: https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format


    3. Качество декомпиляции (IDA)


    Декомпилятор у Иды замечательно работает с x86/x64/arm/arm64 кодом (про PowerPC сказать не могу, т.к. не доводилось встречаться), который был сгенерирован каким-либо стандартным компилятором, выдаёт в большинстве своём аккуратный C-листинг.


    Разработчики изначально ориентировались на MS-DOS код, поэтому учитываются артефакты даже довольно старых компиляторов (отсюда в интерфейсе во многих окнах имеются сегменты, сегментные регистры, es/ds/ss/fs/gs (ds — даже на MIPS!)), вплоть до вполне новых. Правда со включенными оптимизациями компиляторов IDA справляется не так хорошо, и выхлоп превращается в ад.


    С кодом, написанном на неизвестном для Иды компиляторе (либо на ассемблере), результаты становятся совсем плохими: использование нестандартной calling convention превращает декомпилированный листинг в практически нечитаемый набор строк.


    Необходимость задавать нужные регистры вручную в строке ввода прототипа функции через __usercall с её @ и <>, с одной стороны — большой минус, особенно, когда регистров много, а с другой — у Гидры такого нет, и там — только через GUI, что не всегда удобно, если количество используемых регистров мало.


    3. Качество декомпиляции (GHIDRA)


    Я не знаю людей, которые скажут, что декомпилятор Гидры классный. Тут за радость скорее то, что он вообще есть, и есть для каждого поддерживаемого процессора!


    У декомпилятора Гидры много непривычного глазу пользователя Иды мусора в выдаваемом коде, что часто отвлекает от понимания сути происходящего в нём.


    Зато у декомпилятора Гидры есть одна замечательная особенность — он обладает эмулятором инструкций, что позволяет ему выбрасывать мусор, который не используется и никогда не будет вызван, с одновременным упрощением некоторых моментов.


    Также декомпилятору Гидры всё равно, в каких регистрах приходят аргументы — если к ним идёт обращение, они будут использованы.


    Тут хотелось бы отметить, почему у Гидры или у Иды имеются свои особенные проблемы с декомпиляцией. Дело в ориентированности каждого из продуктов. IDA, как я уже отмечал выше, создавалась с ориентацией на MS-DOS и, в целом, на x86, затем постепенно покрывая x64 и ARM. Отсюда просто замечательное качество выхлопа для указанных платформ, но абсолютно никакое покрытие других.
    У Гидры наоборот — она создавалась с целью реверс-инжиниринга IoT-устройств. Отсюда большое количество поддерживаемых процессоров, внятное описание каждого из них, и простая возможность создавать новые. Но, из-за того, что разработчики старались покрыть множество архитектур, улучшение выхлопа декомпилятора не стало приоритетной задачей.

    4. Расширяемость функционала (IDA)


    Ида позволяет писать загрузчики, плагины, отладчики и процессорные модули, а также скрипты прямо в интерфейсе. Некоторые можно писать и на питоне, что немного удобнее (через плагин IDAPython, написанный не разработчиками IDA, автор — Elias Bachaalany).


    Процесс разработки плагинов во времена версий 6.x был достаточно сложным, т.к. вменяемая документация отсутствовала. Теперь времена изменились, написать своё поделие стало проще. Имеется контест, проводимый каждый год, где разработчики выбирают лучший на их взгляд плагин (а взгляд довольно таки спорный). Например, в последнем контесте победил, никогда не угадаете какой сократитель расширитель функционала… Им оказался плагин, который УБИРАЕТ поддержку Undo в IDA! Просто нет слов. Об этой возможности разработчиков просили так долго, но, пока не вышла GHIDRA, никто и пальцем шевелить не хотел. А теперь — пожалуйста, убрать крутую фичу плагином — Вы выиграли, поздравляем!


    Отладка плагинов производится легко, особенно если он был написан на C++. Отлаживать скрипты на питоне или IDC — уже сложнее, и официального способа нет.


    Очень сильная боль в заднем проходе началась, когда в версии 7.0 практически полностью переписали API, сделав его несовместимым со старыми версиями. С одной стороны, названия функций сделали понятнее, поубирали лишние аргументы, разработка стала проще. Но, если вы, как и я, разрабатывали плагины ещё для версий 6.x, и потребовался перенос вашего детища на свежий SDK, то, головная боль была вам обеспечена.


    А потом в версии 7.1 снова произошли изменения, и всё нужно было чинить по-новой.


    4. Расширяемость функционала (GHIDRA)


    Ghidra написана на Java (с декомпилятором на C++), с поддержкой скриптинга на Python (через Jython). В стандартной поставке имеется плагин GhidraDev для Eclipse, позволяющий создавать шаблоны проектов (который можно импортировать потом в IntelliJ IDEA). Авто-дополнение в IDE и документация работает прекрасно и, на то, чтобы разобраться с написанием своего первого плагина уйдёт от силы полчаса.


    К тому же, в базовой поставке имеется множество скриптов, которые были написаны чуть ли не на все возможные случаи применения. Их же можно и исправить, если нужно.


    С помощью Eclipse удобно отлаживать свои проекты прямо во время разработки.


    5. Документация (IDA)


    Документация IDA — её слабое место, и так повелось уже давно. Как и у большинства разработчиков, уклон идёт в функционал, нежели в его документирование. Отсюда и скудный HLP-файл, идущий в поставке.


    Книга "IDA Pro Book" была написана не разработчиками, и выходила только для 6-й версии. С тех пор новых книг не выпускалось, мануалов по разработке плагинов от разработчиков нет.


    Где-то с версии 7.0 документация начала обрастать веб-версией, и скудным описанием API-функций из SDK.




    5. Документация (GHIDRA)


    Документация у Гидры, в отличие от Иды, писалась одновременно с разработкой. Отсюда, мы имеем комментарии к практически каждой вызываемой функции API, элементам перечислений, и классам. Справочный файл, идущий в поставке, и описывающий интерфейс и настройки Гидры, также выполнен добротно, со скриншотами и примерами для, фактически, каждой кнопки или пункта меню.




    6. Отладчик (IDA)


    ДА, он есть. И он работает. Windows, Linux, MacOS, плюс возможность приконектиться по gdb. По поводу последнего: для большинства нестандартных платформ приходилось писать собственный модуль-отладчик, теперь же есть возможность отлаживаться через gdb для таких платформ, как: x86/x64, ARM/AArch64, PowerPC, MIPS, Motorola 68k, Infineon TriCore, Renesas RH850. Полный список здесь: https://hex-rays.com/products/ida/debugger/index.shtml#details


    6. Отладчик (GHIDRA)


    Увы, но отладчика в публичном доступе пока нет. В доках на WikiLeaks были упоминания некоторых отладочных модулей. Тем не менее, известно о том, что в АНБ работают над этим, и отладчик будет!


    Пока же, через плагины, расширяющие возможности интерфейса, есть возможность написать свой отладчик. Но, судя по всему, никто этого не делает.


    7. Скорость работы (IDA)


    Над большими файлами Ида пыхтит куда меньше Гидры, но далеко не всегда. Анализатор Иды работает в однопоточном режиме, и на больших файлах одно ядро целиком загружено, пока остальные простаивают. В ближайшем будущем авторы менять это не собираются (из слов разработчиков).


    7. Скорость работы (GHIDRA)


    Когда разговор двух реверсеров доходит до обсуждения скорости работы этих Иды и Гидры, каждый приходит ко мнению, что Гидра оооочень долго обрабатывает большие файлы. Хотя и написана с учётом многопоточности. А виной всему Java: плюс к кросс-платформенности, минус к скорости. Тем не менее, если настроить количество памяти, стека и кучи для JVM, а также число потоков, работа слегка ускоряется.


    8. Удобство работы (IDA)


    Несомненно, многие знают горячие клавиши Иды наизусть. Они простые и понятные, часто интуитивные. Многие пункты меню и фичи Иды умеют вызываться с клавиатуры, что вполне удобно.


    Касаемо внешнего вида, до какой-то из версий 6.x использовался самописный графический интерфейс. Далее разработчики полностью перешли на Qt. Интерфейс стал однозначно приятнее. Расположение вкладок, кнопок и элементов интерфейса не менялось уже очень давно.


    Отсюда вытекают и плюсы, и минусы. Плюсы — интерфейс привычный, не нужно искать что где находится, и бороться с привычками. Минусы — некоторые элементы остаются рудиментарными (редактор структур выглядит как наследие именно старых версий Иды) или не используются 90% времени..



    8. Удобство работы (GHIDRA)


    Здесь всё с точностью до наоборот. Новый продукт на рынке, различие горячих клавиш по сравнению с Идой, делают своё дело. Скорость работы, которая за большое время работы с Идой достигла огромной скорости, в Гидре начала проседать. Но, понятное дело, при длительной работе в последней привычки также появляются, и становится не так тяжело.


    Гидра имеет множество меню, количество элементов в которых порой достаточно большое, и не все пункты имеют горячие клавиши. Но, при этом, конфигуратор настроек горячих клавиш позволяет повесить практически на каждую команду свою горячую клавишу.


    Т.к. Ghidra написана на Java, разработчики использовали базовый функционал JDK, а именно Swing. Из-за этого имеем то, что имеем. Но это нельзя назвать минусом Гидры.


    9. Выход новых версий (IDA)


    Вы заметили, что с выходом Гидры новые версии Иды стали выходить чаще? А я вот присмотрелся. Знаете почему? Конечно, дело в конкуренции. Наконец-то она появилась!

    Ранее новые версии Иды выходили достаточно редко, новым функционалом Ида обрастает очень нехотя. После сообщения о баге не стоит ожидать, что исправление, которое вам выслали разработчики, появится и у ваших коллег очень скоро. Системы патчей нет, т.к. разработчики патчат основные файлы под каждого покупателя (ватермарки).


    Думается, что скорость выхода новых версий Иды увеличится из-за конкуренции продуктов.


    9. Выход новых версий (GHIDRA)


    Регулярность выпуска новых версий Гидры достаточно большая: с момента публикации исходников вышло около шести версий.


    Если ждать выхода нового дистрибутива долго, можно собрать master-ветку с github. Первый раз собираться будет больше часа, но, оно того стоит.


    10. Сложность получения дистрибутива (IDA)


    Все знают эту историю: "Ильфак Гильфанов — пиратству бой!". Из-за этого доступ к Pro — и Starter-версиям дистрибутивов для покупки стал очень сложным и муторным. Для простых смертных, у которых нет доступа к бешеным деньгам почтовым ящикам не на публичных почтовых серверах типа gmail, mail.ru и т.п., приобретение дистрибутивов невозможно. И, даже если у вас есть свой ИП, свой сайт, вам придётся пройти множество проверок, выслать сканы, подтверждения и т.д. И всё ради того, чтобы дистрибутив не выложили в интернет. Это не всегда помогает.


    Ликнутые версии появляются, но редко. Потому большинство реверс-инженеров энтузиастов сидит на старых, слитых когда-то дистрибутивах ESET, и китайского антивируса.


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


    10. Сложность получения дистрибутива (GHIDRA)


    Казалось бы, тут писать вообще нечего, но. На самом деле, к основному сайту Гидры доступ из России, Израиля и Китая запрещён. Нужен VPN, или Tor (скорость скачивания соответствующая). На github релизов нет, только исходники.


    11. Поддержка (IDA)


    Сколько мне приходилось общаться с поддержкой Hex-Rays, всегда был разный опыт: часть людей, работающих в саппорте, очень вежливые и всегда готовы помочь. Часть: главный разработчик, и общение становилось грубым. Особенно если мнение не совпадало. Но, наверное это характер такой. То же самое и в общении с пользователями в интернете.


    Недавно выяснилось, что с саппортом из моих знакомых общаюсь только я. Очень старая бага, связанная с потерей выделения при прокрутке, возникшая ещё в версии 6.6, о которой знают все, никогда не была зарепорчена разработчикам. Спросил, в чём же дело. А ответы в стиле: "не хочется общаться с человеком, который так относится к пользователям". Увы, репутация работает именно так.


    Тем не менее, баги и предложения, о которых я сообщал разработчикам, исправлялись, и учитывались (не все).


    11. Поддержка (GHIDRA)


    У Гидры есть репозиторий на github. Там есть issues, и именно туда необходимо сообщать о багах. Скорость ответа на некоторые может быть как очень долгой, так и достаточно быстрой. Но, баги не закрываются просто так, мол, не хотим это реализовывать. Всё рассматривается, учитывается. Каждый желающий может внести свою лепту.


    PR применяются и рассматриваются медленно. Зависит от критичности.


    12. Комьюнити (IDA)


    Его скорее нет, чем есть. Разрозненные разработчики, реверс-инженеры, каждый со своими скриптами и плагинами. Нет специализированных чатиков, каналов, в которых можно было бы поболтать со знающими людьми, спросить совета.


    12. Комьюнити (GHIDRA)


    Здесь всё совершенно иначе: сайты типа ghidra.re, телеграм-группы, типа @GHIDRA, тот же github. На всех этих ресурсах можно задать любой вопрос, и получить на него ответ или помочь в решении.


    13. Совместная работа над проектом (IDA)


    У Иды данная возможность отсутствует из коробки. Вроде были плагины, реализующие данную возможность, но, почему-то, они не прижились.


    13. Совместная работа над проектом (GHIDRA)


    Данный функционал присутствует в Гидре из коробки. Можно создать Гидра-сервер, который будет синхронизировать результаты работы.


    Выводы


    С выходом Гидры многое изменилось. Появилась конкуренция, появилась бесплатная среда для реверс-инжиниринга. Но, это как с Linux в организациях — на внедрение/обучение/переквалификацию нужно время и, если однажды потратить время на всё это, дальше будет легче.


    Плюс немаловажную роль играет стоимость покупки/ежегодного обновления IDA. Не все молодые компании могут себе позволить купить дистрибутив, да ещё с декомпилятором. Да и могут ли они её купить.


    Также, если для вас важна совместная работа над проектами, стоит обратить внимание на Ghidra. Почему данный функционал так и не был реализован в IDA — не понятно.


    Конкуренция — это хорошо. Без неё вообще никак. Я не считаю, что Ghidra лучшая, а IDA — плохая. У каждой из них есть свои плюсы и минусы, но однозначно реверсить малварь легче в Иде, IoT и другие устройства — в Гидре. А выбор всё равно за вами.


    Получилось немного сумбурно, но, тем не менее. Спасибо.


    P.S. Добавил пункт про совместную работу над одним проектом.
    P.P.S. Добавил список форматов 2 и информацию про демо-версию с декомпилятором.
    P.P.P.S. Поправил фамилию разработчика Иды. Правильно Гильфанов. Спасибо netch80.

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Какой RE-инструмент ваш основной?

    • 53,1%IDA Pro102
    • 17,7%Ghidra34
    • 1,6%Binary Ninja3
    • 2,6%Hopper5
    • 9,4%Radare218
    • 8,8%vim/emacs17
    • 6,8%Другой (указать)13

    Средняя зарплата в IT

    110 500 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 7 138 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +1
      Может кто-то упустил — демо версия IDA-ы теперь поставляется с x64 декомпилятором. Если у вас нет непубилчной электронной почты — можно воспользоваться сервисом для генерации email адреса на 10 минут. Хватит чтобы получить письмо по реквесту и скачать демку.
        +2
        Спасибо, добавлю в статью.
          0
          Так то у них и фриваре есть, скачивается без всяких почт — IDA Freeware

          • no commercial use is allowed
          • lacks all features introduced in IDA > v7.0
          • lacks support for many processors, file formats, etc...
          • comes without technical support


          Я именно ей и … эмм… добавлял функционал в один САПР (эх, когда-нибудь допишу стать про это увлекательное действо)
            0

            Не смешите. Этим пользоваться невозможно.

              0

              Ни скриптов, ни плагинов, не обновляется, базы не сохраняет. Смешно же.

                0
                Наоборот, Freeware базы сохраняет, а вот Demo не сохраняет.
                0
                У фривары нет декомпилятора.
              0
              Чуть ли не самый нужный и важный компонент — декомпилятор. От одного только дизассемблера смысла особо нет
              Имхо, не всегда от одного дизассемблера смысла особо нет. В анализе какого-нибудь обфусцированного кода декомпилятор может стать бесполезным.
              Или иногда до декомпилятора дело не доходит, в дизассемблере становится понятно, что происходит.
              P.S. Отличная статья, спасибо автору.
                +1
                А после распаковки, когда код нормальный — всё равно лучше иметь декомпилятор, чем не иметь.
                +1
                x64dbg
                image
                  –1
                  Все проблемы можно решить WD-40, скотчем или отладчиком. И если проблема не решается, значил мало WD-40 или мало скотча или отладчик не той разрядности.
                    0
                    Кстати, а есть сейчас инструменты более легковесные, чем мощные профессиональные декомпиляторы? Например типа утилиты hiew, только в современном интерфейсе.
                    Что-то типа шестнадцатеричного редактора, совмещенного с ассемблером/дизассемблером, работающим «на лету». Т.е. скажем окно разделено на две части, вводишь несколько hex-кодов в область слева — тут же получаешь дизассемблированный код справа, вводишь ассемблерный код — тут же налету он компилируется в hex-код.
                    Вот это все интересует для основных архитектур, не только x86, x86-64, но и ARM, MIPS, IA-64 и т.д.
                      0
                        0
                        А не online?
                          0
                          docs.hhdsoftware.com/hex/definitive-guide/disassembler/disassembler-view.html

                          Но чуть запутаннее, чем >окно разделено на две части
                            0

                            В radare2 по сути такой функционал (и в его gui-фронтенде Cutter), особенно это заметно, когда прокручиваешь листинг в visual режиме. Иногда это хорошо, иногда нет.

                              0
                              Легко. Они по многочисленным просьбам опубликовали проект на GitHub: github.com/syscall7/oda
                            –1
                            > Кстати, а есть сейчас инструменты более легковесные, чем мощные профессиональные декомпиляторы?

                            Я начал пилить github.com/pfalcon/ScratchABlock до того, как за-opensource'или Binnavi, потом RetDec, потом Ghidra. Но после того, как в моей сорсо-мусорксе накопилось штук 20 сторонних проектов, и я понял, что «не нужно ждать милости от природы». OpenSource-нье той троицы разумеется серьезно изменило scene, я теперь поменьше за тем кодом, побольше на пляже ;-). Не тороплюсь, жду, может google'ы, avast'ы и nsa'и все сделают за нас, зачем напрягаться. Прям гарик из Губермана вспоминается:

                            Наука Коммерческий open-source в нас изменит все, что нужно,
                            и всех усовершенствует вполне,
                            мы станем добродетельно и дружно
                            блаженствовать — как мухи на гавне.
                            0
                            del
                              0
                              IDA по началу пугает и кажется ужасной, но свое дело делает очень хорошо.
                              Попытка перейти на Ghidra провалилась, не то из за лени, не то всё таки пока недотягивает.
                                0

                                По мне так, основной недостаток это отсутствие дебаггера, скорость анализа. Интерфейс гидры несомненно требует тренировок — отлИчные от ИДЫ хоткеи и новое окошко на каждый открытый пункт меню — это вообще неудобно. В ИДЕ гораздо удобнее это реализовано через tab-control-ы.

                                  0
                                  Мне вот, как человеку, который имеет хобби реверс-инжиниринга игр на старые платформы, типа Sega MD, PSX, AmigaOS, Гидра зашла очень хорошо, т.к. обладает всем, чем должна обладать среда реверс-инжиниринга данных платформ.

                                  Например, на PSX есть оверлеи: блоки, которые имеют один и тот же адрес и размер, но могут содержать разные данные, в зависимости от загруженных в них данных. Гидра имеет типы блоков Byte Mapped, BitMapped, Overlay — самое оно.
                                  –2

                                  8:50 Другой процессор… своя архитектура…

                                    +1
                                    Я давно забросил реверс. Как-то стало не интересно, что-ли. По старой памяти в закромах есть очень старенький IDA Pro, который эпизодически расчехляется для проверки того я косячу или все же закрытая библиотека не очень здорово написана (речь в основном об ARM Cortex-M). Бывает это крайне редко, но бывает. Посмотреть гидру все никак руки не доходят. Наверное пора. Да Radare2 смотрел. Интересный инструмент, но после даже старых версий IDA как-то не прижился.

                                    Спасибо за статью. Вы еще на шаг подвинули меня к скачиванию и опробованию наконец этой самой Гидры.
                                      0
                                      > Я давно забросил реверс. Как-то стало не интересно, что-ли.

                                      Мой камент habr.com/ru/post/480824/#comment_21116368 выше. Пришли большие корпорации и обо%^%ли всю романтику. Также серьезно подкосил тот факт, что теперь большинство аудитории RE-тулз это не чуваки которые смотрят, «или все же закрытая библиотека не очень здорово написана» и заодно переписывают ее в OpenSource, а сецурити-рысерчеры, которые колупаются во всяких помойных бинарниках, ища старые openssl-баги. Фуууу, тошнота ;-).

                                      > Интересный инструмент, но после даже старых версий IDA как-то не прижился.

                                      github.com/pfalcon/ScratchABit, закос под иду версии где-то 4й. Никакой гуйни, только терминал, только хардкор. Писал по памяти, может чё не так. Главное, что никаких цэ-ха-ха и перекомпиляций. Что-то не так? Пропатчил и перезапустил.
                                        0
                                        Спасибо. Посмотрю при случае. Кстати к GUI в IDA очень долго привыкал. Навигация по JMP'ам и CALL'ам в консоли долго казалась более удобной. Да и обзорность у консоли лучше. На современном мониторе развернутая консоль — это не VGA 80x25 символов. Есть в ней своя прелесть.
                                      +1

                                      Хм… как раз сегодня дошли руки до подкаста Noise Security Bit #0x25 (о Ghidra и прочих дизассемблерах) (автор — matrosov):


                                      Авторский поток сознания на тему инструментов для обратного анализа. В частности сравниваются наиболее популярные инструменты такие как: IDA, Ghidra и прочие Binary Ninja.

                                      Совпадение или статья своего рода "ответка"?

                                        0
                                        Спасибо, гляну.
                                        Да, это действительно совпадение, но неудивительное. Т.к. Гидра сейчас очень популярной стала. А точнее, у меня это после общения с саппортом Иды накипело.
                                        0
                                        В голосовании не хватает открытого Avast RetDec
                                          0
                                          К сожалению, добавлять новые элементы в голосование не могу. Насколько хорош этот декомпилятор?
                                            0
                                            Там какой-то Питон нужен, я вроде его поставил, но что-то всё равно не стыкуется. Думал, может, надо 32битный Питон ещё поставить, тоже поставил. В общем, у кого-то работает, но явно не у меня. Хрупкие все эти Питоны, ломаются на раз-два.
                                              +1

                                              Жуть какая-то, а не декомпилятор: на 3-х мегабайтной DLL'ке упал с нехваткой памяти (на хосте 24 гигабайта). Над 2-х мегабатной ntdll.dll работал 3198.20s (53 минуты), в пике выедал 12 гигабайт оперативы.


                                              В результате:


                                              // Address range: 0x18002f0a0 - 0x18002f0df
                                              int64_t RtlDetermineDosPathNameType_U(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5) {
                                                  // 0x18002f0a0
                                                  g1005 = a4;
                                                  g1008 = a2;
                                                  g1006 = a1;
                                                  g1000 = a5 & -0x10000 | 92;
                                                  g1007 = a3 & -0x10000 | 47;
                                                  int16_t v1 = a4;
                                                  if (v1 == 92) {
                                                      // 0x18002f0d4
                                                      return g1002;
                                                  }
                                                  if (v1 == 47) {
                                                      // 0x18002f0d4
                                                      return g1002;
                                                  }
                                                  if (v1 == 0 || *(int16_t *)(a4 + 2) != 58) {
                                                      // 0x18002f0ce
                                                      g1002 = 5;
                                                      return 5;
                                                  }
                                                  // 0x18002f0c1
                                                  if (*(int16_t *)(a4 + 4) != 92) {
                                                      // bb
                                                      g1002 = function_18002f107(a1, a2, 47, a4);
                                                  }
                                                  // 0x18002f0c8
                                                  g1002 = 2;
                                                  return 2;
                                              }
                                              
                                              // Address range: 0x18002f107 - 0x18002f113
                                              int64_t function_18002f107(int64_t a1, int64_t a2, int64_t a3, int64_t a4) {
                                                  // 0x18002f107
                                                  g1005 = a4;
                                                  g1007 = a3;
                                                  g1008 = a2;
                                                  g1006 = a1;
                                                  g1002 = 3;
                                                  return 3;
                                              }

                                              Как декомпилирует эту же функцию гидра (потребляя ~ 1 гигабайт при анализе файла)
                                              ulonglong RtlDetermineDosPathNameType_U(short *param_1)
                                              
                                              {
                                                short sVar1;
                                              
                                                                  /* 0x2f0a0  905  RtlDetermineDosPathNameType_U */
                                                if ((*param_1 != 0x5c) && (*param_1 != 0x2f)) {
                                                  if ((*param_1 == 0) || (param_1[1] != 0x3a)) {
                                                    return 5;
                                                  }
                                                  if ((param_1[2] != 0x5c) && (param_1[2] != 0x2f)) {
                                                    return 3;
                                                  }
                                                  return 2;
                                                }
                                                if ((param_1[1] != 0x5c) && (param_1[1] != 0x2f)) {
                                                  return 4;
                                                }
                                                if ((param_1[2] != 0x3f) && (param_1[2] != 0x2e)) {
                                                  return 1;
                                                }
                                                sVar1 = param_1[3];
                                                if ((sVar1 != 0x5c) && (sVar1 != 0x2f)) {
                                                  return (ulonglong)((-(uint)(sVar1 != 0) & 0xfffffffa) + 7);
                                                }
                                                return 6;
                                              }

                                              Как оно должно примерно выглядеть (https://doxygen.reactos.org/d0/d23/sdk_2lib_2rtl_2path_8c.html#a1513c153ef5a711f294d8f3254c0212b)


                                              RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U   (   IN PCWSTR   Path    )
                                              {
                                                  if (IS_PATH_SEPARATOR(Path[0]))
                                                  {
                                                      if (!IS_PATH_SEPARATOR(Path[1])) return RtlPathTypeRooted;
                                                      if ((Path[2] != L'.') && (Path[2] != L'?')) return RtlPathTypeUncAbsolute;
                                                      if (IS_PATH_SEPARATOR(Path[3])) return RtlPathTypeLocalDevice;
                                                      if (Path[3]) return RtlPathTypeUncAbsolute;
                                                      return RtlPathTypeRootLocalDevice;
                                                  }
                                                  else
                                                  {
                                                      if (!(Path[0]) || (Path[1] != L':')) return RtlPathTypeRelative;
                                                      if (IS_PATH_SEPARATOR(Path[2])) return RtlPathTypeDriveAbsolute;
                                                      return RtlPathTypeDriveRelative;
                                                  }
                                              }

                                              Листинг функции
                                              0:000> u 0x18002f0a0
                                              ntdll!RtlDetermineDosPathNameType_U:
                                              00000001`8002f0a0 6641b85c00      mov     r8w,5Ch
                                              00000001`8002f0a5 66ba2f00        mov     dx,2Fh
                                              00000001`8002f0a9 66443901        cmp     word ptr [rcx],r8w
                                              00000001`8002f0ad 7425            je      ntdll!RtlDetermineDosPathNameType_U+0x34 (00000001`8002f0d4)
                                              00000001`8002f0af 663911          cmp     word ptr [rcx],dx
                                              00000001`8002f0b2 7420            je      ntdll!RtlDetermineDosPathNameType_U+0x34 (00000001`8002f0d4)
                                              00000001`8002f0b4 66833900        cmp     word ptr [rcx],0
                                              00000001`8002f0b8 7414            je      ntdll!RtlDetermineDosPathNameType_U+0x2e (00000001`8002f0ce)
                                              00000001`8002f0ba 668379023a      cmp     word ptr [rcx+2],3Ah
                                              00000001`8002f0bf 750d            jne     ntdll!RtlDetermineDosPathNameType_U+0x2e (00000001`8002f0ce)
                                              00000001`8002f0c1 6644394104      cmp     word ptr [rcx+4],r8w
                                              00000001`8002f0c6 753f            jne     ntdll!RtlDetermineDosPathNameType_U+0x67 (00000001`8002f107)
                                              00000001`8002f0c8 b802000000      mov     eax,2
                                              00000001`8002f0cd c3              ret
                                              00000001`8002f0ce b805000000      mov     eax,5
                                              00000001`8002f0d3 c3              ret
                                              00000001`8002f0d4 6644394102      cmp     word ptr [rcx+2],r8w
                                              00000001`8002f0d9 0f8503180800    jne     ntdll!RtlDetermineDosPathNameType_U+0x81842 (00000001`800b08e2)
                                              00000001`8002f0df 668379043f      cmp     word ptr [rcx+4],3Fh
                                              00000001`8002f0e4 7514            jne     ntdll!RtlDetermineDosPathNameType_U+0x5a (00000001`8002f0fa)
                                              00000001`8002f0e6 0fb74106        movzx   eax,word ptr [rcx+6]
                                              00000001`8002f0ea 66413bc0        cmp     ax,r8w
                                              00000001`8002f0ee 0f85fe170800    jne     ntdll!RtlDetermineDosPathNameType_U+0x81852 (00000001`800b08f2)
                                              00000001`8002f0f4 b806000000      mov     eax,6
                                              00000001`8002f0f9 c3              ret
                                              00000001`8002f0fa 668379042e      cmp     word ptr [rcx+4],2Eh
                                              00000001`8002f0ff 74e5            je      ntdll!RtlDetermineDosPathNameType_U+0x46 (00000001`8002f0e6)
                                              00000001`8002f101 b801000000      mov     eax,1
                                              00000001`8002f106 c3              ret
                                              00000001`8002f107 66395104        cmp     word ptr [rcx+4],dx
                                              00000001`8002f10b 74bb            je      ntdll!RtlDetermineDosPathNameType_U+0x28 (00000001`8002f0c8)
                                              00000001`8002f10d b803000000      mov     eax,3
                                              00000001`8002f112 c3              ret
                                              0
                                              Слушайте, посмотрел я на результаты декомпиляции… Потом на листинг… Потом еще раз на результаты декомпиляци… и возник у меня вопрос. Скажите, а вам как реверс-мастеру правда нужен декомпилятор? Мои допотопный IDA Pro если его и содержит, то я им не пользовался никогда. Глаз видимо к дизассемблеру пристрелялся. Особенно с учетом толково проставляемых IDA комментариев (и, особенно, правильной простановке констант как в примерах ниже '.' '/' ':'. По мне с такого толку сильно больше, чем в таком декомпилированном коде.

                                              Серьезно — просто интересно. Без всяких претензий.
                                                0
                                                Полезно иногда как способ ужать вывод дизассемблера без покупки 30дюймовой ретины
                                                  +1
                                                  > Глаз видимо к дизассемблеру пристрелялся.

                                                  > Серьезно — просто интересно. Без всяких претензий.

                                                  Вопрос с подколкой… У вас глаз к какому количеству мегабайт такого дизассемблера в день пристрелялся? А к скольким архитектурам, где каждый вендор из кожи вон лезет, чтобы сделать мнемоники непохожими на других (иначе другие его засудят, как же так, он назвал свою инструкцию MOV, спер наше IP!!11)?

                                                  Вы как хотите, а мы свой моск в помойку превращать не желаем. Нам-с подавайте платфорно-независимый ассемблер, с элементами структурного синтаксиса. В народе также известен как «C».
                                                    0
                                                    Подкол засчитан. Действительно, если собрать все мои работы с реверсом, то может байт на 200 в день и набежит. Реально редко. Но потому и вопрос задал.

                                                    Мне просто показалось, что такая декомпиляция скорее путает, чем помогает. Впрочем, ответ в стиле «регулярно работаем и понимаем где читать, где не читать, а где селедку заворачивать» меня вполне устроит. Уточнять дальше я не буду.

                                                    А ваше определение языка С я, пожалуй, запомню. Мне оно понравилось.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое