Курс — Хакинг на Rust. #4 Основы Rust для хакеров. Hello, World! Первые шаги в коде
Здравствуйте, дорогие друзья.
Первая программа — ритуал, но в Rust он становится демонстрацией философии языка. Здесь нет места случайным ошибкам: компилятор станет вашим первым союзником в мире, где каждая строка кода может стать инструментом атаки или защиты.
1.1 Создаем проект: cargo new
Начнем с инициализации проекта через Cargo:
1 2 |
cargo new rust_hack_intro cd rust_hack_intro |
Структура проекта:
Cargo.toml
— конфигурация и зависимости.src/main.rs
— исходный код.
Откройте main.rs
. Там уже есть классический пример:
1 2 3 |
fn main() { println!("Hello, world!"); } |
Хакерский взгляд :
fn main()
— точка входа. Здесь начинается ваш эксплойт, сниффер или брутфорсер.println!
— макрос, который безопасно выводит данные. В отличие от C, в Rust нет риска переполнения буфера при форматировании строк.
Соберите и запустите:
1 |
cargo run |
1.2 Модификация: вывод системной информации
Превратим «Hello, World!» в инструмент разведки. Изменим код, чтобы он показывал данные целевой системы:
1 2 3 4 5 6 7 8 9 10 11 |
use std::env; fn main() { let args: Vec<String> = env::args().collect(); let os = env::consts::OS; let current_dir = env::current_dir().unwrap(); println!("[*] Запущен с аргументами: {:?}", args); println!("[*] Операционная система: {}", os); println!("[*] Текущая директория: {:?}", current_dir); } |
Что изменилось :
- Используем
std::env
для доступа к окружению. unwrap()
— простая обработка ошибок (паникуем, если директория недоступна).
Запустите с аргументами:
1 |
cargo run -- --target 192.168.1.1 |
Вывод :
1 2 3 |
[*] Запущен с аргументами: ["target/debug/rust_hack_intro", "--target", "192.168.1.1"] [*] Операционная система: linux [*] Текущая директория: "/home/user/rust_hack_intro" |
1.3 Макросы: мощь метапрограммирования
Макросы в Rust — это не просто удобство. Они позволяют генерировать код на этапе компиляции, что критично для:
- Автоматизации рутинных задач (например, парсинга пакетов).
- Создания DSL (доменно-специфичных языков) для эксплойтов.
Пример макроса для логирования:
1 2 3 4 5 6 7 8 9 10 |
macro_rules! log { ($level:expr, $msg:expr) => { println!("[{}] {}", $level, $msg); }; } fn main() { log!("INFO", "Сканирование портов начато"); log!("ERROR", "Таймаут подключения"); } |
Преимущество : Макросы безопаснее C-макросов — они проверяются компилятором.
1.4 Обработка ошибок: Result
и Option
В хакинге ошибки неизбежны: порт может быть закрыт, файл недоступен. Rust заставляет обрабатывать их явно:
1 2 3 4 5 6 7 |
use std::fs::File; fn main() -> Result<(), Box<dyn std::error::Error>> { let file = File::open("secret.txt")?; println!("[+] Файл открыт"); Ok(()) } |
?
— оператор, который возвращает ошибку из функции, если она возникла.Box<dyn std::error::Error>
— тип для произвольных ошибок.
Совет : Используйте anyhow
или thiserror
для удобной работы с ошибками.
1.5 Сборка и оптимизация
Хакерские инструменты должны быть быстрыми и незаметными. Соберите проект с оптимизациями:
1 |
cargo build --release |
Бинарник появится в target/release/
.
Проверка размера :
1 |
ls -lh target/release/rust_hack_intro |
Для сравнения: аналогичный скрипт на Python будет медленнее и потреблять больше памяти.
1.6 Первый сетевой инструмент: TCP-сканер
Создадим простой сканер портов, используя std::net
:
1 2 3 4 5 6 7 8 9 10 |
use std::net::TcpStream; fn main() { let target = "127.0.0.1"; for port in 1..=1024 { if TcpStream::connect((target, port)).is_ok() { println!("[+] Порт {} открыт", port); } } } |
Улучшения :
- Добавьте многопоточность через
rayon
. - Используйте сырые сокеты (
libc
) для скрытого сканирования.
1.7 Отладка и анализ
Rust предоставляет инструменты для исследования кода:
cargo clippy
: Линтер, который находит потенциально опасные паттерны.rust-gdb
: Отладчик с интеграцией LLVM.cargo expand
: Просмотр раскрытых макросов.
Пример использования Clippy:
1 |
cargo clippy -- -D warnings |
1.8 Использование внешних библиотек
Добавьте в Cargo.toml
крейт для работы с сетью:
1 2 |
[dependencies] pnet = "0.30" |
Пример сниффера пакетов:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
use pnet::datalink::{self, NetworkInterface}; fn main() { let interface = NetworkInterface::from_name("eth0").unwrap(); let (_tx, mut rx) = datalink::channel(&interface, Default::default()).unwrap(); loop { match rx.next() { Ok(packet) => println!("Пакет: {:?}", packet), Err(e) => eprintln!("Ошибка: {}", e), } } } |
Итог
Первые шаги в Rust — это знакомство с инструментами, которые делают ваш код безопасным, быстрым и контролируемым. Даже простой «Hello, World!» может эволюционировать в мощный инструмент анализа. В следующих главах мы углубимся в систему владения, низкоуровневые операции и создание эксплойтов. А пока — экспериментируйте с макросами, сетевыми библиотеками и обработкой ошибок. Хакинг начинается с понимания базиса!

На этом все. Всем хорошего дня!