Введение в реверсинг с нуля используя IDA PRO. Часть 13.

Дата публикации 11 сен 2017 | Редактировалось 9 ноя 2017
Перед тем как продолжать с упражнениями углубляться в использование IDA, мы рассмотрим эту главу №13 в расслабленном режиме(RELAX MODE WASM), чтобы изучить плагин, который достаточно удобный и который даёт нам возможность управлять лучше PYTHON, Шадди предложил использовать эту включенную, интересную панельку и я ему очень благодарен.

Плагин называется IPYIDA и он устанавливается простым копированием и вставкой следующей строки в панель PYTHON.

Код (C++):
  1. import urllib2; exec urllib2.urlopen('https://github.com/eset/ipyida/raw/stable/install_from_ida.py').read()
Это одно-строчная команда, которую можно скопировать и вставить отсюда, если что-то пойдёт не так, то ссылка на неё находится ниже.

https://github.com/eset/ipyida

1.png

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

После установки и запуска его из EDIT → PLUGINS → IPYIDA внизу мне покажется маленькое окно без нужного места для записи, но перетаскивая его, я могу сделать его как вкладку, чтобы получить больше места и стало работать более комфортно.

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

Аналогично в PYTHONе, который включен в IDA, многие вещи работают так же как и снаружи, но некоторые нет, и про это хорошо упомянуть, что это может случится.

То есть, внутренний PYTHON IDA очень похож на OLLYDBG скрипт, чтобы можно было заскриптовать функциональность IDA, больше чем для нативных скриптов PYTHONа, которые запускаются в более совместимой форме вне IDA.

2.png

Очевидно он гораздо мощнее чем панелька PYTHON, если мы нажмём клавишу ? то увидим быструю справку.

IPython - расширенный интерактивный Python
=========================================

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

В вашей системной командной строке введите «ipython -h», чтобы увидеть доступные параметры командной строки. В этом документе описываются только интерактивные функции.

ОСНОВНЫЕ ХАРАКТЕРИСТИКИ
----------------------------------------

* Доступ к стандартной справке Python. С версии Python 2.1, доступна справочная система с доступом к объекту docstrings и руководствам Python. Просто введите 'help' (без кавычек) чтобы получить доступ к справке.

* Магические команды: просто введите %magic для получения информации по магической подсистеме.

* Системные псевдонимы команд, доступны через команду %alias или файл(ы) конфигурации.

* Информация о динамических объектах:

Введите ?word или word? печатающее подробную информацию об объекте. Если некоторые строчки в объекте слишком длинные (docstrings, код и т.д.), они становятся сокращенными в центре для краткости.

Ввод ??word или word?? дает доступ к полной информации, без сокращения длинных строк. Длинные строки отправляются на экран через экранный пейджер, если они длиннее чем экран, иначе печатается.

? / ?? система предоставляет доступ ко всему исходному коду для любого объекта (если доступно), показывает прототипы функций и другую полезную информацию.

Если вы просто хотите видеть docstring объекта, введите '%pdoc object' (без кавычек и без %, если у вас включена опция automagic).

* Завершение в локальном пространстве имен, для этого введите TAB в командной строке.

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

Для этой функции требуются модули readline и rlcomplete, иначе она не будет работать, если вашему Python не хватает поддержки readline (например, в Windows).

* Поиск предыдущей истории команд двумя способами (также требует чтения):

- Начните вводить текст, а затем используйте Ctrl-p (предыдущий, вверх) и Ctrl-n (далее, вниз) для поиска только элементов истории, соответствующих тому, что вы набрали. Если вы используете Ctrl-p / Ctrl-n в пустой строке, они просто ведут себя как обычные клавиши со стрелками.

- Нажатие Ctrl-r: откроет запрос на поиск. Начните печатать, и система ищет вашу историю для строк, которые соответствуют тому, что вы набрали до сих пор, завершая как можно больше.

- % hist: история поиска по индексу (это * не * требует readline).

