Компьютерный код программы пример

Презентация на тему: » Исследование кодов программ Макаренков Д.Е. Лекция по дисциплине «Компьютерная разведка»» — Транскрипт:

1 Исследование кодов программ Макаренков Д.Е. Лекция по дисциплине «Компьютерная разведка»

2 Учебные вопросы 1. Цели и задачи исследования программ 2. Методы и средства исследования кода программ 3. Общие сведения о языке ассемблера

3 Литература Рекомендованная по дисциплине Дополнительно: –Защита программного обеспечения от отладки и дизассемблирования: Учебное пособие // И.В. Аникин, В.И. Глова. Казань: КГТУ, 2003 г. –Панов А.С. Реверсинг и защита программ от взлома. СПб: BHV-Санкт-Петербург, 2006 г. –Отладчик SoftICE.

Руководство пользователя. Numega Software, –К. Касперски. Образ мышления IDA PRO. М

4 Учебный вопрос 1 Цели и задачи исследования программ

5 Программа последовательность формализованных инструкций устройства управления ЭВМ, предназначенная для реализации определенного алгоритма. –Машинный код процессора –Псевдокод виртуальной среды исполнения –Скрипты –Тексты программ

Разнёс чужой код за 15 секунд. Часть 1 #код #айти #программирование #рефакторинг

6 Исследование программ Обратное проектирование (англ. reverse ingeneering ) процесс исследования и анализа машинного кода, нацеленный на понимание общих механизмов функционирования программы, а также на его перевод на более высокий уровень абстракции вплоть до восстановления текста программы на исходном языке программирования Громкие примеры: »IBM-PC BIOS »Процессор AMD am386 »Samba

7 Цели обратного проектирования Получение закрытых сведений, заложенных в программу –алгоритм работы программы –протоколы обмена данными –форматы данных –скрытые данные Обнаружение уязвимостей и недокументированных возможностей Модификация программы –отключение защитных механизмов –внедрение закладок Создание устройства или программы с аналогичными функциями

8 Задачи исследования Восстановление кода программы (или отдельных фрагментов) на языке программирования высокого уровня –Распаковка кода –Локализация нужного модуля –Идентификация кода и данных Анализ алгоритма –Определение структуры программы, назначение отдельных блоков Изучение структур данных

9 Учебный вопрос 2 Методы и средства исследования кода программ

10 Декомпиляция Трансляция исполняемого модуля в эквивалентный исходный код на языке программирования высокого уровня –Частный случай: дизассемблирование — перевод исполняемого модуля программы на язык ассемблера Удачность декомпиляции зависит от: –правильности интерпретации кода –объема и структурированности декомпилированного кода

11 Дизассемблер транслятор, преобразующий машинный код в программу на языке ассемблера. –Автоматические генерируют готовый листинг, который можно затем править в текстовом редакторе –Интерактивные позволяют изменять правила дизассемблирования в процессе работы

12 Выполнение в контролируемой среде Отладка — динамическое исследование –трассировка программы пошаговое выполнение программы с остановками на каждой команде или строке –отслеживание значений переменных в процессе выполнения программы –контрольные точки и условия останова –вмешательство в процесс выполнения

Как работает программа? Как компилируется код? (устройство компьютерных программ) [2020]

13 Эмуляция среды выполнения Эмуля́ция (англ. emulation) воспроизведение программными или аппаратными средствами либо их комбинацией работы других программ или устройств. –Виртуальная машина

14 Контроль памяти во время выполнения программы Поиск значений переменных в процессе выполнения программы Сравнение состояния переменных в разные моменты работы программы Установка необходимых значений переменных

15 Анализ потоков данных Изучение входных и выходных данных Прослушивание каналов передачи данных, накопление статистики, анализ –мониторы событий файловых операций обращений к реестру операций ввода-вывода –сетевые пакетные снифферы

16 Возможность защиты от исследования Команды однозначно интерпретируются процессором Данные могут быть перехвачены Среда исполнения может быть эмулирована Выводы: Защититься от исследования невозможно Но можно усложнить задачу –Защита от декомпиляции и отладки –Обфускация алгоритма и данных

17 Применение различных методов исследования Метод «черного ящика» –анализ реакции программы на различные входные данные Метод «прозрачного ящика» –изучение восстановленного кода Метод «серого ящика» –частичное восстановление кода

