Представляю Вам перевод книги Александра Ханеля "The Beginner’s Guide to IDAPython. Version 6.0".
Перевод не идеален, так что, если есть предложения по перефразированию некоторых частей перевода, то прошу написать мне и прислать правильную, по вашему мнению, версию перевода.
Оглавление
Вступление
Обновления
Предполагаемый читатели и отказ от ответственности
Условные обозначения
Происхождение IDAPython
Старое против нового
Проблемы с Python x86-64
Основы
Сегменты
Функции
Извлечение аргументов функций
Инструкции
Операнды
Базовые блоки
Структуры
Перечисляемые типы
Перекрестные ссылки (xref)
Поиск
Отбор данных
Комментарии и переименования
Раскраска
Доступ к необработыннм данным
Патчинг
PyQt
Создание пакетного файла
Выполнение скриптов
Yara
Unicorn Engine
Заключение
Приложение
Неизменяемые IDC API имена
PeFile
Эта книга про IDAPython.
Изначально я написал его как справочник для себя – мне нужно было место, где я мог бы найти примеры функций, которые я обычно использую (и забываю) в IDAPython. С тех пор, как я начал эту книгу, я много раз использовал ее в качестве короткого справочника, чтобы понять синтаксис или увидеть пример некоторого кода. Многие скрипты, которые я здесь описываю являются результатом поверхностных экспериментов, которые я задокументировал в интернете.
За прошедшие годы я получил множество писем с вопросами, какое лучшее руководство существует для изучения IDAPython. Обычно я указываю на «Введение в IDAPython» Эры Карреры или примеры скриптов в открытом репозитории IDAPython. Это отличные источники для обучения, но они не охватывают некоторые общие проблемы, с которыми я столкнулся. Я хотел написать книгу, посвященную этим вопросам. Я считаю, что эта книга представляет ценность для всех, кто изучает IDAPython или хочет получить короткий справочник с примерами и фрагментами кода. Будучи электронной книгой, она не будет статичной и будет регулярно обновляться в будущем.
Если Вы столкнетесь с какими-либо проблемами, опечатками или у Вас возникнут вопросы, напишите мне на почту alexander.hanel@gmail.com или напишите мне в Twitter @nullandnull.
Для читателей этой книги есть несколько предварительных условий. Вы должны хорошо разбираться в ассемблере, иметь опыт работы в области реверс-инжиниринга и разбираться в IDA. Если Вы достигли точки, где спросили себя «Как я могу автоматизировать эту задачу с помощью IDAPython?», тогда эта книга для Вас. Если у Вас уже есть опыт программирования на IDAPython, то Вы, вероятно, уже знакомы с материалом. Тем не менее, он может служить удобным справочником для поиска примеров часто используемых функций или может решить проблему, с которой Вы столкнетесь в будущем. Следует отметить, что я занимался реверс-инжинирингом вредоносных файлов в Windows x86. Многие примеры, приведенные в этой книге, получены из общих задач, с которыми я сталкивался при реверсе малварей. После прочтения этой книги читатель сможет самостоятельно копаться в документации и исходном коде IDAPython.
Иногда, при использовании этого соглашения может возникать ошибка.
В этом случае модуль необходимо импортировать вручную.
Старая функция IDAPython MakeName была переименована в set_name. Если мы хотим быстро распечатать новое имя API из idc_bc695.py с помощью командной строки, мы можем использовать модуль inspect.
Для пользователей IDAPython, знакомых со старым соглашением об именах, не все имена API были изменены. Некоторые имена API нельзя переопределить, поэтому они остаются прежними. Список имен API, которые остались как есть, можно найти в Приложении в разделе Неизмененные имена API IDC. В версии IDA 7.4 уровень совместимости был отключен по умолчанию. Это не рекомендуется, но пользователи IDA могут повторно включить его, изменив IDADIR\cfg\python.cfg и убедившись, что AUTOIMPORT_COMPAT_IDA695 равен Yes. Поскольку в следующей версии IDA обратная совместимость не поддерживается, эта книга написана с использованием «новых» имен API. На дату публикации уровень совместимости нацелен только на API внутри idc.py. В октябре 2019 года была выпущена IDA 7.4. Эта версия обеспечивала поддержку Python 3. После выпуска IDA 7.4 поддерживается Python 2 и Python 3, но с окончанием срока службы Python 2.x он не будет поддерживаться в будущих версиях. Поскольку на хосте может быть установлено несколько версий Python, Hex-Rays предоставил инструмент с именем idapyswitch, который находится в IDADIR\idapyswitch.exe. После выполнения, инструмент перечисляет все доступные версии Python и позволяет пользователю выбрать, какую версию Python он хотел бы использовать.
Выполнение import sys; print (sys.path) из окна вывода IDA можно использовать для определения пути к папке для версии Python, которую использует IDA. По состоянию на апрель 2020 года, при установке IDAPython с Python 3.8 и 3.81 возникают проблемы. Чтобы решить эту проблему, см. Сообщение в блоге Hex-Rays IDA 7.4 и Python 3.85.
Для многих пользователей обычной практикой является использование функции hex для печати адреса. После обновления до IDA 7+ у пользователей, печатающих адреса в шестнадцатеричном формате, больше не будет интерактивных адресов. Типы адресов теперь длинные, а не целые. Если вам нужно, чтобы напечатанные адреса (через функцию print) были интерактивными, используйте строковое форматирование. Первый адрес для вывода, представленный ниже, является длинным, и на него нельзя нажать. Адреса, выведенные с использованием строкового форматирования, можно вывести в консоль.
Перевод не идеален, так что, если есть предложения по перефразированию некоторых частей перевода, то прошу написать мне и прислать правильную, по вашему мнению, версию перевода.
Оглавление
Вступление
Обновления
Предполагаемый читатели и отказ от ответственности
Условные обозначения
Происхождение IDAPython
Старое против нового
Проблемы с Python x86-64
Основы
Сегменты
Функции
Извлечение аргументов функций
Инструкции
Операнды
Базовые блоки
Структуры
Перечисляемые типы
Перекрестные ссылки (xref)
Поиск
Отбор данных
Комментарии и переименования
Раскраска
Доступ к необработыннм данным
Патчинг
PyQt
Создание пакетного файла
Выполнение скриптов
Yara
Unicorn Engine
Заключение
Приложение
Неизменяемые IDC API имена
PeFile
Вступление
Привет!Эта книга про IDAPython.
Изначально я написал его как справочник для себя – мне нужно было место, где я мог бы найти примеры функций, которые я обычно использую (и забываю) в IDAPython. С тех пор, как я начал эту книгу, я много раз использовал ее в качестве короткого справочника, чтобы понять синтаксис или увидеть пример некоторого кода. Многие скрипты, которые я здесь описываю являются результатом поверхностных экспериментов, которые я задокументировал в интернете.
За прошедшие годы я получил множество писем с вопросами, какое лучшее руководство существует для изучения IDAPython. Обычно я указываю на «Введение в IDAPython» Эры Карреры или примеры скриптов в открытом репозитории IDAPython. Это отличные источники для обучения, но они не охватывают некоторые общие проблемы, с которыми я столкнулся. Я хотел написать книгу, посвященную этим вопросам. Я считаю, что эта книга представляет ценность для всех, кто изучает IDAPython или хочет получить короткий справочник с примерами и фрагментами кода. Будучи электронной книгой, она не будет статичной и будет регулярно обновляться в будущем.
Если Вы столкнетесь с какими-либо проблемами, опечатками или у Вас возникнут вопросы, напишите мне на почту alexander.hanel@gmail.com или напишите мне в Twitter @nullandnull.
Предполагаемые читатели и отказ от ответственности
Эта книга не предназначена для начинающих реверс-инженеров. Она также не является введением в IDA. Если вы новичок в IDA, я бы порекомендовал приобрести книгу Криса Игла «The IDA Pro Book». Для чего-то большего, попробуйте пройти обучение у Криса Игла или Hex-Reys.Для читателей этой книги есть несколько предварительных условий. Вы должны хорошо разбираться в ассемблере, иметь опыт работы в области реверс-инжиниринга и разбираться в IDA. Если Вы достигли точки, где спросили себя «Как я могу автоматизировать эту задачу с помощью IDAPython?», тогда эта книга для Вас. Если у Вас уже есть опыт программирования на IDAPython, то Вы, вероятно, уже знакомы с материалом. Тем не менее, он может служить удобным справочником для поиска примеров часто используемых функций или может решить проблему, с которой Вы столкнетесь в будущем. Следует отметить, что я занимался реверс-инжинирингом вредоносных файлов в Windows x86. Многие примеры, приведенные в этой книге, получены из общих задач, с которыми я сталкивался при реверсе малварей. После прочтения этой книги читатель сможет самостоятельно копаться в документации и исходном коде IDAPython.
Условные обозначения
Окна вывода IDA (интерфейс командной строки) использовались для большинства примеров и вывода результата. Для краткости, некоторые примеры не содержат присвоения текущего адреса переменной. Обычно он обозначается как ea = here(). Весь код можно вырезать и вставить в командную строку или команду сценариев IDA с опцией Shift+F2. Эту книгу рекомендуется читать от начала и до конца. Есть несколько примеров, которые не объясняются построчно, потому что предполагается, что читатель понимает код из предыдущих примеров. Разные авторы вызывают API IDAPython по-разному. Иногда код вызывается как idc.get_segm_name(ea) или get_segm_name(ea). В этой книге используется первый стиль, так как это соглашение легче читать и отлаживать.Иногда, при использовании этого соглашения может возникать ошибка.
Код:
Python>DataRefsTo(here()) # нет вопросов
<generator object refs at 0x05247828>
Python>idautils.DataRefsTo(here()) # вызывает исключение
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'idautils' is not defined
Python>import idautils # импорт модуля вручную
Python>idautils.DataRefsTo(here())
<generator object refs at 0x06A398C8>
Происхождение IDAPython
IDAPython был разработан в 2004 году. Это была совместная работа Гергели Эрдели и Эро Карреры. Их цель состояла в том, чтобы объединить мощь Python с автоматизацией анализа С-подобного скриптового языка IDC IDA. В прошлом, IDAPython в основном состоял из трех отдельных модулей. Первый – это idc. Это модуль совместимости для оболочки IDC – функций IDA. Второй модуль – idautils. Это служебная функция высокого уровня для IDA. Третий модуль – idaapi. Она позволяет получить доступ к более низкоуровневым данным. С выходом версии 6.95, IDA начала включать больше модулей, охватывающих функциональность, которая исторически поддерживалась idaapi. Эти новые модули имеют соглашение об именах ida_*. В этой книге есть ссылки на несколько модулей. Один из таких модулей – ida_kernwin.py. После прочтения этой книги я бы порекомендовал изучить эти модули самостоятельно. Они находятся по адресу IDADIR\python\ida_*.py.Старое против нового
В сентябре 2017 года была выпущена IDA 7.0. Этот выпуск был существенным обновлением для HexRays, поскольку IDA была перенесена с х86 на х86-64. Побочным эффектом данного релиза является необходимость перекомпиляции старых плагинов. Несмотря на то, что внутри IDAPython произошли некоторые важные изменения, старые скрипты выполнялись в версии 7.0. Обратная совместимость с 6.95 по 7.0 обусловлена уровнем совместимости, который находится в IDADIR\python\idc_bc695.py. Следующий код является примером кода уровня совместимости.def MakeName(ea, name): return set_name(ea, name, SN_CHECK)Старая функция IDAPython MakeName была переименована в set_name. Если мы хотим быстро распечатать новое имя API из idc_bc695.py с помощью командной строки, мы можем использовать модуль inspect.
Код:
Python>import inspect
Python>inspect.getsource(MakeName)
def MakeName(ea, name): return set_name(ea, name, SN_CHECK)
Проблемы с Python-x86-64
Некоторые общие проблемы возникают при обновлении с IDA 6.9 до более новых версий при выполнении старых сценариев, которые полагаются на нестандартные модули. Ранее установленные модули (такие как pefile4) необходимо обновить с x86 до x86_64 для использования в IDA. Самый простой способ обновить их - выполнить следующую команду:C: \>python%version% \ python.exe -m pip install <package>Выполнение import sys; print (sys.path) из окна вывода IDA можно использовать для определения пути к папке для версии Python, которую использует IDA. По состоянию на апрель 2020 года, при установке IDAPython с Python 3.8 и 3.81 возникают проблемы. Чтобы решить эту проблему, см. Сообщение в блоге Hex-Rays IDA 7.4 и Python 3.85.
Для многих пользователей обычной практикой является использование функции hex для печати адреса. После обновления до IDA 7+ у пользователей, печатающих адреса в шестнадцатеричном формате, больше не будет интерактивных адресов. Типы адресов теперь длинные, а не целые. Если вам нужно, чтобы напечатанные адреса (через функцию print) были интерактивными, используйте строковое форматирование. Первый адрес для вывода, представленный ниже, является длинным, и на него нельзя нажать. Адреса, выведенные с использованием строкового форматирования, можно вывести в консоль.
Код:
Python>ea = idc.get_screen_ea() # получить адрес команды, где находится курсор
Python>print(hex(ea)) # вывод неинтерактивного адреса
0x407e3bL
Python>print("0x%x" % ea) # вывод интерактивного адреса
0x407e3b