* Постоянная история команд в сеансах.

* Регистрация ввода с возможностью сохранения и восстановления рабочего сеанса.

* Выход из системы с помощью !. Ввод !ls будет запускать 'ls' в текущем каталоге.

* Команда reload выполняет 'глубокую' перезагрузку модуля: изменения, внесенные в модуль, поскольку вы импортировали, будут действительно доступны без выхода.

* Режим verbose и цветные исключения трассировки. Смотрите функции magic xmod и xcolor для деталей (просто введите %magic).

* Cистема кэширования для ввода:

IPython предлагает пронумерованные подсказки (In / Out) с кэшированием ввода и вывода. Все входные данные сохраняются и могут быть получены в виде переменных (кроме обычного вызова клавиши со стрелкой).

Следующие ГЛОБАЛЬНЫЕ переменные всегда существуют (поэтому не перезаписывайте их!):
_i: хранит предыдущий ввод.
_ii: следующий после предыдущего.
_iii: следующий-следующий после предыдущего.

Кроме того, динамически создаются глобальные переменные с именем _i<n> (<n> - счетчик подсказок), поэтому _i<n> == _ih[<n>]

Например, то, что вы набрали в строке 14, доступно как _i14 и _ih[14].

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

История функции %hist позволяет Вам видеть любую часть вашей истории ввода, печатая диапазон переменных _i. Обратите внимание, что введенные данные, содержащие магические функции (%), отображаются в истории с добавленным комментарием. Это потому, что они не являются по-настоящему действительным кодом Python, поэтому Вы не можете их выполнить.

* Выходная система кеширования:

Для вывода, возвращаемого из действий, существует система, аналогичная входному кешу, но использующая _ вместо _i. Кэшируются только действия, которые приводят к результату (НЕ присваивания, например). Если вы знакомы с Mathematica, переменные IPython ведут себя точно так же, как и переменные % Mathematica.

Следующие ГЛОБАЛЬНЫЕ переменные всегда существуют (поэтому не перезаписывайте их!):
_ (один знак подчеркивания): хранит предыдущий вывод.
__ (два подчеркивания): следующий после предыдущего.
___ (три подчеркивания): следующий-следующий после предыдущего.

Глобальные переменные с именем _<n> создаются динамически(<n> является счетчиком подсказок), так что результат вывода <n> всегда доступен как _ <n>.

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

* История каталогов:

Ваша история посещенных каталогов хранится в глобальном списке _dh, и команда magic% cd может использоваться для перехода к любой записи в этом списке.

* Автоматические скобки и кавычки (адаптированные из LazyPython от Nathan Grey)

1. Автоматические скобки
Вызываемые объекты (т.е. Функции, методы и т.д.) могут быть вызваны так (обратите внимание на запятые между аргументами) ::
В [1]: callable_ob arg1, arg2, arg3 и ввод будет переведен в это::
callable_ob(arg1, arg2, arg3)
Эта функция отключена по умолчанию (в редких случаях она может создавать нежелательные побочные эффекты), но вы можете активировать ее в командной строке, запустив IPython с помощью `--autocall 1`, установить её навсегда в своем файле конфигурации или включить во время выполнения с `% autocall 1`.

Вы можете принудительно скопировать скобки, используя «/» в качестве первого символа строки.
В [1]: /globals # получится 'globals()'
Обратите внимание, что знак '/' ДОЛЖЕН быть первым символом в строке! Это не сработает ::
В [2]: print /globals # синтаксическая ошибка

В большинстве случаев автоматический алгоритм должен работать, поэтому вам редко нужно явно вызывать /. Одним из примечательных исключений является то, что вы пытаетесь вызвать функцию со списком кортежей в качестве аргументов (скобки будут путать IPython) ::
В [1]: zip (1,2,3),(4,5,6) # не будет работать
но это будет работать::
В [2]: /zip (1,2,3),(4,5,6)
------> zip ((1,2,3),(4,5,6))
Out[2]= [(1, 4), (2, 5), (3, 6)]