18 Локализация модулей Анализ изменений после ввода данных –Поиск в памяти введенных значений и контроль обращений программы к этим данным –Перехват вызовов функций ввода данных Ожидаемый вывод на экран –Поиск в памяти осмысленных последовательностей символов и контроль обращений программы к адресам, по которым хранятся эти последовательности –Перехват вызовов функций вывода данных

19 Учебный вопрос 3 Общие сведения о языке ассемблера

20 Ассемблер Язык программирования «низкого уровня» Мнемоническое обозначение машинных кодов –удобнее для восприятия человеком

21 Процессор для программ система адресации памяти набор регистров набор команд

22 Разный ассемблер? Разные процессоры: –разные регистры –разные наборы команд Соответственно — разные языки ассемблера

23 Синтаксис Типичный формат записи команд: [метка:] код_операции [операнды] [;комментарий]

24 Операнды Константы Регистры Метки Ссылки

25 Пример: Команда MOV MOV адресат, источник Источник : –число –регистр –адрес ячейки в оперативной памяти Адресат: –регистр –адрес ячейки в оперативной памяти

26 Регистры процессора x86 Назначение Кол-во Регистры данных общего назначения 4AX, BX, CX, DX Указатели 2SI, DI Индексные регистры 2SP, BP Сегментные 4CS, DS, SS, ES Регистр состояния 1FLAGS Управляющие (указатель команд)1IP

Читайте также:
Программа мое дело для ИП как работать

27 Разрядность регистров EAX 32 разряда AX 16 разрядов AH, ALпо 8 разрядов EAX AX AHAL

28 Регистр флагов Флаги: состояния управления системные

29 Организация памяти Линейная модель Сегментированная модель Физический адрес = (сегмент, смещение) Вариант 1 : Вариант 2 : Сегмент Смещение Сегмент Смещение

30 Система команд процессора Для Pentium4 более 300 команд Пересылки данных Арифметические Битовые (логические) Обработки строк Передачи управления Управления состоянием процессора MMX, SSE, SSE II

31 Команды пересылки данных пересылки данных общего назначения обмен данными с портами ввода/вывода работы с адресами и указателями пересылки флагов

32 Арифметические команды Сложения Вычитания Умножения Деления Преобразования типов Сравнения

33 Битовые операции Логические операции –AND, OR, XOR, NOT, TEST Сдвиги Циклические сдвиги

34 Команды обработки строк Пересылка Сравнение Сканирование Загрузка и сохранение элементов строки Могут автоматически повторяться

35 Команды передачи управления Команды безусловной передачи управления: –безусловного перехода; –вызова процедуры и возврата из процедуры; –вызова программных прерываний и возврата из программных прерываний. Команды условной передачи управления: –по результату сравнения; –по состоянию определенного флага; –по содержимому регистра ЕСХ/СХ. Команды управления циклом: –организации цикла со счетчиком ЕСХ/СХ; –организации цикла со счетчиком ЕСХ/СХ с возможностью досрочного выхода из цикла по дополнительному условию.

36 Команды управления процессором Управления флагами Синхронизации Холостой ход NOP

37 Режимы адресации Вид адресации Пример Регистроваяmov ax,bx Непосредственнаяmov ax,200 Прямаяmov ax,Table Косвенная регистроваяmov ax,[bx] Адресация по базеmov ax,[bx+3] Прямая с индексированиемmov ax,Table[di] Адресация по базе с индексированиемmov ax,Table[bx][di]

Источник: www.myshared.ru

Императивное программирование: суть, концепция, основные языки

Императивное программирование – стиль написания кода, главной концепцией которого является создание инструкций для выполнения машинами. Данной парадигме присуще использование низкоуровневых языков, позже к ним подключили C++, Java. Такой код не требует компиляции и понимается машинами напрямую.

Вместе с усовершенствованием средств и подходов программирования предпочтительные парадигмы также менялись. На смену императивному стилю пришел декларативный (по-другому – функциональный). О том, что собой представляют эти парадигмы, чем отличаются, какие языки используют, вы узнаете из нашего материала.

Императивная парадигма программирования

Парадигма представляет собой подход к формированию исходного кода компьютерной программы. На данный момент есть несколько вариантов.

Большая часть вычислительных устройств имеют состояния и программируются с использованием инструкций. По этой причине изначальные языки программирования являлись императивными, то есть подразумевали поддержку лишь этой парадигмы.

Это более простой, т. е. понятный и логичный подход, когда задаётся последовательность действий (команд, инструкций), необходимых для получения результата – изменения состояния (информации, данных, памяти) программы с помощью переменных, операторов присваивания и составных выражений. Здесь имели место машинные коды, языки ассемблера и ранние языки высокого уровня, по типу Fortran, сейчас императивная парадигма – база C, C++, Java.

  • Данная парадигма предполагает описания вычислений в форме инструкций, которые постепенно меняют состояние программы.
  • В языках низкого уровня, например в ассемблерах, состояниями могут являться память, регистры и флаги. Инструкциями же выступают команды, которые поддерживаются целевым процессором.
  • В языках более высокого уровня, например в Си, состоянием является исключительно память. Инструкции в таком случае могут быть более сложными, а также приводить к выделению и высвобождению памяти по мере своего функционирования.

В наиболее высокоуровневых языках (скажем, Python, при условии императивного программирования) состояние ограничивают переменные, а команды являются совокупностью процессов, которые в ассемблере расходовали бы огромное количество строк.

  • Инструкция.
  • Состояние.

Для вас подарок! В свободном доступе до 09.07 —>
Скачайте ТОП-10
бесплатных нейросетей
для программирования
Помогут писать код быстрее на 25%
Чтобы получить подарок, заполните информацию в открывшемся окне

  • Присваивание.
  • Переход.
  • Память.
  • Указатель.

Почти все современные основные языки сочетают в себе элементы и декларативного, и функционального программирования. То есть они при необходимости могут поддерживать императивную парадигму. Огромное влияние оказывает такое программирование на JavaScript, Java, C++, C# и т. д.

Принципы императивного программирования

Описание расчета в императивном методе происходит на основе последовательности команд. В этом случае программирование предопределяет точную процедуру (алгоритм) решения задачи. При этом законченный компьютерный код имеет вид определенного количества переменных, которые, исходя из оценки условий, меняются в своем состоянии при помощи команд.

Базовым способом императивного подхода выступает процедурное программирование. Именно по этой причине между данными терминами иногда возникает некоторая путаница.

Императивный подход к программированию может быть понятен и обычным людям. Примером программы, написанной по такому образцу, для всех может послужить любой рецепт (последовательность работы с объектами-продуктами: купить, помыть, нарезать и т. д.) приготовления блюда. После того, как он найден или создан, повар (или аппаратное обеспечение – ассемблер как машинно-ориентированный язык низкого уровня) исполняет последовательную цепочку действий (команд). Результат – готовое блюдо (программное решение поставленной задачи).

Лишь определенные команды представляют собой инструкции машинного кода, которые выполняются устройствами. При этом текущее состояние отражает содержимое памяти. В более высокоуровневых императивных языках следом добавляются переменные и усложненные команды (выражения и функции), но они также наследуют в своей структуре императивную парадигму.

Читайте также:
Программа ирс что такое

Сравнение императивного и декларативного программирования

Декларативное программирование представляет собой парадигму, в системе которой нужный результат описывается без учета детализированного алгоритма его получения. Примерами можно считать современные HTML и SQL.

Узнай, какие ИТ — профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес

Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.

Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!

Скачивайте и используйте уже сегодня:

Александр Сагун - исполнительный директор Geekbrains

Александр Сагун
Исполнительный директор Geekbrains

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

Поможет разобраться в актуальной ситуации на рынке труда

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

Получить подборку бесплатно
Уже скачали 21563

В процессе создания HTML программист использует теги, которые описывают конкретную веб-страницу в браузере, а не способ отражения наименования статьи на экране, а также оглавления и самого текста. В SQL при необходимости определения численности сотрудников с фамилией «Иванов», нужно написать SELECT count(*) FROM employee WHERE last_name = ‘Иванов’;. Здесь нет информации касательно конкретного файла или области памяти, в которых имеются данные о сотрудниках, каким образом отобрать именно Ивановых, и необходимо ли это для расчета их численности. Декларативные языки подразделяются на функциональные и логические.

Разберем еще один пример, на основе которого будут понятны отличия императивного и декларативного методов программирования. Предположим, нам необходимо приготовить обед.

В случае использования императивной парадигмы это может выглядеть следующим образом (несколько уточним представленный выше пример с рецептом):

  • приобрести рыбу, овощи, приправы;
  • нарезать продукты, посыпать приправы;
  • разогреть духовку и т. п.

