Гостевая статья MINDSHARE: использование LLDBINIT для улучшения отладчика LLDB

В последнее время я интенсивно использую для отладки всех вещей в macOS, таких как WebKit и системные демоны. Исходя из фона WinDBG, LLDB совсем другой. Я ожидал аналогичной обработки двоичных модулей в LLDB, но, к сожалению, это не так. Приятной особенностью LLDB является его настраиваемость. Его API можно использовать непосредственно из , что делает его очень гибким в добавлении функций, которые помогают ускорить отладку и делают его приятным - как визуально, так и практически. К счастью, кто-то уже сделал скрипт для этого. Они описывают это как «клон gdbinit для LLDB». Использовать этот скрипт очень просто. Просто скачайте lldbinit.py и импортируйте его в свой .lldbinit файл, например command script import ~/lldbinit.py.

Это будет выглядеть примерно так при запуске LLDB с двоичным файлом или при подключении к нему:

Picture1 (2).png


Если вы введете lldbinitcmdsего, он перечислит все новые команды, которые были введены в этот скрипт, что сделает отладку сносной и визуально приятной.

Одна функция, которую мне не хватает в LLDB, которая присутствует в WinDBG, - это возможность использовать имена модулей в точках останова со смещением, например, bp addresslib+1EE6где addresslib.dllнаходится загруженный модуль. Способ использования смещений в LLDB заключается в получении базового адреса модулей и последующем добавлении смещения. Это привело бы к следующему:

Picture2 (2).png


Это становится утомительным. Поэтому я подумал, почему бы не добавить поддержку lldbinit.py имен модулей? Идея довольно тривиальная:

1- Получить имя модуля из ввода.
2- Получить список загруженных модулей.
3- Фильтровать список с именем модуля и вернуть его базовый адрес.

Я начал с команды bpt, которая находится в функции cmd_bpt(). Ввод будет доступен в command параметре, который передается evaluate()для анализа. Первым действием, которое я сделал, было получение списка загруженных модулей:

Picture3 (2).png



Чтобы получить текущий контекст выполнения, его следует передать в cmd_bpt() соответствии с , добавив, таким образом, exe_ctxв качестве параметра. Эта функция возвращает словарь с загруженными модулями в текущем контексте.

Далее идет функция, которая фильтрует и возвращает базовый адрес модуля плюс его смещение:

Picture4 (2).png



Это должно быть само за себя. Он вернет окончательное выражение, которое состоит из базового адреса модуля плюс смещение (например 0x00007fff50c2a000+0x23351), возвращаемое из ввода, например audiotoolboxcore+0x23351.

Чтобы собрать вещи вместе, cmd_bpt() становится:

Picture5 (1).png


Также требуются декларации, такие как импорт shlexи определение по loaded_mods всему миру.

Picture6 (1).png

Ницца.

Вывод

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

Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!