LIMB
Вход Регистрация

тема

Сборка и настройка Keystone для работы с IDA Pro 9.0 на ARM

zsmp0 · · 0 ответов · 562 просмотров

Стандартная установка​

1. Скачиваем последнюю версию keypatch.py (ссылка на репозиторий) и помещаем файл в каталог:​
Bash:
/Applications/IDA Professional 9.0.app/Contents/MacOS/plugins/
2. Устанавливаем keystone​
Bash:
pip3 install keystone-engine
Если используется Python версии ниже 3.11, дополнительно выполняем:​
Bash:
pip3 install six
​
После этого, если у вас Intel-версия macOS, Keypatch в IDA Pro 9.0 должен заработать сразу.
Но на ARM (Apple Silicon) при запуске IDA Pro 9.0, скорее всего, появится ошибка
Code:
/Applications/IDA Professional 9.0.app/Contents/MacOS/plugins/keypatch.py: ERROR: fail to load the dynamic library.
Traceback (most recent call last):
  ...
ImportError: ERROR: fail to load the dynamic library.

Причины ошибки​

Ошибку могут вызывать два фактора:
  1. В каталоге keystone отсутствуют libkeystone.dylib и libkeystone.0.dylib
    (важнее всего наличие именно libkeystone.0.dylib, первый файл - лишь симлинк).
  2. Файл libkeystone.dylib собран под архитектуру x86_64, а не arm64.
Чтобы проверить архитектуру библиотеки, используйте команду file:
Bash:
# Библиотека по умолчанию:
➜ ~ file /opt/homebrew/lib/python3.13/site-packages/keystone/libkeystone.dylib
# результат: /opt/homebrew/lib/python3.13/site-packages/keystone/libkeystone.dylib: Mach-O 64-bit dynamically linked shared library x86_64

# Собранная вручную:
➜ ~ file ~/Downloads/keystone/build/llvm/lib/libkeystone.0.dylib
# результат: /Users/studio/Downloads/keystone/build/llvm/lib/libkeystone.0.dylib: Mach-O 64-bit dynamically linked shared library arm64

Решение​

Необходимо самостоятельно собрать arm64-версию библиотеки libkeystone.0.dylib и скопировать её в каталог установки keystone.

Шаг 1. Скачивание исходников​

Code:
git clone https://github.com/keystone-engine/keystone.git
cd keystone
mkdir build
cd build

Шаг 2. Настройка конфигурации​

1. В файле make-common.sh заменяем строку:​
Code:
# было
ARCH=''
# стало
ARCH='arm64'
2. В файле make-share.sh указываем свой путь к Python:​
Code:
# было
cmake ... -G "Unix Makefiles" ..

# стало (пример для Python 3.12):
cmake -DBUILD_LIBS_ONLY=$BUILD_LIBS_ONLY -DLLVM_BUILD_32_BITS="$LLVM_BUILD_32_BITS" -DCMAKE_OSX_ARCHITECTURES="$ARCH" -DCMAKE_BUILD_TYPE=$BUILDTYPE -DBUILD_SHARED_LIBS=ON -DLLVM_TARGETS_TO_BUILD="all" -DPYTHON_LIBRARY="/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/lib/libpython3.12.dylib" -DPYTHON_EXECUTABLE="/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.12/bin/python3.12" -G "Unix Makefiles" ..

3. В каждом CMakeLists.txt меняем:
Code:
# было
cmake_minimum_required(VERSION 2.8.7)

# стало
cmake_minimum_required(VERSION 3.5)

# это комментируем. CMP0051 является устаревшим

if (POLICY CMP0051)
  # CMake 3.1 and higher include generator expressions of the form
  # $<TARGETLIB:obj> in the SOURCES property.  These need to be
  # stripped everywhere that access the SOURCES property, so we just
  # defer to the OLD behavior of not including generator expressions
  # in the output for now.
  cmake_policy(SET CMP0051 OLD)
endif()

Шаг 3. Сборка​

В каталоге build выполняем:
Code:
../make-share.sh

Если компиляция успешна — появится соответствующее окно.
Не удалось прогрузить медиа



Использование собранной библиотеки​

Собранные файлы libkeystone.dylib и libkeystone.0.dylib находятся в:
Code:
keystone/build/llvm/lib
Их нужно скопировать в каталог, где ранее возникала ошибка. В моём случае это был:
Code:
/opt/homebrew/lib/python3.13/site-packages/keystone/

Полезная ссылка​

👍38 😁6 👏9 🤔4

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.