Образ мышления дизассемблер ida pro том 2. Инструкция Инструкции по работе с прошивками через IDA Pro и BinEdit

  • Tutorial

Этот пост будет интересно действительно тем, кто только начинает интересоваться этой темой. У людей с опытом он, возможно, вызовет только зевки. За исключением разве что, может быть, …
Реверс-инжиниринг в той менее легальной части, где он не касается отладки и оптимизации собственного продукта, касается в том числе и такой задачи: «узнать, а как у них это работает». Иначе говоря, восстановление исходного алгоритма программы, имея на руках ее исполнимый файл.
Для того, чтобы держаться азов и избежать некоторых проблем - «взломаем» не что-нибудь, а… кейген. В 90% он не будет запакован, зашифрован или иным способом защищен - в том числе и нормами международного права…

Вначале было слово. Двойное
Итак, нам нужен кейген и дизассемблер. Что касается второго - то предположим, что это будет Ida Pro. Подопытный безымянный кейген, найденный на просторах Сети:

Открыв файл кейгена в Ida, видим список функций.

Проанализировав этот список, мы видим несколько стандартных функций (WinMain, start, DialogFunc) и кучу вспомогательных-системных. Все это стандартные функции, составляющие каркас.
Пользовательские функции, которые представляют реализацию задач программы, а не ее обертку из API-шных и системных вызовов, дизассемблер не распознает и называет попросту sub_цифры. Учитывая, что такая функция здесь всего одна - она и должна привлечь наше внимание как, скорее всего, содержащая интересующий нас алгоритм или его часть.

Давайте запустим кейген. Он просит ввести две 4-значных строки. Предположим, в функцию расчета ключа отправляются сразу восемь символов. Анализируем код функции sub_401100. Ответ на гипотезу содержится в первых двух строках:

var_4= dword ptr -4
arg_0= dword ptr 8

Вторая строка недвусмысленно намекает нам на получение аргумента функции по смещению 8. Однако размер аргумента - двойное слово, равное 4 байтам, а не 8. Значит, вероятнее всего за один проход функция обрабатывает одну строку из четырех символов, а вызывается она два раза.
Вопрос, который наверняка может возникнуть: почему для получения аргумента функции резервируется смещение в 8 байт, а указывает на 4, ведь аргумент всего один? Как мы помним, стек растет вниз; при добавлении в стек значения стековый указатель уменьшается на соответствующее количество байт. Следовательно, после добавления в стек аргумента функции и до начала ее работы в стек добавляется что-то еще. Это, очевидно, адрес возврата, добавляемый в стек после вызова системной функции call.

Найдем места в программе, где встречаются вызовы функции sub401100. Таковых оказывается действительно два: по адресу DialogFunc+97 и DialogFunc+113. Интересующие нас инструкции начинаются здесь:

Относительно длинный кусок кода

loc_401196: mov esi, mov edi, ds:SendDlgItemMessageA lea ecx, push ecx ; lParam push 0Ah ; wParam push 0Dh ; Msg push 3E8h ; nIDDlgItem push esi ; hDlg call edi ; SendDlgItemMessageA lea edx, push edx ; lParam push 0Ah ; wParam push 0Dh ; Msg push 3E9h ; nIDDlgItem push esi ; hDlg call edi ; SendDlgItemMessageA pusha movsx ecx, byte ptr movsx edx, byte ptr movsx eax, byte ptr shl eax, 8 or eax, ecx movsx ecx, byte ptr shl eax, 8 or eax, edx shl eax, 8 or eax, ecx mov , eax popa mov eax, push eax call sub_401100

Сначала подряд вызываются две функции SendDlgItemMessageA. Эта функция берет хэндл элемента и посылает ему системное сообщение Msg. В нашем случае Msg в обоих случаях равен 0Dh, что является шестнадцатиричным эквивалентом константы WM_GETTEXT. Здесь извлекаются значения двух текстовых полей, в которые пользователь ввел «две 4-символьных строки». Буква А в названии функции указывает, что используется формат ASCII - по одному байту на символ.
Первая строка записывается по смещению lParam, вторая, что очевидно - по смещению var_1C.
Итак, после выполнения функций SendDlgItemMessageA текущее состояние регистров сохраняется в стеке с помощью команды pusha, затем в регистры ecx, edx и eax записывается по одному байту одной из строк. В результате каждый из регистров принимает вид: 000000##. Затем:

  1. Команда SHL сдвигает битовое содержимое регистра eax на 1 байт или, другими словами, умножает арифметическое содержимое на 100 в шестнадцатиричной системе или на 256 в десятичной. В результате еах принимает вид 0000##00 (например, 00001200).
  2. Выполняется операция OR между полученным значением eax и регистром ecx в виде 000000## (пусть это будет 00000034). В результате еах будет выглядеть так: 00001234.
  3. В «освободившийся» есх записывается последний, четвертый байт строки.
  4. Содержимое еах снова сдвигается на байт, освобождая место в младшем байте для следующей команды OR. Теперь еах выглядит так: 00123400.
  5. Инструкция OR выполняется, на этот раз между еах и edx, который содержит, допустим, 00000056. Теперь еах - 00123456.
  6. Повторяются два шага SHL eax,8 и OR, в результате чего новое содержимое ecx (00000078) добавляется в «конец» еах. В итоге, еах хранит значение 12345678.
Затем это значение сохраняется в «переменной» - в области памяти по смещению arg_4. Состояние регистров (их прежние значения), ранее сохраненное в стеке, вытаскивается из стека и раздается регистрам. Затем в регистр еах снова записывается значение по смещению arg_4 и это значение выталкивается из регистра в стек. После этого следует вызов функции sub_401100.

В чем смысл этих операций? Выяснить очень просто даже на практике, без теории. Поставим в отладчике брейкпойнт, например, на инструкции push eax (перед самым вызовом подфункции) и запустим программу на выполнение. Кейген запустится, попросит ввести строки. Введя qwer и tyui и остановившись на брейкпойнте, смотрим значение еах: 72657771. Декодируем в текст: rewq. То есть физический смысл этих операций - инверсия строки.

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

Еще один относительно длинный кусок кода

sub_401100 proc near var_4= dword ptr -4 arg_0= dword ptr 8 push ebp mov ebp, esp push ecx push ebx push esi push edi pusha mov ecx, mov eax, ecx shl eax, 10h not eax add ecx, eax mov eax, ecx shr eax, 5 xor eax, ecx lea ecx, mov edx, ecx shr edx, 0Dh xor ecx, edx mov eax, ecx shl eax, 9 not eax add ecx, eax mov eax, ecx shr eax, 11h xor eax, ecx mov , eax popa mov eax, pop edi pop esi pop ebx mov esp, ebp pop ebp retn sub_401100 endp


В самом начале здесь ничего интересного - состояния регистров заботливо сохраняются в стеке. А вот первая команда, которая нам интересна - следующая за инструкцией PUSHA. Она записывает в есх аргумент функции, хранящийся по смещению arg_0. Потом это значение перекидывается в еах. И обрезается наполовину: как мы помним, в нашем примере в sub_401100 передается 72657771; логический сдвиг влево на 10h (16 в десятичной) превращает значение регистра в 77710000.
После этого значение регистра инвертируется инструкцией NOT. Это значит, что в двоичном представлении регистра все нули превращаются в единицы, а единицы - в нули. Регистр после выполнения этой инструкции содержит 888ЕFFFF.
Инструкция ADD добавляет (прибавляет, плюсует, и т.д.) получившееся значение к исходному значению аргумента, которое все еще содержится в регистре есх (теперь понятно, зачем было записывать его сначала в есх, а затем в еах?). Результат сохраняется в есх. Проверим, как будет выглядеть есх после выполнения этой операции: FAF47770.
Этот результат копируется из есх в еах, после чего к содержимому еах применяется инструкция SHR. Эта операция противоположна SHL - если последняя сдвигает разряды влево, то первая сдвигает их вправо. Подобно тому, как операция логического сдвига влево эквивалентна умножению на степени двойки, операция логического сдвига вправо эквивалентна такому же делению. Посмотрим, какое значение окажется результатом этой операции: 7D7A3BB.
Теперь совершим еще одно насилие над содержимым еах и есх: инструкция XOR - сложение по модулю 2 или «исключающее ИЛИ». Суть этой операции, грубо говоря, в том, что в результат ее равен единице (истине) только, если операнды ее раЗнозначные. Например, в случае 0 xor 1 результатом будет истина, или единица. В случае 0 xor 0 или 1 xor 1 - результатом будет ложь, или ноль. В нашем случае в результате выполнения этой инструкции применительно к регистрам еах (7D7A3BB) и есх (FAF47770) в регистр еах запишется значение FD23D4CB.

Следующая команда LEA ecx, элегантно и непринужденно умножает еах на 9 и записывает результат в есх. Затем это значение копируется в edx и сдвигается вправо на 13 разрядов: получаем 73213 в еdx и E6427B23 в есх. Затем - снова ксорим есх и edx, записывая в есх E6454930. Копируем это в еах, сдвигаем влево на 9 разрядов: 8А926000, затем инвертируем это, получая 756D9FFF. Прибавляем это значение к регистру есх - имеем 5BB2E92F. Копируем это в еах, сдвигаем вправо аж на 17 разрядов - 2DD9 - и ксорим с есх. Получаем в итоге 5BB2C4F6. Затем… затем… что там у нас? Что, все?..
Итак, мы сохраняем это значение в область памяти по смещению var_4, загружаем из стека состояния регистров, снова берем из памяти итоговое значение и окончательно забираем из стека оставшиеся там состояния регистров, сохраненные в начале. Выходим из функции. Ура!.. впрочем, радоваться еще рано, пока что на выходе из первого вызова функции мы имеем максимум - четыре полупечатных символа, а ведь у нас еще целая необработанная строка есть, да и эту еще к божескому виду привести надо.

Перейдем на более высокий уровень анализа - от дизассемблера к декомпилятору. Представим всю функцию DialogFunc, в которой содержатся вызовы sub_401100, в виде С-подобного псевдокода. Собственно говоря, это дизассемблер называет его «псевдокодом», на деле это практически и есть код на С, только страшненький. Глядим:

Нужно больше кода. Нужно построить зиккурат.

SendDlgItemMessageA(hDlg, 1000, 0xDu, 0xAu, (LPARAM)&lParam); SendDlgItemMessageA(hDlg, 1001, 0xDu, 0xAu, (LPARAM)&v15); v5 = sub_401100((char)lParam | ((SBYTE1(lParam) | ((SBYTE2(lParam) | (SBYTE3(lParam) << 8)) << 8)) << 8)); v6 = 0; do { v21 = v5 % 0x24; v7 = v21; v5 /= 0x24u; if (v7 >= 10) v8 = v7 + 55; else v8 = v7 + 48; v21 = v8; } while (v6 < 4); v22 = 0; v9 = sub_401100(v15 | ((v16 | ((v17 | (v18 << 8)) << 8)) << 8)); v10 = 0; do { v19 = v9 % 0x24; v11 = v19; v9 /= 0x24u; if (v11 >= 10) v12 = v11 + 55; else v12 = v11 + 48; v19 = v12; } while (v10 < 4); v20 = 0; wsprintfA(&v13, "%s-%s-%s-%s", &lParam, &v15, v21, v19); SendDlgItemMessageA(hDlg, 1002, 0xCu, 0, (LPARAM)&v13);

