все заметки

IDA Pro 8.3 и обработка 0x66 префикса для Jxx инструкций в x64

2024.12.03

IDA Pro 8.3 уже древнее, и счастливые обладатели лицензий, скорей всего, уже имеют исправление. Но мы имеем, что имеем.

Для одного проекта разбираюсь с 64x битной архитектурой и имеющимися инструкциями.

И для тестов и сравнения использую IDA, Hiew и iced

Один из тестов по проверки опкодов споткнулся.

Начал сравнивать, а результат у всех разный.

Для примера есть инструкция JZ/JE с опкодом 0x0F 0x84 cd (cd - 4 байта)

Так же в 64bit есть префикс 0x66 (есть и другие, но о них потом), который уменьшает битность инструкции.

То есть, 0x66 0x0F 0x84 cw (cw - 2 байта).

Но, для Jxx инструкции это не работает.

В 64 битном режиме 0x66 префикс работает только на размер операнда, и не поддерживает 16 битные адреса.

Четыре разных префикса:

jz 0x180001106 ; 0F 84 00 01 00 00\njz 0x18000120d ; 66 0F 84 00 02 00 00\njz 0x180001314 ; 49 0F 84 00 03 00 00\njz 0x18000141b ; 67 0F 84 00 04 00 00

Что нам показывает IDA

jz near ptr word_180001106 ; 0f 84 00 01 00 00\njz near ptr byte_18000120B ; 66 0f 84 00 02\ndb 2 dup(0), 49h, 0Fh, 84h ; 00 00 49 0F 84\n00 03 00 00 67 0F 84 00    ; dq 840F6700000300h\n04 00 00                   ; 4, 2h dup(0)

0x66 префикс для Jxx инструкции в IDA Pro 8.3

А что должно быть на самом деле:

Hiew

0x66 префикс для Jxx инструкции в Hiew

Binary Ninja

0x66 префикс для Jxx инструкции в Binary Ninja

x64dbg

0x66 префикс для Jxx инструкции в x64db

еще по темам: ida, реверс инжиниринг