Динамическое переключение Capstone с ARM на THUMB

Я пытаюсь написать простой скрипт для разборки байт-кода ARM/THUMB. В ARM очень распространено переключение из одного режима в другой, и поэтому очень важно, чтобы дизассемблер мог следить за этим. У меня проблемы с этим, хотя в документации сказано, что это очень просто (см. https://www.capstone-engine.org/lang_python.html). Мне кажется, что это не работает во время выполнения.

Вот как выглядит мой тест:

for i in md.disasm(CODE, 0x1000):
    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    if i.mnemonic == "bx":
        md.mode = cs.CS_MODE_THUMB

Обратите внимание, что он действительно переходит в режим большого пальца, но не во время цикла. Поэтому происходит то, что код полностью дизассемблирован в ARM, но если я запустил его снова, он будет полностью дизассемблирован в THUMB.

Заранее спасибо за вашу помощь

0 ответов

disasm разбирает несколько инструкций за один вызов, поэтому к тому времени, когда вы измените режим, будет уже слишком поздно.

Вы можете разбирать по одной инструкции за раз или использовать cs_disasm_iter.

Ссылка для справки: https://www.capstone-engine.org/iteration.html

Другие вопросы по тегам