Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
r2gopclntabParser — Скрипт для radare2, который парсит gopclntab для облегчения реверс-инжиниринга Go-бинарных файлов. | Kitploit
Инструменты/GitHubGitHub/asherdll/r2gopclntabparser
Статический анализОбратная инженерияОтладчикиФорензикаАнализ вредоносных программАнализ Бинарных Файлов
GitHubasherdll/r2gopclntabparser

r2gopclntabParser

Скрипт для radare2, который парсит gopclntab для облегчения реверс-инжиниринга Go-бинарных файлов.

Репозиторий
17215 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

r2gopclntabParser

Примечание: Эта функция была напрямую реализована в ядре radare2 как плагин анализа gopc

Парсер gopclntab на основе radare2 для восстановления символов функций из Go-бинарников, включая полностью лишённые символьной информации. Поддерживает ELF, Mach-O и PE бинарники для версий Go 1.2, 1.16, 1.18 и 1.20+.

Каждый Go-бинарник версии 1.2+ содержит область данных, называемую gopclntab (таблица строк программы и счётчика команд), которую рантайм Go использует для стековых трасс, сообщений паники, сборки мусора и поддержки отладчика. Это один из наиболее ценных источников информации о символах в Go-бинарниках.

r2gopclntabParser считывает эту область через radare2, анализирует версионно-зависимые структуры и либо выводит восстановленный список функций (с адресами, исходными файлами и номерами строк), либо применяет восстановленные имена обратно в открытую сессию radare2 в качестве определений функций, флагов и комментариев.


Содержание

  • Предварительные требования
  • Быстрый старт
  • Справочник по CLI
  • Режимы вывода и примеры
    • Режим по умолчанию (заголовок + список функций)
    • Подробный режим (-v)
    • Режим поиска (-n)
    • Вывод в JSON (--json)
    • Список исходных файлов (--files)
    • Режим применения (--apply)
  • Сводка результатов: Mach-O (тестовый бинарник без символов)
  • Тест PE: Greenblood, бинарник-вымогатель на Go
  • Сценарии использования для обратной разработки
  • Поддерживаемые платформы и версии Go
  • Методология
    • Стратегия поиска секций
    • textStart vs .text секция
    • Версионно-зависимый разбор структур
    • Декодирование данных PC
  • Ограничения
  • Дополнительная документация
  • Ссылки

Предварительные требования

ЗависимостьМинимальная версия
Python 33.8+
radare25.0+ (протестировано на 6.0.9)
r2pipeлюбая

Других пакетов Python не требуется. Скрипт использует только стандартную библиотеку (struct, json, argparse, os, sys) и r2pipe.


Быстрый старт```bash

List all functions recovered from a Go binary

python3 r2_gopclntab.py -f ./mybinary -l

Search for a specific function (substring match)

python3 r2_gopclntab.py -f ./mybinary -n main.main

Verbose header + function list

python3 r2_gopclntab.py -f ./mybinary -v -l

Apply recovered names into an r2 session

python3 r2_gopclntab.py -f ./mybinary --apply

JSON output

python3 r2_gopclntab.py -f ./mybinary --json

From within r2 (attach to running session)

#!pipe python3 r2_gopclntab.py --r2pipe --apply -v

## Справочник по CLI```
usage: r2_gopclntab.py [-h] [-f FILE] [-n FUNCNAME] [-v] [-l]
                       [--apply] [--json] [--files] [--r2pipe]

Required (one of)

FlagDescription
-f FILE, --file FILEПуть к Go-бинарному файлу для анализа. Скрипт запускает собственный экземпляр r2.
--r2pipeПодключиться к уже запущенной сессии r2 (для использования внутри консоли r2).

Optional

FlagDescription
-l, --listВывести каждую восстановленную функцию с её адресом.
-n NAME, --funcname NAMEВывести только функции, имя которых содержит NAME (поиск по подстроке). Если существует точное совпадение, его адрес выводится отдельно.
-v, --verboseВыводить сообщения о ходе работы, разобранные поля заголовка и внутренние смещения.
--applyЗаписать восстановленные имена функций в сессию radare2 как определения функций (af+), флаги в пространстве флагов go. и комментарии с исходным именем Go и местоположением в исходном коде.
--jsonВывести заголовок и полный список функций в формате JSON в stdout.
--filesВывести список путей к исходным файлам, извлечённым из таблицы файлов.
-h, --helpПоказать справочное сообщение.

Флаги можно свободно комбинировать. Если не указан флаг вывода, поведение по умолчанию — вывод заголовка и полного списка функций.


Output Modes and Examples

Все примеры ниже были запущены на обезображенном бинарном файле Go 1.26 Mach-O arm64 (собранном с -ldflags="-s -w"). Тестовая программа определяет main.main, main.fibonacci, main.helloWorld и main.addNumbers. Компилятор встроил helloWorld и addNumbers, поэтому они не появляются в gopclntab.

Default Mode (Header + Function List)

Запуск без флагов (или только с -f) выводит разобранный заголовок, а затем полную таблицу функций:``` $ python3 r2_gopclntab.py -f ./gotest_stripped

[Вики](https://github.com/ainrm/OffensivePipelineCD/wiki) • [Установка](https://github.com/ainrm/OffensivePipelineCD/wiki/Installation) • [Загрузки](https://github.com/ainrm/OffensivePipelineCD/wiki/Downloads) • [Плагины](https://github.com/ainrm/OffensivePipelineCD/wiki/Development)```
============================================================
  Go pclntab Header
============================================================
  Magic:           0xFFFFFFF1
  Go version:      1.20+
  Pointer size:    8
  Min LC (quantum):4
  Num functions:   2030
  Num files:       261
  funcnameOffset:  0x48
  cuOffset:        0x14D20
  filetabOffset:   0x158D8
  pctabOffset:     0x19A98
  pclnOffset:      0x55E40
============================================================

ADDRESS       FUNCTION NAME
----------------------------------------------------------------------
0x100001000   go:buildid
0x100001070   internal/abi.BoundsDecode  (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/bounds.go:86)
0x100001150   internal/abi.NoEscape  (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/escape.go:19)
0x100001160   internal/abi.Kind.String  (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:143)
0x1000011E0   internal/abi.TypeOf  (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:181)
0x1000011F0   internal/abi.(*Type).ExportedMethods  (/opt/homebrew/Cellar/go/1.26.1/libexec/src/internal/abi/type.go:453)
...
0x1000A0BB0   main.fibonacci  (/tmp/gotest/main.go:13)
0x1000A0C20   main.main  (/tmp/gotest/main.go:20)
0x1000A0D20   go:textfipsstart
0x1000A0D30   go:textfipsend

[+] 2030 function(s) shown

Подробный режим (-v)

Добавляет ход сканирования разделов, детали разрешения textStart и информацию о внутренних смещениях:``` $ python3 r2_gopclntab.py -f ./gotest_stripped -v

Please provide the Markdown content to translate.```
[*] Running radare2 analysis...
[*] Binary format: mach0, endian: little, arch: arm, bits: 64
[*] Scanning binary for gopclntab magic bytes...
[*]   Scanning section '0.__TEXT.__text' (0x100001000, 0x9FD44)...
[*]   Scanning section '1.__TEXT.__symbol_stub1' (0x1000A0D60, 0x2B8)...
[*]   Scanning section '2.__TEXT.__rodata' (0x1000A1020, 0xACC2)...
[*]   Scanning section '3.__TEXT.__gopclntab' (0x1000ABCE8, 0xA48AE)...
[*]   Found magic at vaddr=0x1000ABCE8
[*] Parsed header: PcHeader(magic=0xFFFFFFF1, version=1.20+, ptrSize=8, minLC=4,
    nfunc=2030, nfiles=261, textStart=0x0)
[*] textStart is 0, using .text section vaddr: 0x100001000
[*] Parsed 2030 functions

============================================================
  Go pclntab Header
============================================================
  Magic:           0xFFFFFFF1
  Go version:      1.20+
  ...

Режим поиска (-n)

Фильтрует список функций по совпадению подстроки. Если найдено точное совпадение, его адрес выводится отдельно.

Скачать инструмент