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

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

Спасибо!!! Около 8 лет я переключался между блок-схемой и текстом по контекстному меню, и вот узнал про пробел!!!

Из часто используемых мной горячих клавиш:
h — переключение между десятичным и HEX-представлением (констант, смещений, адресов)
b — то же самое для двоичного
_ — переключение между знаковым/беззнаковым отображением констант

Из неразрешенных мной проблем упомяну неудобство, связанное с Qt — иногда случайно подцепишь вкладку (например, миниатюрное окно Graph Overview, прилепленое снизу к списку функций) и оно превращается в отдельное окно, ни к чему не привязанное, само по себе на рабочем столе ОС. И как его вернуть на место и прилепить в окошко программы — ума не приложу (обычно слева в интерфейсе есть окно Functions Windows и в нём два прилепленых окошка Function name, под ним Graph overview). Приходится сбрасывать всё в default view, что не всегда удобно.
Чтобы тягать окошки, которые случайно «выпали» из главного окна необходимо навести на тонкую полосочку под именем окна. После этого появится под именем окна небольшая надпись «Drag this title to dock somewhere else» — потянув за неё можно снова прицепить окно к интерфейсу.

image

Про h и b, а также _ — тоже сам часто использую, но почему-то решил не перегружать cheatsheet :)
А знаменитое F5 — перевести в псевдокод C?
F5 — действительно знаменитая кнопка, но сейчас я бы сказал более популярен TAB. В отличие от F5, кнопка TAB не только формирует псевдокод (хотя я бы сказал сейчас IDA реально декомпилирует в Си), но и синхронизирует указатель в окне псевдокода и окне дизассемблера. То есть нажав на TAB у Вас указатель в окне псевдокода будет на том месте, которое соответствует месту, где указатель был в листинге ассемблера, и наоборот. Это намного удобней.
Кстати, небольшой минус (правда уже совершенно неактуальный) — свежие версии IDA увы косячат с кодом для 8086 и 80286 процессоров, даже если их выставить при начале анализа и не распознают устаревшие инструкции и префиксы. Как результат — ради интереса хотел слегка поправить BIOS старого ноутбука (чтобы обойти фиксированые типы хардов), загрузил, разбил по сегментами, g F000:FFF0, «c», дизассемблирование трёх инструкций и всё, типа далее это не инструкция (проверял в версиях с 6.1 по 7.3) в свежей версии, в старых (4.х) — всё прекрасно дизассемблируется.

Такое встречал для архитектуры MIPS — процессорный модуль, который по просто MIPS не дизассемблирует некоторые инструкции, однако если пройтись по доступным процессорным модулям нашел подходящий. В нём инструкции хорошо разбирались. Возможно если поискать среди доступных x86, Вы тоже сможете найти в котором эти инструкции есть.


Вообще возможен еще один вариант с помощью IDAPython. Для этого найти все не разобравшиеся инструкции и сделать add_cref_to для таких байтов референс по IDAPython. Тогда IDA хотя бы сможет построить нормально граф. Однако с учетом того, что это BIOS, я думаю там будет для графа еще очень много проблем :)

Да к BIOSным приколам и особенностям я привык ещё со времён патчинга багов в Award BIOS 4.51/6.0, просто привычка была вида «Ида прекратила перевод в код — где-то очередной хитрый call ax/call es:dx/ mov ss, xxx; mov sp, xxx+2; jmp yyy», а тут она дала сбой.

mov ss, xxx; mov sp, xxx+2; jmp yyy — "Вьетнамский флешбеки". В биосах такое очень любят, сам касался тоже Award BIOS, но очень давно.


Однажды вообще встретил прошивку, в которой она вся была выстроена на основе таких "вызовах" функций и была для процессора C166. Пришлось писать свой процессорный модуль, который собирал такие конструкции в "псевдо-вызов" CALL.

Ну а как там быть, когда оперативной памяти ещё нет =)
А мне больше зашел бесплатный Ghidra.
Я не занимаюсь реверсом на регулярной основе, да и вообще практически не занимаюсь, но все же некоторые основы ассемблера помню еще с конца 90-х, когда писал на нем, а так же пробовал (успешно) пару раз подлечить с помощью IDA программы лет 10 назад. И вот с пол-года назад захотел подправить прошивку на 3D-принтере (для ARM). И не помню уже подробностей, но вот никак у меня не шло дело с IDA. Так не шло, что я от безысходности полез в инет, нашел ссылку на Гидру (о которой помнил из новостей на Хабре), скачал ее — и дело пошло :) Настолько хорошо, что я не просто подправил прошивку, но даже заново переписал в ней многие вещи :) Например, ввел реальную мультиязычность в UTF-8, отображение имен файлов на русском языке, перевел работу с дисплеем на DMA и т.п.
Оказалось удобнее, гибче и понятнее, да и в псевдокод, на мой взгляд, Гидра переводит качественнее, чем ИДА, хотя не возьмусь утверждать это уверенно. Ну или я не смог разобраться до конца в ИДА и найти в ней то, что мне хотелось.
Хочется сравнить с IDA, но не могу найти, какая версия работала в Windows 32-bit. В документации указано:
NOTE: All 32-bit OS installations are now deprecated.
Не могу подсказать, к сожалению. У меня уже давно везде 64-битные операционки.