Это уже легче читать, чем ассемблерный листинг. Однако не во всех случаях можно положиться на декомпилятор: нужно быть готовым часами следить за нитью ассемблерной логики, за состояниями регистров и стека в отладчике… а потом давать письменные объяснения сотрудникам ФСБ или ФБР. Под вечер у меня особенно смешные шутки.
Как я уже сказал, читать это легче, но до совершенства еще далеко. Давайте проанализируем код и дадим переменным более удобочитаемые названия. Ключевым переменным дадим понятные и логичные названия, а счетчикам и временным - попроще.

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

SendDlgItemMessageA(hDlg, 1000, 0xDu, 0xAu, (LPARAM)&first_given_string); SendDlgItemMessageA(hDlg, 1001, 0xDu, 0xAu, (LPARAM)&second_given_string); first_given_string_encoded = sub_401100((char)first_given_string | ((SBYTE1(first_given_string) | ((SBYTE2(first_given_string) | (SBYTE3(first_given_string) << 8)) << 8)) << 8)); i = 0; do { first_result_string[i] = first_string_encoded % 0x24; temp_char = first_result_string[i]; first_string_encoded /= 0x24u; if (temp_char >= 10) next_char = temp_char + 55; else next_char = temp_char + 48; first_result_string = next_char; } while (i < 4); some_kind_of_data = 0; second_string_encoded = sub_401100(byte1 | ((byte2 | ((byte3 | (byte4 << 8)) << 8)) << 8)); j = 0; do { second_result_string[j] = second_string_encoded % 0x24; temp_char2 = second_result_string[j]; second_string_encoded /= 0x24u; if (temp_char2 >= 10) next_char2 = temp_char2 + 55; else next_char2 = temp_char2 + 48; second_result_string = next_char2; } while (j < 4); yet_another_some_kind_of_data = 0; wsprintfA(&buffer, "%s-%s-%s-%s", &first_given_string, &second_given_string, first_result_string, second_result_string); SendDlgItemMessageA(hDlg, 1002, 0xCu, 0, (LPARAM)&buffer);

IDA Pro –уникальная программа, которая получила признание во всем мире, а теперь и на русском языке включительно. Если речь идет о дизассемблировании, то конкурентов данной утилите нет. Достаточно скачать Айди Про одним файлом и установить, чтобы начать использование в полном объеме. Стоит отметить, что продукт предоставляется в сборке Standard (поддерживает больше 20 популярных семейств процессоров) и Advanced (рассчитан на 50 и более). В зависимости от прямого назначения стоит выбрать подходящие параметры. Также одну из версий можно расширить или упросить, если возникла необходимость.

Чтобы скачать бесплатно IDAPro, необходимо лишь кликнуть на ссылку. Установщик является мультиплатформенным и поддерживает набор команд на 32 и 64 бита. Русская версия для Windows установлена по умолчанию, изменить язык можно в меню настроек.

В чем особенность программы? Утилита является профессиональным дизассемблером, который уже содержит в себе большинство модулей и функций. Это существенно облегчает работу, позволяет быстрее обрабатывать большой объем данных. В рабочей среде есть удобный поиск. С его помощью можно быстро найти и заменить нужную часть кода. Устанавливается продукт на компьютер без дополнительного программного обеспечения. После окончательной установки требуется перезагрузка системы, чтобы новые параметры вступили в силу, и утилиту было видно в списке программ.

Также можно задать и привязку (к примеру, открывать файлы данного формата именно через эту программу в Виндовс).Удобнее только скачать IDAPro и выполнять процесс дизассемблирования, чем компилировать данные через несколько приложений. Сохраняются все пользовательские настройки. В рабочей среде уже есть готовые шаблоны, которые можно изменить, удалить или создать новые. Это повышает комфорт использования продукта в целом. Последние действия можно отменить, используя навигацию или стандартную комбинацию клавиш.

К главным достоинствам программы относятся:

  • бесплатное распространение;
  • пользовательская и профессиональная версии;
  • быстрая компиляция данных;
  • поиск части кода и подсвечивание;
  • не нагружает систему во время работы.

О SYM,SIG,IDC-файлах и поиске функций в новых прошивках. ​


