Comments 33
Из часто используемых мной горячих клавиш:
h — переключение между десятичным и HEX-представлением (констант, смещений, адресов)
b — то же самое для двоичного
_ — переключение между знаковым/беззнаковым отображением констант
Из неразрешенных мной проблем упомяну неудобство, связанное с Qt — иногда случайно подцепишь вкладку (например, миниатюрное окно Graph Overview, прилепленое снизу к списку функций) и оно превращается в отдельное окно, ни к чему не привязанное, само по себе на рабочем столе ОС. И как его вернуть на место и прилепить в окошко программы — ума не приложу (обычно слева в интерфейсе есть окно Functions Windows и в нём два прилепленых окошка Function name, под ним Graph overview). Приходится сбрасывать всё в default view, что не всегда удобно.

Про h и b, а также _ — тоже сам часто использую, но почему-то решил не перегружать cheatsheet :)
Такое встречал для архитектуры MIPS — процессорный модуль, который по просто MIPS не дизассемблирует некоторые инструкции, однако если пройтись по доступным процессорным модулям нашел подходящий. В нём инструкции хорошо разбирались. Возможно если поискать среди доступных x86, Вы тоже сможете найти в котором эти инструкции есть.
Вообще возможен еще один вариант с помощью IDAPython. Для этого найти все не разобравшиеся инструкции и сделать add_cref_to для таких байтов референс по IDAPython. Тогда IDA хотя бы сможет построить нормально граф. Однако с учетом того, что это BIOS, я думаю там будет для графа еще очень много проблем :)
mov ss, xxx; mov sp, xxx+2; jmp yyy
— "Вьетнамский флешбеки". В биосах такое очень любят, сам касался тоже Award BIOS, но очень давно.
Однажды вообще встретил прошивку, в которой она вся была выстроена на основе таких "вызовах" функций и была для процессора C166. Пришлось писать свой процессорный модуль, который собирал такие конструкции в "псевдо-вызов" CALL.
Я не занимаюсь реверсом на регулярной основе, да и вообще практически не занимаюсь, но все же некоторые основы ассемблера помню еще с конца 90-х, когда писал на нем, а так же пробовал (успешно) пару раз подлечить с помощью IDA программы лет 10 назад. И вот с пол-года назад захотел подправить прошивку на 3D-принтере (для ARM). И не помню уже подробностей, но вот никак у меня не шло дело с IDA. Так не шло, что я от безысходности полез в инет, нашел ссылку на Гидру (о которой помнил из новостей на Хабре), скачал ее — и дело пошло :) Настолько хорошо, что я не просто подправил прошивку, но даже заново переписал в ней многие вещи :) Например, ввел реальную мультиязычность в UTF-8, отображение имен файлов на русском языке, перевел работу с дисплеем на DMA и т.п.
Оказалось удобнее, гибче и понятнее, да и в псевдокод, на мой взгляд, Гидра переводит качественнее, чем ИДА, хотя не возьмусь утверждать это уверенно. Ну или я не смог разобраться до конца в ИДА и найти в ней то, что мне хотелось.
NOTE: All 32-bit OS installations are now deprecated.
Коллега пробовал Гидру, "я мимо крокодил" и мельком глянул на результат декомпиляции — не особо впечатлило, но после Вашего комментария очень захотелось по внимательней попробовать Гидру.
По Гидре, в минус ей могу сказать (ну кроме того, что если у Вас есть паранойя она Вам точно не подойдет), что в ней нет дебаггера. Тот модуль 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'ов. Аналогично для любой другой периферии.
еще IntelliJ vs Visual Studio vs IDA Pro, когда кнопки дебага F7, F8, F9 у всех по разному :)
Но я не ратую ни за то, ни за другое. Слишком плохо знаком с обеими инструментами, чтобы делать объективное сравнение :)
Я бы отметил еще кнопку n и; Наверное, еще и по этой причине к Гидре так и не дошел пока что. Без горячих кнопок вообще не представляю как реверсить, а если в Гидре все по другому — первое время будет просто адь.
>(англ. «debug» — отладка)
Улыбнуло. Т.е. в "требованиях" к читающему — знание С/С++ и базы ассемблера, сабж, на секундочку, — реверс инжиниринг, но на всякий случай объясним, что такое дебаг :D :D :D
P.S. За статью большое спасибо!
IDA Pro и техники реверс-инжиниринга