add target event filtering. (#242)
This commit is contained in:
committed by
GitHub
parent
84f17323da
commit
2febaa9b73
0
config/target_eventids.txt
Normal file
0
config/target_eventids.txt
Normal file
@@ -1,7 +1,7 @@
|
|||||||
use crate::detections::utils;
|
use crate::detections::utils;
|
||||||
use clap::{App, AppSettings, ArgMatches};
|
use clap::{App, AppSettings, ArgMatches};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use std::collections::HashMap;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref CONFIG: RwLock<ConfigReader> = RwLock::new(ConfigReader::new());
|
pub static ref CONFIG: RwLock<ConfigReader> = RwLock::new(ConfigReader::new());
|
||||||
@@ -21,6 +21,7 @@ pub struct ConfigReader {
|
|||||||
pub args: ArgMatches<'static>,
|
pub args: ArgMatches<'static>,
|
||||||
pub event_key_alias_config: EventKeyAliasConfig,
|
pub event_key_alias_config: EventKeyAliasConfig,
|
||||||
pub event_timeline_config: EventInfoConfig,
|
pub event_timeline_config: EventInfoConfig,
|
||||||
|
pub target_eventids: TargetEventIds,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConfigReader {
|
impl ConfigReader {
|
||||||
@@ -29,6 +30,7 @@ impl ConfigReader {
|
|||||||
args: build_app(),
|
args: build_app(),
|
||||||
event_key_alias_config: load_eventkey_alias("config/eventkey_alias.txt"),
|
event_key_alias_config: load_eventkey_alias("config/eventkey_alias.txt"),
|
||||||
event_timeline_config: load_eventcode_info("config/timeline_event_info.txt"),
|
event_timeline_config: load_eventcode_info("config/timeline_event_info.txt"),
|
||||||
|
target_eventids: load_target_ids("config/target_eventids.txt"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,6 +82,40 @@ fn is_test_mode() -> bool {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct TargetEventIds {
|
||||||
|
ids: HashSet<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TargetEventIds {
|
||||||
|
pub fn new() -> TargetEventIds {
|
||||||
|
return TargetEventIds {
|
||||||
|
ids: HashSet::new(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_target(&self, id: &String) -> bool {
|
||||||
|
// 中身が空の場合は全EventIdを対象とする。
|
||||||
|
if self.ids.is_empty() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return self.ids.contains(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_target_ids(path: &str) -> TargetEventIds {
|
||||||
|
let mut ret = TargetEventIds::new();
|
||||||
|
let lines = utils::read_txt(path).unwrap(); // ファイルが存在しなければエラーとする
|
||||||
|
for line in lines {
|
||||||
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ret.ids.insert(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct EventKeyAliasConfig {
|
pub struct EventKeyAliasConfig {
|
||||||
key_to_eventkey: HashMap<String, String>,
|
key_to_eventkey: HashMap<String, String>,
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ pub fn read_csv(filename: &str) -> Result<Vec<Vec<String>>, String> {
|
|||||||
return Result::Ok(ret);
|
return Result::Ok(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_target_event_id(s: &String) -> bool {
|
||||||
|
return configs::CONFIG.read().unwrap().target_eventids.is_target(s);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_event_id_key() -> String {
|
pub fn get_event_id_key() -> String {
|
||||||
return "Event.System.EventID".to_string();
|
return "Event.System.EventID".to_string();
|
||||||
}
|
}
|
||||||
|
|||||||
16
src/main.rs
16
src/main.rs
@@ -10,6 +10,7 @@ use hayabusa::omikuji::Omikuji;
|
|||||||
use hayabusa::{afterfact::after_fact, detections::utils};
|
use hayabusa::{afterfact::after_fact, detections::utils};
|
||||||
use hayabusa::{detections::configs, timeline::timeline::Timeline};
|
use hayabusa::{detections::configs, timeline::timeline::Timeline};
|
||||||
use hhmmss::Hhmmss;
|
use hhmmss::Hhmmss;
|
||||||
|
use serde_json::Value;
|
||||||
use std::{
|
use std::{
|
||||||
fs::{self, File},
|
fs::{self, File},
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
@@ -172,6 +173,21 @@ fn analysis_file(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let data = record_result.unwrap().data;
|
let data = record_result.unwrap().data;
|
||||||
|
|
||||||
|
// target_eventids.txtでフィルタする。
|
||||||
|
let eventid = utils::get_event_value(&utils::get_event_id_key(), &data);
|
||||||
|
if eventid.is_some() {
|
||||||
|
let is_target = match eventid.unwrap() {
|
||||||
|
Value::String(s) => utils::is_target_event_id(s),
|
||||||
|
Value::Number(n) => utils::is_target_event_id(&n.to_string()),
|
||||||
|
_ => true, // レコードからEventIdが取得できない場合は、特にフィルタしない
|
||||||
|
};
|
||||||
|
if !is_target {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EvtxRecordInfo構造体に変更
|
||||||
let data_string = data.to_string();
|
let data_string = data.to_string();
|
||||||
let record_info = EvtxRecordInfo::new((&filepath_disp).to_string(), data, data_string);
|
let record_info = EvtxRecordInfo::new((&filepath_disp).to_string(), data, data_string);
|
||||||
records_per_detect.push(record_info);
|
records_per_detect.push(record_info);
|
||||||
|
|||||||
Reference in New Issue
Block a user