В декларативной парадигме это бы звучало так: «Хочу пообедать запеченной с овощами рыбой» – то есть нет последовательности действий, а есть объявление того, что хочется получить в итоге действий (т. е. описание желаемого результата или данных).

На первый взгляд отличия видны вполне отчетливо. Но преимущество императивного программирования заключается в том, что этот язык не затрудняет обобщение и автоматизацию конкретных задач. Имеется возможность привести в действие некий «слой» кода, библиотеки. Этот слой будет реализовывать отдельные этапы алгоритма: как в нашем кулинарном примере – находить по рецепту требующиеся продукты, заказывать их доставку, использовать духовку и пр. Таким образом, программный код императивного языка программирования, обладающий такими библиотеками, не будет иметь столь весомые отличия от декларативного метода.

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

Языки императивного программирования

Изначальными императивными языками программирования являлись только машинные языки отдельных устройств. Этими языками были описаны простейшие инструкции, возможности которых распространялись лишь на реализацию аппаратного обеспечения. Сложные программы создавались в этом случае с большим трудом.

Первый язык, в котором не было границ машинного кода для конструирования сложных программ, был FORTRAN. Его создал Джон Бэкус в IBM в 1954 году. FORTRAN подарил разработчикам новые возможности (именование переменных, составные выражения, подпрограммы и т. д.), которые и сейчас являются неотъемлемой частью императивных языков.

Только до 6.07
Скачай подборку материалов, чтобы гарантированно найти работу в IT за 14 дней
Список документов:

ТОП-100 площадок для поиска работы от GeekBrains

20 профессий 2023 года, с доходом от 150 000 рублей

Чек-лист «Как успешно пройти собеседование»

Чтобы зарегистрироваться на бесплатный интенсив и получить в подарок подборку файлов от GeekBrains, заполните информацию в открывшемся окне

Следом появились новые формальные правила для создания программ более высокого уровня. К концу 50–60-х годов ХХ в. формируется язык АЛГОЛ, сделавший более легким использование математических алгоритмов. В то время языки COBOL (1960) и BASIC (1964) представляли собой способы адаптации синтаксиса программирования под синтаксис естественного языка (английского). В 70-х годах прошлого века специалисты Bell Labs создали: Никлаус Вирт – Паскаль, а Деннис Ритчи (работают в) – язык C. После этого Вирт приступил к работе над языками Модула-2 и Оберон. В конце 1960-х был сформирован первый объектный язык Simula.

Для решения задач Министерства обороны США в 1978 году Джин Ичбиа совместно с командой Honeywell начали формировать язык Ada. В 1983 году был выпущен документ, который отражал требования языка, а в 1995 и 2006 гг. он видоизменялся.

Читайте также:
3d max платная или бесплатная программа

В 1980-х годах заинтересованность в объектно-ориентированном программировании стала возрастать. Создаваемые языки в то время были императивными, но имели поддержку объектов, можно было наблюдать весомое количество таких языков. В 1980 году Palo Alto Research Center Xerox опубликовала Smalltalk-80 языка, который изначально задумывался Аланом Кеем в 1969 г.

К концу 1990-х было сформировано множество императивных языков, которые базировались на фундаменте объектно-ориентированного программирования. Широко использовались Perl (Ларри Уолл, 1987), Python (Гвидо ван Россум, 1990), PHP (Расмус Лердорф, 1994), Java (Sun Microsystems, 1994) и C # (Microsoft, 2000).

3 вида императивного программирования

Императивное программирование с ХХI веке подразделяется на несколько основных групп:

  • Наивная парадигма. В некоторых случаях воспринимается как отдельный тип или даже вовсе не упоминается как подход к программированию. Таким языкам присуща хаотичность, отсутствие систематизированного синтаксиса и семантики. Фактически можно провести параллель с похожими бесструктурными языками. К примеру, первые версии BASIC не обладали развитым механизмом организации подпрограмм, поэтому его принято относить к этой парадигме и называть одним из операциональных языков.
  • Неструктурированная парадигма. Схожа с ассемблером. Такие программы имеют вид линейных цепочек команд. Переходы осуществляются за счет команды по типу «перейти к…» т. е. «перейти к (строке)». Между тем в первых языках этой группы каждая строка программы была наделена своим номером, а переходы можно было совершать исключительно за счет выбора нужного из всех. Это было довольно неудобно и требовало лишнего времени. Позднее стали формироваться языки, имеющие специфичные элементы — метки. Они представляли собой текстовые описания мест, в которые должна переходить программа. Типичными представителями были, к примеру, изначальные версии FORTRAN и COBOL.
  • Структурная парадигма. Вследствие трудоемкости действия команды «перейти к…» был сформирован метод структурного императивного программирования и разработана соответствующая парадигма. Её главным плюсом было то, что она осуществляла замену оператора перехода с условными петлями («повторить до тех пор, пока условие истинно») и прочих упорядоченных по своей структуре инструкций, которые находятся в оболочке друг друга. Яркими примерами являются: C, Pascal и Ada.

