Текст площадки «Складчик». Упомянутые цены и обещанные результаты могут быть неактуальны; условия покупки проверяйте у продавца.
Приключения языка ассемблера: полный курс. Выучите язык своего компьютера [2020]
Читать полное описание
Приключения языка ассемблера: полный курс. Выучите язык своего компьютера [2020]
Assembly Language Adventures: Complete Course. Learn the language of your computer [2020]
Udemy
xor pd
Изучить язык ассемблера.
Серия x86 Adventures обучает вас языку вашего компьютера - ассемблеру x86, с нуля. Никаких предварительных знаний не предполагается.
Это полный сборник x86 Assembly Adventures. Он охватывает все, от реальных основ до независимого (и жесткого) программиста на ассемблере x86.
1. Абсолютные новички
2. Опытные программисты
3. Люди, которые действительно хотят знать, как все работает
4. Программисты, которые хотят улучшить свои навыки
5. Программисты, которые хотят писать более быстрый код
6. Всем, кто хочет заняться реверс-инжинирингом или индустрией безопасности
Курс состоит из видеолекций. Лекция может быть основана на презентации или на примере из реальной жизни, показывающем, как я что-то делаю за компьютером. Практически каждая видеолекция сопровождается каким-либо упражнением. Эти упражнения имеют открытый исходный код, и вы можете получить их на github.
Очень важно, чтобы вы выполняли упражнения. Вы многому научитесь из лекций, но если вы не будете выполнять упражнения, это будет пустой тратой вашего времени и денег. (Или хотя бы убедитесь, что вы умеете их делать, если у вас больше опыта).
Технологический стек курса
В этом курсе не предполагается никаких предварительных знаний, но я предполагаю некоторые вещи, касающиеся вашей системы, поэтому убедитесь, что все здесь описывает вас:
Вы используете операционную систему Windows. (В видеороликах курса используется Windows 7). Рекомендуется использовать как минимум Windows XP. (Это означает, что он будет отлично работать в Windows 7 и Windows 10).
У вас процессор x86. Мы изучаем 32-битный x86, но этот курс также будет работать на 64-битных процессорах.
Для технических специалистов, еще несколько подробностей об инструментах, которые мы собираемся использовать в этом курсе:
Вариант сборки: 32-битный защищенный режим x86.
Ассемблер: плоский ассемблер (FASM)
Отладчик: WinDbg.
Используете Linux ? Большинство упражнений было перенесено на Linux, однако в видео показано, как я использую Windows 7. Если вы не уверены, свяжитесь со мной.
Раздел 1 - Вступление
1.1 Об этом курсе
Общая информация о курсе: список основных предметов, которые будут рассмотрены в ходе этого курса, некоторые технические детали и некоторые требования к курсу.
1.2 Инструменты - Проводник
Объяснение проводника файлов - программы, которую мы используем для просмотра файлов на нашем компьютере. Мы также обсуждаем Total Commander, который я собираюсь использовать на этом курсе.
1.3 Инструменты Hex Editor
Объяснение Hex Editor - программы, которая позволяет нам просматривать внутреннюю структуру файлов внутри нашего компьютера. В частности, мы обсуждаем HxD Hex Editor.
1.4 Инструменты - Текстовый редактор
Мы обсуждаем текстовые редакторы - программы, которые используются для просмотра и редактирования текстовых файлов на нашем компьютере. Мы представляем блокнот, блокнот ++ и немного vim.
Раздел 2 - Двоичная система счисления
2.1 Сложение и вычитание
Мы обсуждаем идею числовых оснований, и, в частности, рассмотрим основание 10 и основание 2. Наконец, у нас есть несколько примеров сложения и вычитания в базе 2.
2.2 Базовое преобразование (часть 1)
Мы представляем три способа преобразования чисел между различными числовыми представлениями: прямое вычисление, определение наибольшей степени и вычисление остатка.
2.3 Базовое преобразование (часть 2)
Мы обсудим, как решить, какой метод преобразования использовать в разных случаях, а также покажем несколько примеров преобразования чисел между разными основаниями.
2.4 Шестнадцатеричное преобразование
Мы обсуждаем шестнадцатеричное основание (основание 16) и показываем его особое отношение к основанию 2.
2.5 Шестнадцатеричное преобразование (бонус)
Мы отвечаем на вопрос: почему каждая шестнадцатеричная цифра представлена ровно 4 двоичными цифрами?
2.6 Подписанные номера (часть 1)
Мы обсуждаем операцию вычитания, а также отрицательные числа в представлении с основанием 10. Мы изучаем, как вызвать вычитание, используя только операцию сложения.
2.7 Подписанные номера (часть 2)
Мы вводим представление дополнения до двух, которое позволяет нам иметь дело со знаковыми числами в базе 2, так же, как мы делали это ранее в базе 10.
2.8 Подписанные номера (часть 3)
Мы рассмотрим примеры сложения со знаком, мы имеем дело с некоторыми исключениями, касающимися представления двух дополнений, затем мы рассмотрим графическое представление
положительных и отрицательных чисел в двух дополнениях и, наконец, обсудим некоторую философию представления.
Раздел 3 - Архитектура x86
3.1 Основы истории
Базовая история архитектуры x86: первые процессоры в семействе, идея обратной совместимости в архитектуре x86 и различные режимы внутри процессоров x86.
3.2 Базовая структура
Мы объясняем, как программы хранятся в памяти и как они выполняются процессором. Далее мы изучаем 32-битные регистры x86.
3.3 Первые инструкции (часть 1)
Мы узнаем об общей структуре инструкций x86 и обсуждаем инструкцию MOV.
3.4 Первые инструкции (часть 2)
Мы представляем инструкции ADD и SUB.
3.5 Основы арифметики (часть 1)
Мы представляем инструкции INC, DEC и MUL.
3.6 Основы арифметики (часть 2)
Мы представляем инструкцию DIV.
3.7 Основы арифметики (часть 3)
Мы показываем примеры исключений, сгенерированных с помощью инструкции DIV.
3.8 Основы арифметики (часть 4)
Мы рассмотрим несколько примеров использования инструкции DIV (с числовыми примерами). Наконец, мы подводим итоги серии уроков по базовой арифметике.
Раздел 4 - введение в FASM
4.1 fasm intro
Представляем FASM - Flat Assembler.
Мы обсуждаем несколько различных распространенных ассемблеров и, наконец, описываем FASM и несколько разных причин для использования FASM. Мы закончим кратким описанием того, как установить FASM. Мы подробно остановимся на этом в следующих уроках.
4.2 установка fasm
Установка Fasm. Мы заглянем на веб-сайт Fasm и объясним, как загрузить и установить Fasm.
4.3 Первые программы - голые
Собираем нашу первую программу - bare.asm и просматриваем сгенерированный файл в шестнадцатеричном редакторе.
4.4 Первые программы - консоль (часть 1)
Мы посмотрим на программу console.asm, которая является нашей первой консольной программой. Обсуждаем исходный код console.asm
4.5 Первые программы - консоль (часть 2)
Мы пытаемся собрать программу console.asm, и нам нужно исправить переменную окружения INCLUDE, чтобы это произошло. Наконец-то нам удалось собрать и запустить программу. Затем мы анализируем выходной файл с помощью шестнадцатеричного редактора.
4.6 Первые программы - первая программа (Часть 1)
Мы представляем first_program.asm. Это наша первая программа, у которой есть ввод и вывод. Мы смотрим на исходный код и сравниваем его с console.asm, предыдущей программой. Позже попробуем собрать программу. Для этой задачи мы должны обновить переменную среды INCLUDE. Наконец, мы запускаем программу и анализируем вывод программы.
4.7 Первые программы - первая программа (Часть 2)
Создаем собственную программу, основанную на first_program.asm. Наша программа считывает два числа от пользователя, складывает эти два числа и затем выводит результат обратно на консоль.
4.8 Основные ошибки сборки (часть 1)
Мы представляем различные примеры ошибок времени сборки и способы их устранения.
Начнем с ошибки записи.
4.9 Основные ошибки сборки (часть 2)
Мы представляем больше примеров ошибок времени сборки и способы их устранения: ошибка файла не найдена, ошибка неопределенного символа, ошибка недопустимой инструкции, ошибка размера не соответствует, ошибка другого неопределенного символа и, наконец, ошибка недопустимого операнда.
Раздел 5 - Разветвления
5.1 Введение в ветвление (часть 1)
Мы представляем идею ветвления: выполнение нашей программы нелинейным
образом. Затем мы обсуждаем регистр EIP.
5.2 Введение в ветвление (часть 2)
Мы представляем инструкцию JMP, обсуждаем метки и рассматриваем простой
пример использования инструкции JMP.
5.3 Примеры JMP
Мы рассмотрим два примера с использованием инструкции JMP: бесконечный цикл и пример пропуска инструкций с использованием инструкции JMP.
5.4 Регистр флагов (часть 1)
Мы представляем регистр флагов и обсуждаем нулевой флаг.
5.5 Регистр флагов (часть 2)
Мы обсуждаем флаг Sign и флаг Carry. Затем мы рассмотрим несколько примеров флага переноски.
5.6 Регистр флагов (часть 3)
Мы обсуждаем флаг переполнения и рассмотрим различные примеры, касающиеся флага переполнения.
5.7 Регистр флагов (часть 4)
Мы сравниваем поведение флагов Overflow и Carry. Мы также рассматриваем различные способы использования флага переполнения и флага переноса для чисел со знаком и без знака .
5.8 Базовое условное ветвление
Мы описываем идею условного перехода и видим несколько примеров использования инструкций условного перехода JZ и JNZ. Затем мы кратко упомянем некоторые другие инструкции условного перехода.
5.9 Более условное ветвление (часть 1)
Мы представляем инструкцию CMP и идею сравнения чисел. Затем мы обсуждаем сравнение без знака и со знаком и вводим специальные инструкции для сравнения без знака и со знаком.
5.10 Более условное ветвление (часть 2)
Мы описываем сравнение со знаком более подробно и добавляем небольшое примечание о написании читаемого кода со специализированными инструкциями перехода.
5.11 Структурированное ветвление (часть 1)
Мы знакомим с идеей структурированного ветвления и его преимуществами для написания хорошего кода. Затем мы обсудим схему условного исполнения.
5.12 Структурированное ветвление (часть 2)
Обсуждаем выкройку петель и отрыв от петель.
5.13 Структурированное ветвление (часть 3)
Мы вводим некоторые практические правила ветвления. Затем мы показываем пример упрощения кода спагетти с использованием идеи структурированного ветвления.
Раздел 6 - Подписанные операции
6.1 Подписанные операции (часть 1)
Мы узнаем об инструкции NEG и обсуждаем концепцию расширения знака . Мы вводим инструкции MOVZX и MOVSX.
6.2 Подписанные операции (часть 2)
Мы обсуждаем различия между инструкциями MOVZX и MOVSX. Затем изучаем инструкции CBW, CWDE, CWD, CDQ.
6.3 Подписанные операции (часть 3)
Мы представляем инструкции IMUL и IDIV, подписанные версии инструкций MUL и DIV. Мы объясняем, как они работают, и, наконец, показываем пример использования этих инструкций.
Раздел 7 - Побитовые операции
7.1 Введение в булеву алгебру (часть 1)
Мы представляем идею основных операторов и основных операторов НЕ, И и ИЛИ.
7.2 Введение в булеву алгебру (часть 2)
Мы обсуждаем таблицы истинности и диаграммы Венна основных операторов (НЕ, И,
ИЛИ). Затем мы рассмотрим несколько примеров с использованием основных операторов.
7.3 Введение в булеву алгебру (часть 3)
Основные свойства операторов НЕ, И и ИЛИ: двойное отрицание, законы коммутативности, ассоциативные законы, законы распределения. Наконец, мы показываем пример использования диаграммы Венна для проверки истинности уравнения.
7.4 Введение в булеву алгебру (часть 4)
Мы вводим законы Де Моргана, а затем приводим несколько примеров упрощающих утверждений. Затем мы обсудим оператор XOR. Наконец, упоминаются дальнейшие объекты исследования.
7.5 Побитовые инструкции (часть 1)
Мы вводим инструкции NOT, AND, OR и XOR. Затем мы обсудим битовый сдвиг с использованием инструкций SHL и SHR.
7.6 Побитовые инструкции (часть 2)
Мы обсуждаем арифметический сдвиг (сдвиг, который понимает знак), используя инструкции SAL и SAR. Наконец, мы представляем инструкции ROL и ROR, используемые для вращения битов.
7.7 Практические битовые игры
Мы изучаем некоторые базовые методы манипулирования битами: извлечение одного определенного бита из числа, подсчет количества единиц в двоичном числе, вычисление степеней двойки по модулю с использованием битовых операций и, наконец, сжатие нескольких небольших чисел в один и тот же контейнер.
Раздел 8 - объем памяти
8.1 Введение в память (часть 1)
Сначала мы обсудим причины, по которым нам нужно больше данных в наших программах. Затем мы описываем базовую модель памяти компьютера и обсуждаем устройства памяти, которые находятся вне процессора.
8.2 Введение в память (часть 2)
8.3 Примеры памяти - обратное (Часть 1)
Мы представляем программу reverse.asm, которая использует память (RAM) для переворота списка чисел. Запускаем программу и анализируем исходный код.
8.4 Примеры запоминания - обратная сторона (часть 2)
Анализируем внутреннюю структуру выходного исполняемого файла reverse.asm с помощью шестнадцатеричного редактора.
Затем мы продолжаем с reverse_constant.asm, который улучшает reverse.asm с помощью константы.
8.5 Примеры памяти - get_addr
Мы представляем программу get_addr.asm, которая демонстрирует значение меток и возможный синтаксис при использовании меток.
8.6 Примеры памяти - повреждены
Программа коррумпированный.asm демонстрирует, что происходит, когда мы пытаемся получить доступ к памяти, которой мы не владеем. fix_corrupt.asm демонстрирует, как исправить коррумпированный.asm, и, наконец, fix_corrupt_small.asm использует раздел bss, чтобы получить гораздо более эффективное решение.
8.7 Определение данных
Мы обсуждаем различные способы определения данных и проверяем вывод каждого определения данных. Мы узнаем о байтах, словах, двойных словах, массивах и немного более сложных определениях данных.
8.8 Разделы данных
Мы вводим разделы PE и показываем пример программы, которая содержит разные разделы: текст, данные, bss и idata. Наконец, мы проверяем полученный исполняемый файл с помощью шестнадцатеричного редактора.
8.9 Основные инструкции памяти
Мы покажем, как получить доступ к памяти с помощью инструкций по сборке. В этой лекции мы изучаем, как правильно подсчитывать адреса, как хранить двойное слово в памяти (Endianity), расширенную адресацию с использованием синтаксиса скобок и некоторые ограничения при доступе к памяти в архитектуре x86.
8.10 th
Представляем инструкцию LEA. Мы обсудим синтаксис этой инструкции, а затем покажем несколько примеров использования инструкции LEA.
8.11 Структуры (Часть 1)
Мы объясняем необходимость способа организации наших данных и предлагаем синтаксис структуры в качестве решения. Затем мы обсудим различные способы определения и объявления структур.
8.12 Структуры (Часть 2)
Мы показываем различные примеры использования структур, а затем обсуждаем возможность вложенных структур.
8.13 Структуры (Часть 3)
Мы обсуждаем объединения, и мы рассматриваем пример использования объединений (пример объединения IPV4).
8.14 Идеи памяти (часть 1)
Мы рассмотрим несколько примеров конструкций памяти: массив структур и двумерная таблица. Мы уделяем особое внимание методам хранения этих конструкций в линейной памяти нашей программы.
8.15 Идеи памяти (часть 2)
Мы показываем пример сохранения таблицы умножения в двумерный массив. Затем мы обсуждаем возможность хранения массивов более высокой размерности в памяти программы.
8.16 Идеи памяти (часть 3)
Мы обсуждаем конструкцию памяти двоичного дерева и показываем пример представления двоичного дерева в памяти.
8.17 Правила обращения
Мы опишем несколько практических правил относительно адресной арифметики. Эти правила помогают различать адреса и смещения.
Раздел 9 - Потоки
9.2 ASCII
Мы вводим стандарт ASCII для кодирования текста в виде чисел внутри компьютера. Мы также упоминаем стандарт Unicode.
9.2 Карта персонажей
Мы представляем программу Windows Character Map, которая представляет собой инструмент для просмотра различных символов и соответствующих им кодов ASCII или Unicode.
9.3 Строковое представление
В этом видео мы объясняем, как представлять текстовые строки в наших собственных программах сборки. Мы также представляем две школы строк: префикс длины и строки с завершающим нулем.
9.4 Пример UTF8
Мы показываем пример использования символов Unicode в программе сборки Fasm. В этом примере мы хотим сохранить в памяти два китайских символа. В конце концов мы собираем программу и просматриваем выходной файл в шестнадцатеричном редакторе.
9.5 Инструкции на первой струне (часть 1)
Мы представляем инструкцию STOS и показываем простой пример использования этой инструкции. Затем мы обсуждаем флаг направления и его значение.
9.6 Инструкции на первой струне (часть 2)
Мы представляем инструкции LODS, MOVS и показываем простые примеры использования обеих этих инструкций.
9.7 Префиксы REP (Часть 1)
Мы вводим префикс REP и используем его вместе с STOSB для очистки массива. Далее мы представляем инструкцию SCAS. Наконец, мы вводим префикс REPNZ и используем его вместе с инструкцией SCAS для поиска нулевого терминатора строки.
9.8 Префиксы REP (Часть 2)
Обсуждаем префиксы REPZ и REPNZ. Затем мы представляем инструкцию CMPS и показываем пример использования CMPS с префиксом REPZ для проверки равенства двух буферов памяти.
Раздел 10 - Подпрограммы и стек
10.1 Подпрограммы Введение
Подпрограммы - это независимые части кода. Мы объясняем необходимость подпрограмм, а затем попытаемся создать наши собственные подпрограммы, используя простую инструкцию JMP. Эта первая попытка не так успешна, но она подготавливает нас к более продвинутой идее реализации подпрограмм, которую мы увидим в следующих уроках.
10.2 Стек
Изучаем структуру данных Stack. Затем изучаем реализацию стека x86 и инструкции (PUSH и POP). В конце концов мы видим несколько простых примеров использования стека.
10.3 Звонок и возвращение (часть 1)
Мы показываем пример использования команд CALL и RET для реализации подпрограммы. Затем подробно изучаем ЗВОНОК и RET.
10.4 Звонок и возвращение (часть 2)
Мы видим несколько примеров использования инструкций CALL и RET. Затем мы объясняем значение стека в отношении вызовов функций.
10.5 Соглашения о вызовах (часть 1)
Мы исследуем различные методы взаимодействия с подпрограммами: регистры, глобальные данные и стек.
10.6 Соглашения о вызовах (часть 2)
Мы обсуждаем идею соглашений о вызовах. Затем мы представляем соглашения о вызовах CDECL и STDCALL и сравниваем их.
10.7 Местное государство (Часть 1)
Мы представляем регистр EBP и объясняем, как использовать его для хранения кадра стека в наших функциях. Затем мы обсудим локальные переменные и то, как использовать стек для хранения локальных переменных для текущей функции.
10.8 Местное государство (Часть 2)
Мы представляем идею стека вызовов, а затем изучаем инструкции ENTER и LEAVE, которые являются ярлыками для создания и уничтожения кадра стека функции.
Раздел 11 - Руководства
11.1 Скачивание руководств
Мы покажем, как получить руководства по набору инструкций Intel и AMD.
11.2 Руководство Intel (часть 1)
Мы смотрим на руководство Intel Instruction Set и объясняем, как его использовать.
11.3 Руководство Intel (часть 2)
Мы узнаем, как читать информацию о конкретных инструкциях в руководстве Intel Instruction Set. В частности, мы изучаем инструкцию ADD и инструкцию ADC.
11.4 AMD Руководство
Мы ознакомимся с руководствами AMD Instruction Set и узнаем, как их использовать. Затем мы взглянем на инструкцию ADD, как описано в руководстве AMD Instruction Set.
11.5 Последние комментарии
Некоторые комментарии относительно различий в руководствах Intel и AMD. Также несколько комментариев о важности уметь читать руководства, и о важности время от времени проверять руководства.
Раздел 12 - Отладка
12.1 Первый пример
Мы показываем простой пример отладки программы сборки. Мы используем WinDbg для отладки программы mem_count.asm. Мы очень кратко увидим, как использовать точки останова, пошагово выполнять код и читать память программы. Все эти шаги будут подробно объяснены в следующих уроках. Это просто демонстрация того, что возможно с помощ