R0 CREW

Как правильно в IDA оформлять переходы с косвенной адресацией?

Часто компиляторы вставляют в код комманды перехода с косвенной адресацией. То есть указывается не адрес перехода, а производятся некие вычисления в результате которых изменяется содержимое регистра который определяет адрес перехода. Часто такая адресация используется при реализации в машинном коде оператора switch…case.

Предположим что есть такая конструкция:

call switch
offset_1
offset_2
offset_3

code_1


code_2

Вызов процедуры switch приводит к тому, что анализируются по принципу case 1 2 3 итд значения и выбираются соответствующие им смещения offset из байтов памяти. после операций со значениями этих смещений в регистр указывающий на адрес перехода загружается нужный адрес.
Ну например передали в процедуру свич case2. Процедура считывает из памяти по адресу где располагается offset_2 два байта обозначающие смещение. В итоге после вычислений получаем в регистре указателе адрес указывающий на code_2.

При работе IDA на ряде процов дизассемблер не может автоматически определить такие конструкции и соответственно нарисовать в графическом виде схемы переходов. Это в лучшем случае. В обычном же случае он неправильно произведет дизассемблирование. То есть например попытается перевести область данных offset_0 1 2 в код. При ручном разборе мы можем указать руками то что области offset_ это области данных и может вычислить реальные адреса code_1 code_2 итд.

Но как правильно указать IDA переходы по этим адресам, чтобы на Графическом представлении(дереве) не происходил назрыв схемы на комманде call switch и схема была бы читаемой, как буд-то IDA самостоятельно распознал переходы с косвенной адресацией и отрисовал ветви переходов?

В Иде можно настроить switch вручную:

Да, работает. Спасибо большое.

А как оформить одиночные переходы?

Например
x=x++
jmp x


code_2

Вычисляем значение ргистра x. Переход jmp происходит по адресу содержащемуся в x. В x содержится адрес с которого начинается код code_2