Парадигмы императивного стиля программирования

Стилистика программирования эволюционировала довольно много лет, в течение которых образовались практики и методы, сформировавшиеся в отдельные парадигмы, активно функционирующие сегодня:

Процедурное программирование

Функция onlyOdd, похожа на одну схему процедурного программирования. Данная парадигма включает в себя последовательные команды, образующие подпрограммы. Связь между последними осуществляется за счет общей памяти. Из подпрограмм образовалось понятие модулей, но по своей сути процедурное программирование неудобно в плане повторного использования кода.

Источник: gb.ru

Пример Снежинки Коха на С#

Скриншот к примеру

Задача — построить фрактал Снежинка Коха на языке программирования C#.
На форме находится кнопка “ Draw ” . При клике на нее получаем нужное изображение.
Снежинка имеет бесконечный периметр, хотя ограничивает конечную область плоскости. Возьмем равносторонний треугольник, разделим каждую из его сторон на три части и по каждой из трех центральных третей построим по равностороннему треугольнику меньших размеров. Итерируя это построение бесконечно много раз, получим фрактальный объект, называемый иногда кривой Коха.

Код программы:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace koh { public partial class Form1 : Form { static Pen pen1; static Graphics g; static Pen pen2; public Form1() { InitializeComponent(); } private void Draw(object sender, EventArgs e) { //Выбираем цвета зарисовки pen1 = new Pen(Color.Green, 1); pen2 = new Pen(Color.Blue, 1); //Определяем объект «g» класса Graphics g = CreateGraphics(); g.Clear(Color.Black);//Зарисовка экрана черным фоном //Определим координаты исходного треугольника var point1 = new PointF(200, 200); var point2 = new PointF(500, 200); var point3 = new PointF(350, 400); //Зарисуем треугольник g.DrawLine(pen1, point1, point2); g.DrawLine(pen1, point2, point3); g.DrawLine(pen1, point3, point1); //Вызываем функцию Fractal для того, чтобы //нарисовать три кривых Коха на сторонах треугольника Fractal(point1, point2, point3, 5); Fractal(point2, point3, point1, 5); Fractal(point3, point1, point2, 5); } //рекурсивная функция рисования кривой Коха static int Fractal(PointF p1, PointF p2, PointF p3, int iter) { //n -количество итераций if (iter > 0) //условие выхода из рекурсии { //средняя треть отрезка var p4 = new PointF((p2.X + 2 * p1.X) / 3, (p2.Y + 2 * p1.Y) / 3); var p5 = new PointF((2 * p2.X + p1.X) / 3, (p1.Y + 2 * p2.Y) / 3); //координаты вершины угла var ps = new PointF((p2.X + p1.X) / 2, (p2.Y + p1.Y) / 2); var pn = new PointF((4 * ps.X — p3.X) / 3, (4 * ps.Y — p3.Y) / 3); //рисуем его g.DrawLine(pen1, p4, pn); g.DrawLine(pen1, p5, pn); g.DrawLine(pen2, p4, p5); //рекурсивно вызываем функцию нужное число раз Fractal(p4, pn, p5, iter — 1); Fractal(pn, p5, p4, iter — 1); Fractal(p1, p4, new PointF((2 * p1.X + p3.X) / 3, (2 * p1.Y + p3.Y) / 3), iter — 1); Fractal(p5, p2, new PointF((2 * p2.X + p3.X) / 3, (2 * p2.Y + p3.Y) / 3), iter — 1); } return iter; } } }

Прикрепленный файлРазмер
Halilova_Sneginka_Koha.rar 44.13 кб

Источник: grafika.me

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru