В работе представлена операционная система InfoOS, позволяющая узнавать различные системные данные
Приобретение навыков по защите приложений от нелегального использования, по анализу исполняемых кодов в отсутствие исходных текстов и по применению способов защиты программ от дизассемблирования и отладки.
Для выполнения данной лабораторной работы было необходимо следовать следующим требованиям:
- Работа выполняется в ОС Linux
- Транслятор ассемблера для загрузчика: YASM, синтаксис: AT&T
- Компилятор ядра: gcc
- Задание для реализации: InfoOS
Рассмотрим эти пункты подробнее.
YASM — это один из многих трансляторов программы из текста на языке ассемблера. В ОС Linux для компиляции программы использовалось следующая команда:
yasm -p gas -f bin -o $(boot).tmp $(boot).asm
На месте
Данная команда создаёт .tmp файл на основе файла bootsect.asm, который в последствии используется утилитой dd для занесения на загрузочный диск:
dd bs=31744 skip=1 if=$(boot).tmp of=$(boot).bin
AT&T — это один из основных синтаксисов формата записи инструкций процессора(мнемоник). Основными отличиями от синтаксиса Intel являются: Регистры записываются с префиксом % (знак процента).
- Каждая команда записывается с суффиксом, указывающим размер операндов команды (b — операнды размером 1 байт, w — 2 байта, l — 4 байта).
- В командах пересылки данных приемник данных находится справа от источника (movl %ebx, %eax == из ebx в eax)
- Константы записываются с префиксом $ (знак доллара). Если знак доллара не записан — процессор будет использовать значение, хранящееся в памяти по указанному адресу.
- Адрес текущего смещения в памяти — знак . (точка).
- Доступ к памяти по адресу, расположенном в регистре, осуществляется с помощью записи N(%reg), где N — смещение в байтах в памяти относительно адреса, хранящегося в регистре reg. Например, команда movb 0(%bx), %al копирует один байта из памяти с адресом, хранящимся в регистре bx в регистр al.
GCC — компилятор языка си. В работе он был использован для компиляции ядра с помощью следующей команды.
g++ -ffreestanding -m32 -o $(ker).o -c $(ker).cpp
Далее файл kernel.o необходимо перевести в бинарный файл:
ld --oformat binary -Ttext 0x10000 -o $(ker).bin --entry=kmain -m elf_i386 $(ker).o
После чего необходимо провести инициализацию загрузчика и ядра на виртуальной машине qemu:
qemu –fda bootsect.bin –fdb kernel.bin
В качестве операционной системы, которую необходимо было реализовать, была представлена InfoOS — ОС, которая должна соответствовать следующим требованиям:
- Загрузчик должен собрать необходимую информацию с помощью функций BIOS и сохранить ее в памяти, доступной в дальнейшем ядру. Должно быть собрано текущее время.
- Также должен быть реализован спектр различных функций. Реализация описана в таблице 1.
Загрузчик представляет собой системное программное обеспечение, обеспечивающее загрузку операционной системы непосредственно после включения компьютера и начальной загрузки. В работе, в качестве загрузчика выступает файл bootsect.bin.
После старта процессор выполняет операцию самотестирования — BIST (built-in self test). Затем происходит выполнение первой инструкции, находящейся по физическому адресу 0xFFFFFFF0 (в вершине адресного пространства), по которому записан код EPROM (Erasable Programmable Read-Only Memory), содержащий программу дальнейшей инициализации аппаратуры компьютера. Загрузчик ОС располагается в первом секторе диска.
В зависимости от установок BIOS порядок устройств, на которых осуществляется поиск загрузчика, может меняться, но, в общем случае, этими устройствами могут быть: дискета, жесткий диск, привод лазерных дисков, сервер сети. Наиболее простой способ загрузки ОС, поддерживаемый всеми версиями BIOS, — это загрузка с дискеты. Если BIOS находит дискету в дисководе, выполняется считывание ее первого сектора (512 байт) в оперативную память по физическому адресу 0x00007C00. Файл bootsect.asm, содержащий код загрузчика, также выполняет дополнительную функцию для съёма значений времени BIOS. Для удобства был написан Makefile. С его помощью, запуск кода представляет собой комадну:
make boot=bootsect ker=kernel