Я действительно вникал в Zeltser Challenge от Matt B. Он много говорил на Forensic Lunch об использовании Medium в качестве своего выбора для ведения блога. Видя, как давно я не вел какой-либо блог, я подумал, что было бы неплохо проверить это.

В последнее время в своем маленьком мире я изучаю новый язык Rust. Я должен сказать, я очень впечатлен им. Он быстрый, безопасный, кроссплатформенный, имеет менеджер пакетов и, что самое приятное, для языка более низкого уровня вам не нужно управлять указателями! Нельзя не поблагодарить Эрика Циммермана за знакомство с языком. Очевидно, что если кто-то настолько умный, как он, говорит, что что-то выглядит потрясающе, мой долг проверить это. Это относительно новый язык, который постоянно развивается, что может быть как хорошо, так и плохо, в любом случае я вижу в нем огромный потенциал. Я не буду углубляться в это, потому что другие люди могут дать вам больше деталей, чем я. Вот хорошее введение презентация.

Излишне говорить, что единственный способ чему-то научиться — это сделать это! Я запустил парсер журнала USN на Rust. Вы можете отслеживать его продвижение на моем github: https://github.com/forensicmatt/RustyUsn. Этот проект существует не для того, чтобы заполнить пробел в инструментах, поскольку все мы знаем, что существует множество инструментов, которые могут анализировать журнал, а скорее для того, чтобы стать отправной точкой для изучения концепций, которые я хочу изучить в Rust. Учитывая, что журнал USN имеет очень простой формат, это хороший кандидат. Итак, какие концепции я хочу изучить в Rust?

  • Кроссплатформенная функциональность
  • Использование Cargo (менеджер по упаковке)
  • Интерфейс командной строки (параметры обработки)
  • Обработка ошибок
  • Разбираем бинарник на структуры
  • Работа с DateTimes
  • Работа с Юникодом
  • Создание привязок Python

Этот список послужит основой для тем, которые я хотел бы осветить на этой неделе.

Но прежде чем мы начнем рассматривать каждую концепцию и то, как она отображается в коде, давайте посмотрим, где она находится в настоящее время.

Давайте сначала посмотрим, как его скомпилировать. Все, что вам нужно сделать, это скачать новую версию Rust. Затем скачайте репозиторий RustyUsn. После распаковки вы готовы к компиляции. Для этого мы используем cargo, менеджер пакетов Rust (очень похожий на pip для python). Дайте ему cargo install, и все готово. Может выглядеть примерно так:

D:\Dev\Rust\RustyUsn-master>cargo build
 Downloading byteorder v0.5.3
 Downloading chrono v0.2.25
 Downloading clap v2.16.3
 Downloading num v0.1.36
 Downloading rustc-serialize v0.3.21
 Downloading serde v0.8.17
 Downloading time v0.1.35
 Downloading num-traits v0.1.36
 Downloading num-integer v0.1.32
 Downloading num-iter v0.1.32
 Downloading libc v0.2.17
 Downloading kernel32-sys v0.2.2
 Downloading winapi v0.2.8
 Downloading winapi-build v0.1.1
 Downloading vec_map v0.6.0
 Downloading bitflags v0.7.0
 Downloading unicode-width v0.1.3
 Downloading ansi_term v0.9.0
 Downloading strsim v0.5.1
 Downloading unicode-segmentation v0.1.2
 Downloading term_size v0.2.1
   Compiling winapi v0.2.8
   Compiling unicode-segmentation v0.1.2
   Compiling unicode-width v0.1.3
   Compiling rustc-serialize v0.3.21
   Compiling vec_map v0.6.0
   Compiling winapi-build v0.1.1
   Compiling bitflags v0.7.0
   Compiling strsim v0.5.1
   Compiling byteorder v0.5.3
   Compiling kernel32-sys v0.2.2
   Compiling libc v0.2.17
   Compiling serde v0.8.17
   Compiling num-traits v0.1.36
   Compiling ansi_term v0.9.0
   Compiling num-integer v0.1.32
   Compiling num-iter v0.1.32
   Compiling num v0.1.36
   Compiling time v0.1.35
   Compiling term_size v0.2.1
   Compiling clap v2.16.3
   Compiling chrono v0.2.25
   Compiling usntest v0.1.0 (file:///D:/Dev/Rust/RustyUsn-master)
    Finished debug [unoptimized + debuginfo] target(s) in 50.66 secs

Затем мы можем перейти в каталог сборки, который называется ./target/debug. Отсюда мы можем запустить его:

D:\Dev\Rust\RustyUsn-master\target\debug>usntest.exe -h
MyUsnApp 1.0
Matthew Seyer <[email protected]>
Parse USN records
USAGE:
    usntest.exe --journal <FILE>
FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information
OPTIONS:
    -j, --journal <FILE>    The USN journal file to parse

Очень простой. Давайте дадим ему журнал.

D:\Dev\Rust\RustyUsn-master\target\debug>usntest.exe -j D:\Testing\$UsnJrnl.$J
Journal to parse: D:\Testing\$UsnJrnl.$J
function: get_next_record() at offset: 0
USN structure 1: UsnRecordV2 {
    record_length: 96,
    major_version: 2,
    minor_version: 0,
    file_reference_number: 10477624533077459059,
    parent_file_reference_number: 1970324837116475,
    usn: 20342374400,
    timestamp: 2013-10-19T12:16:53.276040,
    reason: 2,
    source_info: 0,
    security_id: 0,
    file_attributes: 8224,
    file_name_length: 32,
    file_name_offset: 60,
    file_name: "BTDevManager.log"
}
function: get_next_record() at offset: 96
USN structure 2: UsnRecordV2 {
    record_length: 96,
    major_version: 2,
    minor_version: 0,
    file_reference_number: 10477624533077459059,
    parent_file_reference_number: 1970324837116475,
    usn: 20342374496,
    timestamp: 2013-10-19T12:16:53.276040,
    reason: 2147483650,
    source_info: 0,
    security_id: 0,
    file_attributes: 8224,
    file_name_length: 32,
    file_name_offset: 60,
    file_name: "BTDevManager.log"
}
...
function: get_next_record() at offset: 37686992
USN structure 367260: UsnRecordV2 {
    record_length: 200,
    major_version: 2,
    minor_version: 0,
    file_reference_number: 2814749767128558,
    parent_file_reference_number: 281474976989994,
    usn: 20380061392,
    timestamp: 2013-10-23T11:34:39.839588,
    reason: 2147484160,
    source_info: 0,
    security_id: 0,
    file_attributes: 8228,
    file_name_length: 138,
    file_name_offset: 60,
    file_name: "1a60b305567c1cf7f77dad5be80a8169_5b6de537-8036-4906-9cf1-ecfc4eabd13c"
}

В настоящее время он просто распечатывает структуры записей. Это то, что нам нужно будет изменить в будущем. Пока давайте посмотрим, насколько быстро это. Скомпилируем его как Release (Релизный режим компилируется дольше, но код будет работать быстрееCargo Guide). Для этого мы используем:

cargo build --release

Давайте запустим это с помощью команды измерения powershell.

PS D:\Dev\Rust\RustyUsn-master\target\release> Measure-Command {.\usntest.exe -j D:\Testing\J}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 20
Milliseconds      : 989
Ticks             : 209891982
TotalDays         : 0.000242930534722222
TotalHours        : 0.00583033283333333
TotalMinutes      : 0.34981997
TotalSeconds      : 20.9891982
TotalMilliseconds : 20989.1982

Для этого тестового набора usntest.exe даже не занимает больше 1 МБ в памяти.

Вот некоторая информация об используемом файле журнала:

Количество записей USN: 367260
Размер файла: 35,9 МБ (37 687 192 байта)

Итак... теперь мы знаем, где мы находимся. Давайте покопаемся в концепциях и коде.