Доброго времени суток. Сегодня мы будем смотреть дизассемблированный код инструкций if, for, while, switch, которые написаны на языке Си. Данную инструкцию довольно просто отличить в дизассемблированном виде от  других инструкций. Её отличительное свойство - одиночные инструкции условного перехода je, jne и другие команды jump. Напишем небольшую программу на языке Си и дизассемблируем её с помощью  radare2. Разницы между IDA PRO и radare2 при дизассемблировании этих  программ не было обнаружено, поэтому я воспользуюсь radare2. Вы можете  использовать IDA PRO. Компилируем при помощи gcc. Команда gcc -m32 prog_if.c -o prog_if. -m32 означает, что компилироваться код будет под архитектуру x86. Чтобы посмотреть на код в radare2, напишем команду r2 prog_if. Далее прописываем aaa для анализа кода и переходим к функции main s main. Посмотрим на код с помощью команды pdf. Первым делом в программе происходит объявление переменных ( int x; int y ), а затем значение 1 перемещается в var_ch (это переменная x) и значение 2 в var10h (это переменная y). Далее идёт сравнение (cmp) 1 и 2 (cmp edx, dword [var_10h]). Эти значения не равны. Значит jne ( jump if not equal) перейдёт по адресу 0x000011e1. Проще всего инструкцию if запомнить и определить в режиме графов (команда VV для для radare2 или клавиша пробел для IDA). Немного усложним задачу. Добавим вложенные инструкции. Попробуйте проанализировать этот код. В режиме графов это воспринимать намного проще. Циклы for всегда состоят из четырех этапов: инициализации, сравнения, выполнения инструкций и инкремента/декремента. По этим этапам мы будем отличать цикл for в ассемблерном коде от других. 1 - инициализации переменной var_ch (x = 0) 2 - сравнение, а затем jle. ( пока x не будет меньше или равен 2, выполнять цикл.) 3 - выполнения инструкций (printf) 4 - инкремент переменной var_ch (++x) Цикл while часто используется при ожидании, пока не будет выполнено  какое-то условие, например получение команды или пакета. В ассемблере циклы while похожи на for, но их легче понять. В ассемблере это  выражение похоже на цикл for, но инкремента может и не быть. 1 - инициализации переменной var_4h (status = 0) 2 - сравнение, а затем je. ( пока x равен 0, выполнять цикл.) 3 - выполнения инструкций (func1, printf, change_status) Конструкция switch обычно компилируется двумя способами: по примеру условного выражения или как таблица переходов. 1 - инициализации переменной var_4h (i = 3)2 - выполнения инструкций (add, printf) Чтобы понять какой "case" выбран, происходит сравнение (cmp, а затем je, jne) переменной i с значением case. Глядя на этот код, сложно (если вообще возможно) сказать, что представлял собой оригинальный исходный текст — конструкцию switch или последовательность выражений if . В обоих случаях код выглядит одинаково, поскольку оба выражения используют множество инструкций cmp и je или jne. Следующий пример ассемблерного кода часто можно встретить в больших смежных выражениях switch. Мы добавим case 4 и инструкцию по умолчанию. 1 - инициализации переменной var_4h (i = 3) 2 - выполнения инструкций (add, printf) Вот этот дизасcемблированный код довольно сложно быстро отличить от if и вообще понять что и как тут. В режиме графов всё будет более понятно. Режим графов - ваш друг в дизасcемблировании :) На этом всё. Рекомендую  попробовать самому написать программы на Си, скомпилировать и изучить  дизасcемблированный код. Практика и ещё раз практика!  Спасибо за внимание. Не болейте. reverse engineer-любитель