Из "общедоступных" — 6.8.
С 7-й версии — только 64-битные ОСи

Человек спрашивает про Гидру :)

Коллега пробовал Гидру, "я мимо крокодил" и мельком глянул на результат декомпиляции — не особо впечатлило, но после Вашего комментария очень захотелось по внимательней попробовать Гидру.


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

С дебаггером я не пытался работать ни там ни тут, так что не могу ничего сказать. А вот чего, например, мне сильно не хватало в ИДА — это правки исследуемого бинарника с сохранением его в модифицированном виде. Я нашел только экспорт патча по правкам, что меня очень не устраивало. Может быть просто плохо искал…
В Гидре же пожалуйста — вноси изменения, хоть в хексах, хоть в мнемониках ассемблера (с использованием символьных имен функций и переменных), после чего модифицированный бинарник легко сохраняется целиком или нужным куском.
А, ну и Control+Z работает нормально, кажется :)

По поводу патчинга у IDA есть такая функциональность — она касается пропатчить последовательность байт и при этом IDA даже сохранит у себя в базе все места патчинга. Но, честно, я этим никогда не пользовался. Когда надо было патчить не очень интенсивно (пару байтиков) находил нужный адрес в 010 Editor и там менял байт. Если же нужны серьезные патчи, то пилим свои тулзы, чтобы быстро вставлять большие патчи с возможностью их компиляции на Си.

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

Ну и Гидра тоже не изменяет исходный бинарник, а вносит в базу информацию об изменениях и экспортирует с учетом этих изменений.
А как в ИДА менять код в командах ассемблера? Вот мне нужно все вызовы определенной функции изменить на вызов своей процедуры. В Гидре я открываю список обращений к исходной функции и переходя по каждому найденному адресу прямо в окне ассемблера меняю, скажем «bl TFT_WriteCommand» на «bl MyTFT_WriteCommand». Потом «File -> Export...» и у меня готов пропатченный бинарник. А в ИДА?

Так тоже можно сделать в ИДА, но только для x86/x64. Для других зависит от процессорного модуля, если он не поддерживает ассемблирование команд — то нельзя (для АРМа точно нельзя). Ни в коем случае не хочу сказать, что "ну раз нет ну и не надо", но сам очень опасливо к этому отношусь. Когда так патчишь бинарь команда может получиться короче-длиннее и потом это откатывать отдельная песня, когда нет CTRL+Z :). И вторая причина — если не обратить внимание можно зашить не совсем правильный патч и плясать после этого долгое время. То есть это добавляет еще одну "степень свободы" в куче неизвестных. Но это чисто мое мнение. Возможно это историческая профдеформация.

для АРМа точно нельзя

Спасибо, буду знать. Вот почему у меня не получилось найти это :)
Когда так патчишь бинарь команда может получиться короче-длиннее

Ну за этим само собой нужно следить.
потом это откатывать отдельная песня, когда нет CTRL+Z

В Гидре оно есть, там это не проблема :)
если не обратить внимание можно зашить не совсем правильный патч и плясать после этого долгое время

Это уже не зависит от способа патчинга :)
Это уже не зависит от способа патчинга :)

Ни сколько не настаиваю, что так лучше :) Поэтому обычно пилим свои тулзовины, чтобы меньше отстреливать себе ноги

Еще я очень оценил в Гидре возможность назначения структур для адресов памяти и енумов для констант. Очень помогает при разборе кода микроконтроллеров с их регистрами :) Это, может быть, есть и в ИДА, просто я не добрался там до такой возможности…
Как пример — http://prntscr.com/rmcygm

Есть, можно по ALT+Q назначать структуры в памяти. Если сами типы данных, то по Y — в декомпиле, по T — дизасме. Да, тоже часто пользовался при разборе контроллеров, когда есть UART, например, с пачкой регистров и таких UART'ов несколько штук. Делаю структуру с регистрами и назначаю на разные базовые адреса UART'ов. Аналогично для любой другой периферии.

Делаю структуру с регистрами и назначаю на разные базовые адреса UART'ов. Аналогично для любой другой периферии.

Да-да, именно так :)
Гидра хороша, но по опыту — если начать использовать IDA не только в формате «Я знаю кнопки c,d,x и этого хватает», то на гидру надо переучиваться.
Ну у меня как раз и был случай «Я за последние два дня узнал кнопки c, d и x» :)
Именно оно и есть, это как с вечным holywar-ом на тему emacs vS vi

еще IntelliJ vs Visual Studio vs IDA Pro, когда кнопки дебага F7, F8, F9 у всех по разному :)

Ну, у Гидры в данном случае все же есть одно преимущество, которое никто не оспорит — она бесплатная и вроде как опенсурсная :)
Но я не ратую ни за то, ни за другое. Слишком плохо знаком с обеими инструментами, чтобы делать объективное сравнение :)

Я бы отметил еще кнопку n и; Наверное, еще и по этой причине к Гидре так и не дошел пока что. Без горячих кнопок вообще не представляю как реверсить, а если в Гидре все по другому — первое время будет просто адь.

Скрамблинг — это вроде не перемешивание, а наложения XOR последовательности на данные с целью получить псевдослучайные данные и уменьшить износ память. А то что описали Вы, видимо может называться алгоритмом трансляции.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий