Еще один парсер Golang-бинарников для IDAPro
Английский | 中文
ПРИМЕЧАНИЕ:
Сейчас последняя ветка master — это версия для Python3. Старая ветка master была переименована в ветку py2 и временно не поддерживается.
Инструкции для ветки Python3
Эта версия разработана и протестирована на macOS/Windows, IDA7.4+ и Python3.8.x.
Если возникают проблемы на других платформах и версиях, вы можете создавать issue или Pull Requests.
Кроме того, следует отметить, что IDA7.4 на macOS использует Python3, установленный по умолчанию, что может привести к невозможности загрузки сторонних библиотек, установленных вами. Вам нужно переключиться на Python, установленный через brew. Для конкретных методов переключения обратитесь к этому скрипту.
Вдохновленный golang_loader_assist и jeb-golang-analyzer, я написал более полный инструмент для парсинга Go-бинарников для IDAPro.
Основные возможности:
- Найти и разобрать структуру firstmoduledata в Go-бинарнике и добавить комментарий для каждого поля;
- Найти pclntab (PC Line Table) по firstmoduledata и разобрать его. Затем найти, разобрать и восстановить имена функций и пути к исходным файлам в pclntab. Пути к исходным файлам будут выведены в окно вывода IDAPro;
- Разобрать строки и указатели на строки, добавить комментарий для каждой строки и создать dref для каждого указателя на строку;
- В соответствии с firstmoduledata найти каждый type и разобрать его, добавить комментарий для каждого атрибута type, что будет очень удобно для исследователя вредоносного ПО при анализе сложных типов или определений структур данных;
- Разобрать itab (таблицу интерфейсов).
Полезная информация для реверс-инжиниринга Go-бинарников:

И есть две полезные особенности в go_parser:
- Он также корректно работает с бинарниками, имеющими повреждённую информацию в заголовке файла, особенно в заголовках секций;
- Все перечисленные выше функции применимы к бинарникам, собранным с buildmode=pie.
Пример результата разбора структуры данных конфигурации в DDGMiner v5029 (MD5: 95199e8f1ab987cd8179a60834644663):

И список путей к исходным файлам, определённых пользователем:

Файлы проекта:
- go_parser.py :Входной файл, нажмите [Alt+F7], выберите и выполните этот файл;
- common.py: Определение общих переменных и функций;
- pclntbl.py: Парсинг pclntab (PC Line Table);
- strings.py: Парсинг строк и указателей на строки;
- moduldata.py: Парсинг firstmoduledata;
- types_builder.py: Парсинг types;
- itab.py: Парсинг itab (таблицы интерфейсов);
Дополнительно, str_ptr.py будет разбирать указатели на строки, если вручную указать начальный и конечный адреса указателей на строки.
Примечание
- Этот инструмент написан на Python3 и протестирован на IDA7.4+;
- Модуль парсинга строк был перенесён из golang_loader_assist, и я добавил функцию парсинга указателей на строки. На данный момент поддерживается только архитектура x86 (32- и 64-битная).
Ссылки
- Analyzing Golang Executables
- Reversing GO binaries like a pro
- Reconstructing Program Semantics from Go binaries.pdf
- Go二进制文件逆向分析从基础到进阶——综述
- Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表
- Go二进制文件逆向分析从基础到进阶——数据类型
- Go二进制文件逆向分析从基础到进阶——itab与strings
- Go二进制文件逆向分析从基础到进阶——Tips与实战案例