Часто компиляторы вставляют в код комманды перехода с косвенной адресацией. То есть указывается не адрес перехода, а производятся некие вычисления в результате которых изменяется содержимое регистра который определяет адрес перехода. Часто такая адресация используется при реализации в машинном коде оператора 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 самостоятельно распознал переходы с косвенной адресацией и отрисовал ветви переходов?



Reply With Quote
Thanks
