Циклы в ассемблерном графе | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
JavaScript Developer. Professional
-9%
Android Developer. Basic
-10%
Java Developer. Professional Разработчик C# AWS для разработчиков Highload Architect Reverse-Engineering. Professional CI/CD Vue.js разработчик Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Супер-интенсив "SQL для анализа данных"
-16%
Software Architect
-12%
Сетевой инженер AWS для разработчиков Highload Architect Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

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

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

Цикл 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 комментариев
Для комментирования необходимо авторизоваться