В первых двух инструкциях я уже упоминал о файлах SYM и IDC. Теперь остановлюсь на них подробнее.
SYM,SIG,IDC-файлы содержат в себе информацию о функциях: их адрес, название и описание. Все они являются текстовыми (не бинарными), поэтому вы спокойно можете открыть их в блокноте.
Самый простой по структуре это формат SYM. Он состоит из 2х колонок, первая колонка - это адрес функции, вторая - название функции. Пример его содержимого ниже:
Таким образом при анализе кода вы можете самостоятельно находить назначение безымянной функции и дать ей название, занеся эту информацию в SYM-файл.

В инструкции №2 я уже рассказал, как загрузить в BinEdit SYM-файл (в правой части, вкладка Символы). Теперь расскажу, как сделать так, чтобы при открытии прошивки вместе с ней подгружался SYM-файл к ней.
Поместите в один каталог и прошивку, н-р, Mili_chaohu_70.fw.bin, и SYM-файл "Mili_chaohu_70.sym". Откройте be-файл вашей прошивки (например 0.1.0.70.be) в каталоге befiles BinEdit"а и добавьте с новой строчки следующий текст и сохраните изменения: LoadSym Name="Mili_chaohu_70.sym" question="N"
Теперь, при открытии прошивки с версией 0.1.0.70 у вас автоматически будет подгружаться SYM-файл.

О структуре IDC-файла я не знаю, но вы сми об этом почитать, исопльзуя Google. Зато в BinEdit есть возможность создать IDC файл из SYM-файла. Для этого, нужно открыть прошивку, загрузить sym-файл к ней. После этого во вкладке Символы нажмите на иконку с дискетой ("Сохранить сигнатуры") и в типе файла просто выберите Скрипты IDA (*.idc), введите имя файла и сохраните. Вот и всё, можете открывать этот IDC-файл в IDA Pro совместно с прошивкой.

И самое вкусненькое на последок: как вы знаете(заметили) на разных версиях прошивки одни и те же функции расположены по разным адресам. И их приходится каждый раз искать. Как облегчить себе работы и сделать поиск этих функций проще? BinEdit для этого дает 2 способа: автоматический и ручной.

Автоматический режим:

  1. Откройте прошивку и SYM-файл к ней (на примере 70й прошивки).
  2. Перейдите во вкладку Символы, нажмите на стрелку вниз, которая находится справа от иконки "Шестеренка с лупой" и выберите пункт "Для адресов без сигнатур". Если вы всё сделали правильно, то ниже у вас заполнятся поля в колонках Комментарий и Сигнатура.
  3. Сохраните файл в формате SIG через иконку с дискетой (наподобие того-как вы сохраняли IDC-файл). Пусть это будет файл Mili_chaohu_70.sig
  4. Открываете ещё одну копию программы BinEdit, в ней открываете новую прошивку, н-р, с версией 1.0.1.05. Выполните сканирование прошивки по инструкции №2. Перейдите на вкладку Символы, нажмите на иконку Открыть и выберите ранее сохраненный файл Mili_chaohu_70.sig
  5. Теперь отвечаем на возникшие вопросы следующим образом:
    Вы пытаетесь загрузить сигнатуры от другой прошивки. Продолжить загрузку? - Да.
    Определить при загрузке эквивалентные адреса по данным сигнатур? - Да.
    Загружать адреса, для которых не удалось определить эквивалент - Нет.
  6. Всё, у вас есть автоматически определенные функции. Осталось только их сохранить в SYM-, IDC- форматах и работать с новой прошивкой.
Ручной режим:

IDA Free - это дизассемблер, альтернативы которому просто нет. Для профессиональной работы это единственный пригодный дизассемблер. Он давно стал стандартом, и если говорят о дизассемблере, то в первую очередь имеют в виду IDA Free . IDA Free имеет огромное количество функций и модулей, которые значительно упрощают процесс дизассемблирования. Сюда входит распознавание стандартных библиотечных функций, распознавание аргументов функций и их типов, представление всего кода в удобной древовидной форме и многое другое.

Основные группы пользователей IDA Free - это антивирусные компании, крупные разработчики ПО, специалисты по информационной безопасности.

Ключевые особенности и функции

  • окно со списком функций программы;
  • список сегментов программы;
  • древовидная структура кода;
  • список импортированных функций;
  • встроенный отладчик;
  • встроенный язык программирования IDC;
  • возможность делать комментарии и менять названия переменных и функций для удобной читаемости.
  • интеллектуальная обработка. Сегодня в тексте программ очень часто встречаются зашифрованные или заведомо запутанные участки кода. Точное разделение кода и данных программы – это целая наука или даже искусство. Один неправильно распознанный аргумент функции может повлечь за собой серьезные ошибки в исследовании всего кода. Сегодня IDA Pro имеет самый мощный механизм анализа кода программы, который значительно упрощает дизассемблирование;
  • уникальная технология FLIRT. Современные вирусы и черви чаще всего написаны на языках высокого уровня, что усложняет дизассемблирование. Благодаря технологии FLIRT и расширенным возможностям отслеживания стека, IDA Pro дает оригинальный исходный код настолько точно, насколько это возможно;
  • расширение и совершенствование. Конечно, разработчики делают все возможное для усовершенствования IDA Pro, однако только специалисты в области отладки и декомпиляции работают с IDA Pro в «боевых» условиях и всегда лучше знают что им нужно. Благодаря IDA Pro SDK вы можете расширять функциональность и приспосабливать дизассемблер под свои нужды;

Список поддерживаемых процессоров:
· AMD K6-2 3D-Теперь доступна!;
· ARM Архитектура версии 3, 4 и 5 включяя Thumb Mode и DSP инструкции;
· ATMEL AVR (вместе с исходным кодом);
· DEC PDP-11(вместе с исходным кодом) ;
· Fujitsu FR (вместе с исходным кодом);
· GameBoy;
· H8/300 , H8/300L , H8/300H, H8S/2000 , H8S/2600(вместе с исходным кодом);
· H8/500(вместе с исходным кодом);
· Hitachi HD 6301, HD 6303, Hitachi HD 64180 ;
· INTEL 8080;
· INTEL 8085;
· INTEL 80196 (вместе с исходным кодом);
· INTEL 8051 (вместе с исходным кодом);
· INTEL 860XR (вместе с исходным кодом);
· INTEL 960 (вместе с исходным кодом);
· INTEL 80x87 and 80x87;
· INTEL Pentium family;
· Java Virtual Machine (вместе с исходным кодом);
· KR1878 (вместе с исходным кодом);
· Microsoft .NET;
· Mitsubishi MELPS740(вместе с исходным кодом);
· MN102 (только с исходным кодом);
· MOS Technologies 6502 (вместе с исходным кодом);
· Motorola MC680xx. , Motorola CPU32 (68330), Motorola MC6301, MC6303;
· MC6800, MC6801, MC6803, MC6805, MC6808, MC6809, MC6811, M68H12C;
· Motorola ColdFire;
· NSC CR16 (только с исходным кодом);
· PIC 12XX, PIC 14XX, PIC 18XX, PIC 16XXX (вместе с исходным кодом);
· Rockwell C39 (только с исходным кодом);
· SAM8 (вместе с исходным кодом);
· SGS Thomson ST-7, and ST-20 (вместе с исходным кодом);
· TLCS900 (только с исходным кодом);
· XA (вместе с исходным кодом);
· xScale;
· Z80, Zilog Z8, Zilog Z180, Zilog Z380 (вместе с исходным кодом);
· AMD64 architecture;
· DEC Alpha;
· DSP563xx, DSP566xx, DSP561XX (вместе с исходным кодом);
· TI TMS320C2X, TMS320C5X, TMS320C6X, TMS 320C54xx, TMS320C55xx, TMS320C3 (вместе с исходным кодом);
· Hewlett-Packard HP-PA (вместе с исходным кодом);
· Hitachi SH1, SH2, SH3, Hitachi SH4 - Dreamcast;
· IBM - Motorola PowerPC;
· Infineon Tricore архитектура;
· Intel IA-64 Architecture - Itanium;
· Motorola DSP 56K, Motorola MC6816;
· MIPS Mark I (R2000), MIPS Mark II (R3000), MIPS Mark III: (R4000, R4200, R4300, R4400, and R4600), MIPS Mark IV: R8000, R10000, R5900 (Playstation 2), MIPS16 encoding;
· Mitsubishi M32R(вместе с исходным кодом);
· Mitsubishi M7700 (вместе с исходным кодом);
· Mitsubishi M7900 (вместе с исходным кодом);
· Nec 78K0 and Nec 78K0S (вместе с исходным кодом);
· STMicroelectronics ST9+, ST-10 (вместе с исходным кодом);
· SPARCII, ULTRASPARC;
· Siemens C166 ;
· Fujitsu F2MC-16L Fujitsu F2MC-LC.

Ограничения бесплатной версии

  • бесплатная версия предназначена только для некоммерческого использования.

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

Hex-Rays — навороченный многофункциональный Hex-редактор (hex-editor ) и мощнейший декомпилятор . Наиболее известный коммерческий инструмент для обратного анализа, разработанный компанией Hex-Rays . Является плагином для IDA Pro.

Когда-то, в далеких 90-х, все начиналось с дизассемблера с возможностью интерактивного редактирования и поддержкой сложных типов данных в виде структур. Сейчас это уже куда более продвинутый инструмент. Программа имеет возможность расширения и развитый SDK для разработки различных плагинов, начиная с добавления поддержки новых процессорных архитектур и до автоматизации процесса отладки при помощи встроенного API для скриптовых языков (IDC , IDAPython ).

Про поддержку Python стоит отдельно отметить, так как он уже довольно давно тесно интегрирован при помощи плагина IDAPython , и на данный момент поддерживает практически все возможности нативного SDK на С++ , за исключением лишь совсем специфичных вещей.

К пятой версии IDA Pro имела в своем арсенале все необходимое для автоматической декомпиляции , причем не просто декомпиляции, а очень
качественной декомпиляции , декомпиляции принципиально нового уровня , до которого не дотягивает ни один другой существующих
декомпилятор .

Вот так и родилась идея дописать к IDA еще небольшую (на самом деле очень большую) порцию кода, переводящую китайскую ассемблерную грамоту в доступный и понятный листинг на языке Си.

Включать декомпилятор в дистрибутив IDA Pro Ильфак не стал. Тому было несколько причин. Первая и главная — основной массе текущих пользователей IDA декомпилятор не сильно нужен, если они им и будут пользоваться, то лишь из чистого любопытства, запустят пару раз, плюнут и вернутся к привычному стилю жизни — анализу дизассемблерного листинга. Второе — зарабатывать на жизнь (Ильфаку) и содержать фирму как-то же надо?!

Все это привело к тому, что декомпилятор , получивший название (HexRays ) , был выпущен отдельным продуктом, но — внимание на экран — требующим
обязательного присутствия IDA , поскольку HexRays — всего лишь плагин . Таким образом, реверсеру, желающему упростить свою жизнь за счет автоматической декомпиляции, необходимо прибрести как саму IDA, так и HexRays . Причем приобретать этот комплект будет совсем другая пользовательская аудитория, совсем не та, что приобретала ИДУ и почитала ее как самый лучший интерактивный дизассемблер. Интерактивный — значит, тесно взаимодействующий с пользователем (в смысле с хакером). В противовес ей, пакетные дизассемблеры стремятся к максимальной автоматизации
реверсинга, лишая пользователя возможности вмешиваться в процесс и отдавать указания.
HexRays в отличии от IDA Pro интерактивностью не обладает : она у него атрофирована еще в зародыше. Нет даже опций настройки! А там где нет интерактивности, нет и хакеров.