IPython сообщает вам, что он изменил вашу командную строку, показывая новую командную строку, которой предшествует ->. например. ::
В [18]: callable list
-------> callable (list)

2. Авто-Цитирование
Вы можете заставить авто-цитировать аргументы функции, используя «,» в качестве первого символа строки. Например::
В [1]: ,my_function /home/me # получится my_function("/home/me")

Если вы используете ';' вместо этого весь аргумент цитируется как одна строка (в то время как «,» разбивается на пробелы) ::
В [2]: ,my_function a b c # получится my_function("a","b","c")
В [3]: ;my_function a b c # получится my_function("a b c")

Обратите внимание, что ',' ДОЛЖЕН быть первым символом в строке линии! Это не будет работать ::
В [4]: x = ,my_function /home/me # syntax error

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

Опция автозавершения с помощью клавиши TAB, которая не имеет панели включенной в PYTHON, очень ценна и мы должны её за это благодарить.

Мы видим, что если я введу IMP и нажму TAB он автозавершит моё слово IMPORT и если я нажму TAB снова.

3.png

Я вижу возможности команды IMPORT, где я могу перемещаться вверх и вниз с помощью стрелок и я выхожу отсюда с помощью клавиши ESC.

4.png

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

5.png

Когда я выхожу с помощью ESC, то возвращаюсь туда где я был раньше.

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

%hist показывает историю команд, которые я использовал.

6.png

%edit открывает блокнот.

И %edit x-y открывает блокнот на строчках в этом промежутке.

7.png

%history -n добавляет номера строк, чтобы хорошо знать, если нам нужно открыть диапазон, чтобы создать скрипт с помощью редактирования.

8.png

Очевидно IPYTHON достаточно мощный и у него есть тысячи команд, которые могут быть завершены здесь.

http://ipython.org/ipython-doc/3/index.html

Мы будем делать пару простых примеров с использованием API включенного в IDAPYTHON используя этот новый плагин.

9.png

Текущий адрес курсора.

10.png

Если я сделаю скрипт и сохраню его.

11.png

Если мы выполним скрипт через меню IDA, FILE → SCRIPT FILE он будет работать.

12.png

Также команда idc.GetDisasm(ea) будут давать нам инструкции где помещен курсор.

13.png

Если я изменю курсор на другую инструкцию, я буду должен ввести снова EA.

14.png

С помощью idc.GetOpnd я могу получить первый или второй операнд инструкции.

15.png


Имя текущей функции.

16.png

Имена всех функций сегмента.

17.png

Инструкции функций.

18.png

Ссылки на функцию, если мы установим курсор в начале функции, которая имела ссылки и мы найдём снова EA.

19.png

Я вижу ссылку.

20.png

21.png

Плагин даёт нам много удобства и IDAPYTHON имеет тысячи инструкций, которые служат для установки BP, логирования, запуска отладчика и т.д.

Хорошо, пора немного отдохнуть, увидимся в 14-той главе.

ПРОБЛЕМЫ УСТАНОВКИ
Обычно существуют проблемы установки, если у нас уже есть установленный до этого момента pip в PYTHON, это можно легко проверить в IDA набрав перед установкой в панели PYTHON.

import pip

Если он не вернет ошибку, это значит, что у Вас уже есть установленный pip и не получится установить его ещё раз, что нужно тогда сделать для установки - это открыть консоль Windows и ввести.

python -m pip uninstall pip setuptools

и перезапустите IDA, это поможет установить плагин правильно.

Если после перезапуска IDA плагин не запускается, он долен быть загружен со страницы и скопирован вручную ipyida_plugin_stub.py в папку плагинов IDA.

https://github.com/eset/ipyida

22.png


====================================================================
При установке может появиться такая ошибка:

urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>

Она устраняется, изменением скриптв на такой:

import urllib2; import ssl; ssl._create_default_https_context = ssl._create_unverified_context; exec urllib2.urlopen('https://github.com/eset/ipyida/raw/stable/install_from_ida.py').read()

Решение любезно предоставил ВАСМовчанин - loonydev

20 14.515
yashechka

yashechka
Ростовский фанат Нарвахи

Регистрация:
2 янв 2012
Публикаций:
90

Комментарии


      1. yashechka 11 сен 2017
        Готово, прошу всех к столу :)
      2. yashechka 11 сен 2017
        Донатов - дырка от бублика :) Либо никто не читает, либо люди не имеют ecoin, либо я плохо работаю.
      3. yashechka 12 сен 2017
        Спасибо :)
        DzenGURU нравится это.
      4. yashechka 12 сен 2017
        Gricias mis amigos
      5. loonydev 9 ноя 2017
        Привет, добавь где-то в статью или ниже про возможную ошибку в VBox. При установке вываливается:
        urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>

        Нужно изменить скрипт на такой:
        import urllib2; import ssl; ssl._create_default_https_context = ssl._create_unverified_context; exec urllib2.urlopen('https://github.com/eset/ipyida/raw/stable/install_from_ida.py').read()
        yashechka нравится это.
      6. slizhov 12 ноя 2017
        Есть проблема с установкой IPYIDA:
        urllib2.URLError: <urlopen error [Errno 1] _ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version>.
        yashechka нравится это.
      7. yashechka 12 ноя 2017
        Получилось решить проблему? Вот ниже уже что-то писали.
      8. Sloneny 1 янв 2018
        Бесит меня этот Рикардо, дико. Ладно человек не понимает что его "с нуля" находиться далеко за пределами реального нуля :), так еще и не может обойтись без плагинов, с установкой которых постоянные проблемы.
        Вот на 100% уверен что дальше половина материала будет с использованием IPython, а он скотина такая ни в какую не хочет устанавливаться:shout:

        yashechka спасибо за твои труды:good3:
        yashechka нравится это.
      9. Sloneny 1 янв 2018
        Небольшое дополнение:
        Если IPython не устанавливается даже после команды от пользователя loonydev, и вы получаете новую ошибку:
        Код (Text):
        1. ssl._create_default_https_context = ssl._create_unverified_context
        2. AttributeError: 'module' object has no attribute '_create_unverified_context'''
        Значит ваш питон ниже версии 2.7.9. Сходите на офф сайт, и обновитесь до 2.7.14. После этого снова попробуйте начать с команды из статьи.
        yashechka нравится это.
      10. Amicus 29 авг 2018
        При установке через и python-консоль и через install_from_ida.py ошибка
        No such file or directory "C:\Program Files(x86)\IDA 6.8\plugins\ipyida.py
        Python 2.7.15 , IDA 6.8 и 7.0 . Оси win10 и в win7 .
        Если удалить pip плагин вообще не ставится , тк хочет скачать зависимости , а зависимости нечем скачивать .
        Кое-как ставится через ручное копирование в директорию plugins , но потом работает совсем не так как у Рикардо . Чаще всего виснет с сообщением ...:
        yashechka нравится это.
      11. Leonid228 7 окт 2018
        Можно пошагово рассказать как установить плагин. Если я копирую в папку к палгинам install_from_ida.py, ipyida_plugin_stub и папку ipyida то во время запуска иды появляется командная строка питона и завершается, но в меню edit -> plugins ничего не добавляется. Есле закинуть вообще все файлы в дерикторию plugins то вылезает ошибка: Failed while executing...
        [​IMG]
        yashechka нравится это.
      12. yashechka 7 окт 2018
        Я ещё ничего не пробовал. Я пока только перевожу. Попробуйте другим написать.
      13. Leonid228 12 окт 2018
        Разобрался, плагин должен конектиться к программе через локалхост, всему виной мое правило в фаерволе блокирующие любую сетевую активность процессу IDA Pro.
        yashechka нравится это.
      14. Sergey546 8 дек 2018
        Такая же сложность как и у slizhov:
        urllib2.URLError: <urlopen error [Errno 1] _ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version>.
        yashechka нравится это.
      15. Sergey546 24 дек 2018
        Кто может помочь на предыдущий вопрос?
        yashechka нравится это.
      16. abeljmcls 30 дек 2018
        Привет, я не говорю по-русски, но надеюсь вы меня понимаете XD. для тех, кто не использует этот плагин, не пугайтесь, потому что idapython уже интегрирован по умолчанию, посмотрите и попробуйте коды и посмотрите :)

        https://i.imgur.com/WkIY4QS.png
        yashechka нравится это.
      17. yashechka 30 дек 2018
        А какой Ваш родной язык?
      18. Sergey546 3 янв 2019
        Плагин IPYIDA не устанавливается, выдаёт ошибку urllib2.URLError: <urlopen error [Errno 1] _ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version>. Антивирус отключен, браузер тоже кто поможет в установке?
        artin и yashechka нравится это.
      19. casojatah 13 авг 2019
        Тут 2 проблемы:
        1. никто не читает что пишет ошибка. а там черным по белому написано что ошибка в SSL. И если чуть чуть загуглить, то находится решение. Дело в том что с IDA в комплекте идет версия Python в составе которой OpenSSL 0.9.8 , которая не поддерживает TLSv1.2, а все ресурсы к которым обращается скрипт, давно удалили TLSv1.0 и TLSv1.1 так что если вы используете Python 2.7.6 или старше, вам необходимо обновить до последней версии ( в настоящее время 2.7.15) для того , чтобы установить пакеты с pip.
        Скачиваем и устанавливаем https://www.python.org/downloads/release/python-2715/ при установке само увидит предыдущую версию и накатит поверх
        2. Когда Рикардо писал данную главу, то всё с установкой работало прекрасно, но прошло столько времени, скрипт Установки был неоднократно переписан, что поломало совместимость с 6.8 (с более свежими не проверял правда). Поэтому чтоб на 6.8 произвести корректную установку, надо использовать скрипт установки того времени когда была написана глава. Хорошо гит умеет отдавать старые версии, правильная ссылка будет такой:

        Код (Text):
        1. import urllib2; exec urllib2.urlopen('https://raw.githubusercontent.com/eset/ipyida/be38983572e8af18c9af1de63c90e170c2ecc4c1/install_from_ida.py').read()
        Нужен интерент как для скачки скрипта, так и для последующей установки (докачивает модули)
        Перезагружать IDA не требуется. Плагигн сразу начинает работать. Edit - Plugins - доступно только когда открыто что либо, так что если открыто что либо для анализа - то сразу можно увидеть результат открыв пункт в плагинах, либо shift + .

        Устанавливается конечно же самая последняя версия плагина. Неизветсно как оно будет вести себя с 6.8, так что если будут глюки, всегда можно с гита скачать более ранний релиз, и руками заменить соответсвтующие файлы в c:\Python27\Lib\site-packages\ipyida\
      20. BigfooD 18 мар 2024
        На данный момент все скрипты не работают, поэтому устанавливаем ручками:

        1. Установить Python v2.7.18
        https://www.python.org/ftp/python/2.7.18/python-2.7.18.msi
        При установке выблать "Add python.exe to Path"
        2. Запустить от имени администратора "Командная строка" или "cmd"
        3. Обновить PIP командой:
        python -m pip install --upgrade pip
        * Не обращаем внимания на сообщение об устаревшей версии Python!
        4. Установить PIP командой:
        pip install ipyida
        5. Скачать ipyida
        https://github.com/eset/ipyida/archive/refs/tags/v1.7.2.zip
        6. Из архива v1.7.2.zip заменить папку ipyida
        ~\Python27\Lib\site-packages\
        7. Также из архива файл ipyida_plugin_stub.py скопировать в:
        ~\IDA 6.8\plugins\
        8. Пользуемся!!!