Циклы в ассемблерном графе | OTUS

Циклы в ассемблерном графе

В этой статье мы заглянем под капот циклов. Циклы в программировании относятся к основным концепциям, поэтому реверс-инженер обязан знать, на каких принципах строится программный кода и как читать код ассемблерный.

Цикл for

В первую очередь рассмотрим цикл for:

void forloop (int max) { // самый обычный цикл for
    for (int i = 0; i < max; ++i){
        printf("%i \n", i);
    }
}

Теперь давайте посмотрим на графическое представление этого цикла, то есть на ассемблерный граф:

reverse22_1-20219-a5d0e0.jpeg

Но прежде, чем мы разобъём ассемблерный код на мелкие части, рассмотрим общий вариант. Как видно, когда запускается цикл for, у него существуют 2 варианта: • перейти к блоку справа (отмечено зелёной стрелкой) и вернуться в основную программу; • перейти к блоку слева (отмечено красной стрелкой) и вернуться к началу цикла for.

Подробное графическое представление цикла for:

reverse23_1-20219-afcb55.jpeg

Поначалу сравнивают переменные 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!");
}

reverse24_1-20219-f0cd2a.jpeg

Здесь циклически генерируется случайное число в пределах от 0 до 20. Когда число больше 10, происходит выход из цикла, что сопровождается фразой «I’m out!». В обратном случае работа в цикле продолжится.

Что касается машинного кода, то здесь переменная А сначала инициализируется и приравнивается к нулю, а потом инициализируется цикл, а переменная A сравнивается с 16-ричным числом 0A, равным 10 в десятичной системе исчисления. Когда А не больше и не равняется 10, генерируется новое случайное число, записываемое в А, поэтому снова происходит сравнение. Когда А больше либо равняется 10, происходит выход из цикла с возвратом в основную программу.

По материалам статьи «BOLO: Reverse Engineering — Part 1 (Basic Programming Concepts)».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто