Циклы в ассемблерном графе
В этой статье мы заглянем под капот циклов. Циклы в программировании относятся к основным концепциям, поэтому реверс-инженер обязан знать, на каких принципах строится программный кода и как читать код ассемблерный.
Цикл for
В первую очередь рассмотрим цикл for:
void forloop (int max) { // самый обычный цикл for for (int i = 0; i < max; ++i){ printf("%i \n", i); } }
Теперь давайте посмотрим на графическое представление этого цикла, то есть на ассемблерный граф:
Но прежде, чем мы разобъём ассемблерный код на мелкие части, рассмотрим общий вариант. Как видно, когда запускается цикл for, у него существуют 2 варианта: • перейти к блоку справа (отмечено зелёной стрелкой) и вернуться в основную программу; • перейти к блоку слева (отмечено красной стрелкой) и вернуться к началу цикла for.
Подробное графическое представление цикла for:
Поначалу сравнивают переменные i и max, что делается в целях проверки, достигла ли переменная значения максимума. Если переменная i не больше либо не равняется переменной max, подпрограмма идёт по красной стрелке (вниз и влево) и выводит переменную i, потом i увеличивается на 1 и происходит возврат к началу цикла. Когда переменная i больше либо равна max, подпрограмма идёт по зелёной стрелке, то есть выходит из цикла for и возвращается в основную программу.
Цикл while
Теперь посмотрим на цикл while:
void whileloop() { // цикл while int A = 0; while (A<10) { A = 0 + (rand()%(int)(20-0+1)) } printf("I'm out!"); }
Здесь циклически генерируется случайное число в пределах от 0 до 20. Когда число больше 10, происходит выход из цикла, что сопровождается фразой «I’m out!». В обратном случае работа в цикле продолжится.
Что касается машинного кода, то здесь переменная А сначала инициализируется и приравнивается к нулю, а потом инициализируется цикл, а переменная A сравнивается с 16-ричным числом 0A, равным 10 в десятичной системе исчисления. Когда А не больше и не равняется 10, генерируется новое случайное число, записываемое в А, поэтому снова происходит сравнение. Когда А больше либо равняется 10, происходит выход из цикла с возвратом в основную программу.
По материалам статьи «BOLO: Reverse Engineering — Part 1 (Basic Programming Concepts)».