From f13f0bb968c934fa00d07aad030abe41d1297063 Mon Sep 17 00:00:00 2001 From: fukusuket <41001169+fukusuket@users.noreply.github.com> Date: Tue, 17 Jan 2023 23:20:48 +0900 Subject: [PATCH 1/5] add: string length check before regex match --- src/detections/rule/matchers.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/detections/rule/matchers.rs b/src/detections/rule/matchers.rs index fcf23de64..35fdabf6a 100644 --- a/src/detections/rule/matchers.rs +++ b/src/detections/rule/matchers.rs @@ -184,6 +184,7 @@ impl LeafMatcher for AllowlistFileMatcher { /// ワイルドカードの処理やパイプ pub struct DefaultMatcher { re: Option, + match_str_len: Option, pipes: Vec, key_list: Nested, } @@ -192,6 +193,7 @@ impl DefaultMatcher { pub fn new() -> DefaultMatcher { DefaultMatcher { re: Option::None, + match_str_len: Option::None, pipes: Vec::new(), key_list: Nested::::new(), } @@ -274,7 +276,15 @@ impl LeafMatcher for DefaultMatcher { if !err_msges.is_empty() { return Err(err_msges); } - if self.pipes.len() >= 2 { + let n = self.pipes.len(); + if n == 0 { + self.match_str_len = match select_value.as_str() { + None => None, // strに変換できない場合は、文字列長マッチによる比較はしない + Some(s) if s.contains('*') | s.contains('?') => None, //ワイルドカードを含む場合は、文字列長マッチによる比較はしない + Some(s) => Some(s.len()) + }; + } + if n >= 2 { // 現状では複数のパイプは対応していない let errmsg = format!( "Multiple pipe elements cannot be used. key:{}", @@ -349,6 +359,13 @@ impl LeafMatcher for DefaultMatcher { self.re.as_ref().unwrap().is_match(event_value_str) } else { // 通常の検索はこっち + if let Some(match_str_length) = self.match_str_len { + // 正規表現マッチは重いので、文字列の長さが一致するかだけをまずチェックする + // パイプやワイルドカードを持つ場合は、この分岐には入らず、以降の正規表現マッチのみ + if match_str_length != event_value_str.len() { + return false; + } + } self.is_regex_fullmatch(event_value_str) } } From f4b097dae79ad328e17234f62cf3d7be977b3b20 Mon Sep 17 00:00:00 2001 From: fukusuket <41001169+fukusuket@users.noreply.github.com> Date: Wed, 18 Jan 2023 00:18:58 +0900 Subject: [PATCH 2/5] fix: apply cargo fmt --- src/detections/rule/matchers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detections/rule/matchers.rs b/src/detections/rule/matchers.rs index 35fdabf6a..f506e538b 100644 --- a/src/detections/rule/matchers.rs +++ b/src/detections/rule/matchers.rs @@ -281,7 +281,7 @@ impl LeafMatcher for DefaultMatcher { self.match_str_len = match select_value.as_str() { None => None, // strに変換できない場合は、文字列長マッチによる比較はしない Some(s) if s.contains('*') | s.contains('?') => None, //ワイルドカードを含む場合は、文字列長マッチによる比較はしない - Some(s) => Some(s.len()) + Some(s) => Some(s.len()), }; } if n >= 2 { From 7a52cd34a9250dc964d96e354174a2352a44246d Mon Sep 17 00:00:00 2001 From: Fukusuke Takahashi <41001169+fukusuket@users.noreply.github.com> Date: Wed, 18 Jan 2023 09:29:33 +0900 Subject: [PATCH 3/5] fix: if else condition check Co-authored-by: DustInDark <2350416+hitenkoku@users.noreply.github.com> --- src/detections/rule/matchers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detections/rule/matchers.rs b/src/detections/rule/matchers.rs index f506e538b..4fda856a0 100644 --- a/src/detections/rule/matchers.rs +++ b/src/detections/rule/matchers.rs @@ -284,7 +284,7 @@ impl LeafMatcher for DefaultMatcher { Some(s) => Some(s.len()), }; } - if n >= 2 { + else if n >= 2 { // 現状では複数のパイプは対応していない let errmsg = format!( "Multiple pipe elements cannot be used. key:{}", From 5008aab1984d35c8a1ff39b8a30bd217b488fc1a Mon Sep 17 00:00:00 2001 From: fukusuket <41001169+fukusuket@users.noreply.github.com> Date: Wed, 18 Jan 2023 09:32:15 +0900 Subject: [PATCH 4/5] fix: apply cargo fmt --- src/detections/rule/matchers.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/detections/rule/matchers.rs b/src/detections/rule/matchers.rs index 4fda856a0..fd783d7a6 100644 --- a/src/detections/rule/matchers.rs +++ b/src/detections/rule/matchers.rs @@ -283,8 +283,7 @@ impl LeafMatcher for DefaultMatcher { Some(s) if s.contains('*') | s.contains('?') => None, //ワイルドカードを含む場合は、文字列長マッチによる比較はしない Some(s) => Some(s.len()), }; - } - else if n >= 2 { + } else if n >= 2 { // 現状では複数のパイプは対応していない let errmsg = format!( "Multiple pipe elements cannot be used. key:{}", From 0cbd4a26c53d13e9ef4d3065ed352d5d291f49dd Mon Sep 17 00:00:00 2001 From: Yamato Security <71482215+YamatoSecurity@users.noreply.github.com> Date: Wed, 18 Jan 2023 10:41:23 +0900 Subject: [PATCH 5/5] update changelog, crates and hayabusa ver --- CHANGELOG-Japanese.md | 3 +- CHANGELOG.md | 3 +- Cargo.lock | 109 ++++++++++++++++++++------------------ Cargo.toml | 2 +- src/detections/configs.rs | 18 +++---- 5 files changed, 72 insertions(+), 63 deletions(-) diff --git a/CHANGELOG-Japanese.md b/CHANGELOG-Japanese.md index 37c454651..73925ffee 100644 --- a/CHANGELOG-Japanese.md +++ b/CHANGELOG-Japanese.md @@ -9,7 +9,8 @@ **改善:** - HTMLレポートの出力に実行したコマンドラインを追加した。 (#877) (@hitenkoku) -- EIDの検知方法を変更したことによるパフォーマンスの向上。 (#882) (@fukusuket) +- イベントIDの完全比較を行うことで、約3%のスピードアップを実現した。 (#882) (@fukusuket) +- 正規表現使用前のフィルタリングにより、約14%のスピードアップを実現した。 (#883) (@fukusuket) **バグ修正:** diff --git a/CHANGELOG.md b/CHANGELOG.md index c549dc40f..b85b7b443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ **Enhancements:** - Added the executed command line to the HTML report. (#877) (@hitenkoku) -- Improved speed by EID matching process changed. (#882) (@fukusuket) +- Approximately 3% speed increase by performing exact string matching on Event IDs. (#882) (@fukusuket) +- Approximately 14% speed increase by filtering before regex usage. (#883) (@fukusuket) **Bug Fixes:** diff --git a/Cargo.lock b/Cargo.lock index 44956c715..43e159689 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -104,9 +104,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecount" @@ -220,13 +220,13 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.32" +version = "4.1.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39" +checksum = "4ec7a4128863c188deefe750ac1d1dfe66c236909f845af04beed823638dc1b2" dependencies = [ "bitflags", "clap_derive", - "clap_lex 0.3.0", + "clap_lex 0.3.1", "is-terminal", "once_cell", "strsim", @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.0.21" +version = "4.1.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" +checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" dependencies = [ "heck", "proc-macro-error", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.0" +version = "0.3.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" dependencies = [ "os_str_bytes", ] @@ -299,9 +299,9 @@ dependencies = [ [[package]] name = "console" -version = "0.15.4" +version = "0.15.5" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "c9b6515d269224923b26b5febea2ed42b2d5f2ce37284a4dd670fedd6cb8347a" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" dependencies = [ "encode_unicode", "lazy_static", @@ -486,11 +486,12 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.10.2" +version = "0.10.3" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "a92e7e37ecef6857fdc0c0c5d42fd5b0938e46590c2183cc92dd310a6d078eb1" +checksum = "af3c796f3b0b408d9fd581611b47fa850821fcb84aa640b83a3c1a5be2d691f2" dependencies = [ "console", + "shell-words", "tempfile", "zeroize", ] @@ -639,7 +640,7 @@ dependencies = [ "crc32fast", "dialoguer", "encoding", - "hashbrown 0.13.1", + "hashbrown 0.13.2", "indoc", "jemallocator", "log", @@ -726,9 +727,9 @@ dependencies = [ [[package]] name = "git2" -version = "0.15.0" +version = "0.16.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "2994bee4a3a6a51eb90c218523be382fd7ea09b16380b9312e9dbe955ff7c7d1" +checksum = "be36bc9e0546df253c0cc41fd0af34f5e92845ad8509462ec76672fac6997f5b" dependencies = [ "bitflags", "libc", @@ -753,21 +754,21 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.13.1" +version = "0.13.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ "ahash", ] [[package]] name = "hayabusa" -version = "2.1.0" +version = "2.2.0-dev" dependencies = [ "base64 0.21.0", "bytesize", "chrono", - "clap 4.0.32", + "clap 4.1.1", "comfy-table", "compact_str", "crossbeam-utils", @@ -777,7 +778,7 @@ dependencies = [ "evtx", "flate2", "git2", - "hashbrown 0.13.1", + "hashbrown 0.13.2", "hex", "hhmmss", "horrorshow", @@ -923,9 +924,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.3" +version = "1.0.4" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" dependencies = [ "libc", "windows-sys", @@ -1045,9 +1046,9 @@ checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "libgit2-sys" -version = "0.14.0+1.5.0" +version = "0.14.1+1.5.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b" +checksum = "4a07fb2692bc3593bda59de45a502bb3071659f2c515e28c71e728306b038e17" dependencies = [ "cc", "libc", @@ -1332,9 +1333,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.6" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" dependencies = [ "cfg-if", "libc", @@ -1411,9 +1412,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.50" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" dependencies = [ "unicode-ident", ] @@ -1517,9 +1518,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.0" +version = "1.7.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" dependencies = [ "aho-corasick", "memchr", @@ -1607,9 +1608,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.7" +version = "0.20.8" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" dependencies = [ "log", "ring", @@ -1730,6 +1731,12 @@ version = "1.0.0" source = "registry+/~https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+/~https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "signal-hook" version = "0.3.14" @@ -2056,9 +2063,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.24.1" +version = "1.24.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "1d9f76183f91ecfb55e1d7d5602bd1d979e38a3a522fe900241cf195624d67ae" +checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" dependencies = [ "autocfg", "bytes", @@ -2129,9 +2136,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.6.1" +version = "2.6.2" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "733b5ad78377302af52c0dbcb2623d78fe50e4b3bf215948ff29e9ee031d8566" +checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d" dependencies = [ "base64 0.13.1", "flate2", @@ -2320,45 +2327,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+/~https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "winstructs" diff --git a/Cargo.toml b/Cargo.toml index ce902bc01..41fee7459 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hayabusa" -version = "2.1.0" +version = "2.2.0-dev" authors = ["Yamato Security @SecurityYamato"] edition = "2021" rust-version = "1.66.0" diff --git a/src/detections/configs.rs b/src/detections/configs.rs index 690303e84..d0d2f24f2 100644 --- a/src/detections/configs.rs +++ b/src/detections/configs.rs @@ -256,7 +256,7 @@ fn check_thread_number(config: &Config) -> Option { pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe csv-timeline [OPTIONS]\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe csv-timeline [OPTIONS]\n\n{all-args}", term_width = 400 )] /// Save the timeline in CSV format. @@ -264,7 +264,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe json-timeline [OPTIONS]\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe json-timeline [OPTIONS]\n\n{all-args}", term_width = 400 )] /// Save the timeline in JSON/JSONL format. @@ -272,7 +272,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe logon-summary [OPTIONS]\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe logon-summary [OPTIONS]\n\n{all-args}", term_width = 400 )] /// Print a summary of successful and failed logons @@ -280,7 +280,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe metrics [OPTIONS]\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe metrics [OPTIONS]\n\n{all-args}", term_width = 400 )] /// Print event ID metrics @@ -288,7 +288,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe pivot-keywords-list [OPTIONS]\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe pivot-keywords-list [OPTIONS]\n\n{all-args}", term_width = 400 )] /// Create a list of pivot keywords @@ -296,7 +296,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", term_width = 400 )] /// Update to the latest rules in the hayabusa-rules github repository @@ -304,7 +304,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", term_width = 400, version )] @@ -313,7 +313,7 @@ pub enum Action { #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa v2.1.0\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", + help_template = "\nHayabusa v2.2.0-dev\n{author-with-newline}\n{usage-heading}\n {usage}\n\n{all-args}", term_width = 400 )] /// Set default output profile @@ -625,7 +625,7 @@ pub struct JSONOutputOption { #[derive(Parser, Clone, Debug)] #[clap( author = "Yamato Security (/~https://github.com/Yamato-Security/hayabusa) @SecurityYamato)", - help_template = "\nHayabusa 2.1.0\n{author-with-newline}\n{usage-heading}\n hayabusa.exe [OPTIONS]\n hayabusa.exe help \n\n{all-args}", + help_template = "\nHayabusa 2.2.0-dev\n{author-with-newline}\n{usage-heading}\n hayabusa.exe [OPTIONS]\n hayabusa.exe help \n\n{all-args}", term_width = 400, disable_help_flag = true )]