- Published on
Rustでキーロガーを作成する
- Authors
- Name
- Shou Arisaka / 有坂翔
Rustでキーロガーを作成する方法について紹介する。
キーロガーは、キーボードの入力を記録するプログラム・ツールである。セキュリティの観点からは、キーロガーはマルウェアの一種であるとされることが多いが、セキュリティの観点以外にも多くの活用事例がある。
例えばユーザーの入力を記録することで、ユーザーや自分自身の入力をもとにデータ分析や機械学習に繋げることや、生産性向上・プロダクティビティツールとして活用される事例もある。あるいはキーボード入力をもとにショートカットキー・ホットキーを実装するマクロツールとして使うこともできるだろう。
Rustでキーロガーを作成するメリットとして、RustはC言語と同様に低レベルの言語であるため、キーボードの入力を取得するためのライブラリが豊富に存在することが挙げられる。また、RustはC言語と比較してメモリ安全性が高いため、キーロガーを作成する際には、メモリリークやバッファオーバーフローなどの問題を回避することができる。
Rustによるキーロガーツールの作成
以下は当該プログラムのソースコードである。
use chrono::prelude::*;
use device_query::{DeviceQuery, DeviceState};
use std::fs::OpenOptions;
use std::io::Write;
use serde::Serialize;
#[derive(Serialize)]
struct Log {
unix: i64,
delta: i64,
keyboard: Vec<String>,
}
/// Keylogger launch function
pub fn run(path: String) {
let device_state = DeviceState::new();
let mut prev_keys = vec![];
let mut prev_date: DateTime<Local> = Local::now();
let path = format!("{}.jsonl", path);
let mut file = OpenOptions::new()
.create(true)
.append(true)
.open(path)
.expect("Failed to open file");
loop {
let local: DateTime<Local> = Local::now();
let unix = local.timestamp_millis();
let delta = local.timestamp_millis() - prev_date.timestamp_millis();
let keys = device_state.get_keys();
if keys != prev_keys && !keys.is_empty() {
let log = serde_json::to_string(&Log {
// time: local,
unix,
delta,
keyboard: keys.iter().map(|key| key.to_string()).collect(),
}).unwrap();
println!("{}", log);
writeln!(file, "{}", log).expect("Failed to write to file");
prev_date = local;
}
prev_keys = keys;
std::thread::sleep(std::time::Duration::from_millis(10));
}
}
上記をファイル(例えばmain.rs
)に保存し、cargo run
で実行すると、キーボードの入力を記録することができる。
ログはJSONL形式で保存される。JSONL形式は、JSONの各行がJSONオブジェクトであるテキストファイルのことである。JSONL形式は、JSON形式と比較して、ファイルサイズが小さく、読み込みが高速であるという特徴がある。パーシングも容易であるため、データ分析や機械学習に繋げることができる。
紹介は以上である。