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

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

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

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

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

Категории

Все категории
Loading categories
pyvex — Привязки Python для VEX IR от Valgrind. | Kitploit
Инструменты/GitHubGitHub/angr/pyvex
Статический анализАнализ уязвимостейАнализ КодаОбратная инженерияУтилиты и фреймворкиАнализ Бинарных ФайловСтатьи и Исследования
GitHubangr/pyvex

pyvex

Привязки Python для VEX IR от Valgrind.

Репозиторий
380129184 дней назадПроверено Kitploit

Популярное

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

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

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

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

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

PyVEX

Latest Release Python Version PyPI Statistics License

PyVEX — это привязки Python для VEX IR.

Ссылки на проект

Репозиторий проекта: https://github.com/angr/pyvex

Документация: https://api.angr.io/projects/pyvex/en/latest/

Установка PyVEX

PyVEX можно установить с помощью pip:

pip install pyvex

Использование PyVEX

import pyvex
import archinfo

# translate an AMD64 basic block (of nops) at 0x400400 into VEX
irsb = pyvex.lift(b"\x90\x90\x90\x90\x90", 0x400400, archinfo.ArchAMD64())

# pretty-print the basic block
irsb.pp()

# this is the IR Expression of the jump target of the unconditional exit at the end of the basic block
print(irsb.next)

# this is the type of the unconditional exit (i.e., a call, ret, syscall, etc)
print(irsb.jumpkind)

# you can also pretty-print it
irsb.next.pp()

# iterate through each statement and print all the statements
for stmt in irsb.statements:
    stmt.pp()

# pretty-print the IR expression representing the data, and the *type* of that IR expression written by every store statement
import pyvex
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Store):
        print("Data:", end="")
        stmt.data.pp()
        print("")

        print("Type:", end="")
        print(stmt.data.result_type)
        print("")

# pretty-print the condition and jump target of every conditional exit from the basic block
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Exit):
        print("Condition:", end="")
        stmt.guard.pp()
        print("")

        print("Target:", end="")
        stmt.dst.pp()
        print("")

# these are the types of every temp in the IRSB
print(irsb.tyenv.types)

# here is one way to get the type of temp 0
print(irsb.tyenv.types[0])

Имейте в виду, что это синтаксическое представление базового блока. То есть оно покажет вам смысл блока, но у вас не будет контекста, чтобы определить, например, какие реальные данные записываются инструкцией store.

Промежуточное представление VEX

Для работы с широким разнообразием архитектур полезно проводить анализ на промежуточном представлении. IR абстрагирует несколько различий между архитектурами при работе с разными платформами, позволяя запустить один и тот же анализ для всех из них:

  • Имена регистров. Количество и имена регистров различаются в зависимости от архитектуры, но современные процессоры придерживаются общей схемы: каждый CPU содержит несколько регистров общего назначения, регистр указателя стека, набор регистров для хранения флагов условий и т. д. IR предоставляет согласованный, абстрактный интерфейс к регистрам на разных платформах. В частности, VEX моделирует регистры как отдельное адресное пространство памяти с целочисленными смещениями (например, rax в AMD64 хранится начиная с адреса 16 в этом адресном пространстве).
  • Доступ к памяти. Разные архитектуры осуществляют доступ к памяти по-разному. Например, ARM может обращаться к памяти как в режиме little-endian, так и в big-endian. IR должен абстрагировать эти различия.
  • Сегментация памяти. Некоторые архитектуры, такие как x86, поддерживают сегментацию памяти с использованием специальных регистров сегментов. IR понимает такие механизмы доступа к памяти.
  • Побочные эффекты инструкций. Большинство инструкций имеют побочные эффекты. Например, большинство операций в режиме Thumb на ARM обновляют флаги условий, а инструкции push/pop стека обновляют указатель стека. Отслеживание этих побочных эффектов ad hoc в ходе анализа было бы безумием, поэтому IR делает эти эффекты явными.

Существует множество вариантов IR. Мы используем VEX, поскольку поддержка трансляции бинарного кода в VEX довольно хорошо развита. VEX представляет собой независимую от архитектуры, лишенную побочных эффектов модель для ряда целевых языков машинного кода. Она абстрагирует машинный код в представление, предназначенное для упрощения анализа программ. Это представление имеет пять основных классов объектов:

  • Выражения. Выражения IR представляют вычисленное или константное значение. Сюда входят загрузки из памяти, чтение регистров и результаты арифметических операций.
  • Операции. Операции IR описывают изменение выражений IR. Сюда входят целочисленная арифметика, арифметика с плавающей точкой, битовые операции и т. д. Применение операции IR к выражениям IR дает в результате выражение IR.
  • Временные переменные. VEX использует временные переменные как внутренние регистры: выражения IR сохраняются во временных переменных между использованиями. Содержимое временной переменной можно получить с помощью выражения IR. Эти временные переменные нумеруются, начиная с t0. Они имеют строгую типизацию (например, «64-битное целое» или «32-битное число с плавающей точкой»).
  • Операторы. Операторы IR моделируют изменения состояния целевой машины, такие как эффект записи в память и запись в регистры. Операторы IR используют выражения IR для значений, которые им могут понадобиться. Например, оператор записи в память использует выражение IR для целевого адреса записи и другое выражение IR для содержимого.
  • Блоки. Блок IR представляет собой набор операторов IR, соответствующий расширенному базовому блоку (называемому «IR Super Block» или «IRSB») в целевой архитектуре. Блок может иметь несколько выходов. Для условных переходов из середины базового блока используется специальный оператор IR Exit. Целевой адрес безусловного перехода в конце блока представляется выражением IR.

VEX IR на самом деле довольно хорошо документирован в файле libvex_ir.h (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h) в репозитории VEX. Для ленивых мы подробно рассмотрим некоторые части VEX, с которыми вы, вероятно, будете взаимодействовать довольно часто. Начнем с некоторых выражений IR:

IR ExpressionЗначение после вычисленияПример вывода VEX
ConstantКонстантное значение.0x4:I32
Read TempЗначение, сохраненное во временной переменной VEX.RdTmp(t10)
Get RegisterЗначение, сохраненное в регистре.GET:I32(16)
Load MemoryЗначение, сохраненное по адресу в памяти, где адрес задается другим выражением IR.LDle:I32 / LDbe:I64
OperationРезультат указанной операции IR, примененной к аргументам выражений IR.Add32
If-Then-ElseЕсли данное выражение IR вычисляется в 0, вернуть одно выражение IR. В противном случае вернуть другое.ITE
Helper FunctionVEX использует вспомогательные функции C для определенных операций, таких как вычисление регистров флагов условий для некоторых архитектур. Эти функции возвращают выражения IR.function_name()

Затем эти выражения, в свою очередь, используются в операторах IR. Вот некоторые из них:

IR StatementЗначениеПример вывода VEX
Write TempУстановить временную переменную VEX равной значению данного выражения IR.WrTmp(t1) = (IR Expression)
Put RegisterОбновить регистр значением данного выражения IR.PUT(16) = (IR Expression)
Store MemoryОбновить ячейку в памяти (заданную как выражение IR) значением (также заданным как выражение IR).STle(0x1000) = (IR Expression)
ExitУсловный выход из базового блока, где целевой адрес перехода задается выражением IR. Условие также задается выражением IR.if (condition) goto (Boring) 0x4000A00:I32
Скачать инструмент