Циклы в ассемблерном графе | OTUS
🔥 Успейте получить скидку!
Только до 27.01 можно приобрести курсы со скидкой 25%. Торопитесь!
Выбрать курс

Курсы

Программирование
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Разработчик C#
-25%
Алгоритмы и структуры данных
-25%
Backend-разработчик на PHP
-25%
JavaScript Developer. Professional
-25%
Team Lead
-25%
Golang Developer. Professional
-25%
Agile Project Manager
-25%
Flutter Mobile Developer
-25%
Android Developer. Professional
-11%
MS SQL Server Developer
-8%
C++ Developer. Professional Framework Laravel Cloud Solution Architecture Highload Architect Reverse-Engineering. Professional Kotlin Backend Developer React.js Developer VOIP инженер Нереляционные базы данных Scala-разработчик Супер-практикум по использованию и настройке GIT IoT-разработчик JavaScript Developer. Basic Advanced Fullstack JavaScript developer Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Супер-интенсив "Версионирование и командная работа с помощью Git"
-30%
Administrator Linux. Professional
-25%
Супер-интенсив «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Administrator Linux. Advanced
-25%
Infrastructure as a code in Ansible
-25%
Network engineer
-25%
MS SQL Server Developer
-8%
Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов Мониторинг и логирование: Zabbix, Prometheus, ELK Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Архитектор сетей Супер-интенсив «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+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 комментариев
Для комментирования необходимо авторизоваться
Только до 27 января!
🔥 СКИДКА 25% на курсы OTUS!