Наверное, каждый реверсер когда-нибудь задавал себе подобные вопросы, когда видел висящие в воздухе блоки кода и пунктирные линии (Скриншоты 1 и 2).
Обычно времени и желания разбираться в подобных вопросах нет — они не сильно мешают. Мы тоже годами откладывали решение, но в конце концов нашли его.
1️⃣ Разбираемся с линиями
Оказывается, в дизассемблере IDA есть функции, которые не возвращают управление вызывающей функции. Как раз для обозначения вызовов таких функций в IDA используется понятие
no return line:; ---------------------------------------------------------------------------
Подробнее об этом можно почитать в блоге Hex Rays в 126 серии постов «Igor's Tip of the Week».
2️⃣ Соединяем блоки
Для соединения блоков в дизассемблере необходимо в параметрах функции
sub_7FF7010A9A03 убрать галочку со свойства Does not return (Скриншот 3). Да, именно у самой функции sub_7FF7010A9A03, а не в параметрах родительской функции, в которой мы видим call sub_7FF7010A9A03.Затем IDA обычно автоматически связывает нужные блоки (Скриншот 4). Если этого не произошло, то можно выделить инструкции, между которыми проходит
no return line, и нажать C (команда «MakeCode»). IDA задаст два вопроса — на них можно ответить «Analyze» и «Yes». После этого вы увидите, что
no return line исчезла (Скриншот 5), а блоки кода соединились. Отметим, что
no return-функции имеют соответствующий тип, например:void __fastcall __noreturn sub_7FF7010A9A03();
А что по декомпилированному коду в окне псевдокода?
No return-функции могут также влиять и на декомпилированный код, поэтому если вы видите, что одна инструкция декомпилированного кода соответствует большому количеству разных инструкций в дизассемблере, да и вообще в псевдокоде не хватает строчек кода, то можно попробовать следующее:🫡 Изменить тип no return функции (кнопка Y), убрав
__noreturn;🫡 Иногда нужно убрать опцию
Does not return в параметрах функции.Подробнее подобный кейс описан в блоге Hex Rays в 162 серии постов «Igor's Tip of the Week», дополнительно можно обратить внимание на 159 серию.




