diff --git a/Cargo.lock b/Cargo.lock index 4b8b81b..cbf2884 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -17,6 +17,21 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -32,6 +47,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.6.17" @@ -132,11 +156,21 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.36.5", "rustc-demangle", "windows-targets 0.52.6", ] +[[package]] +name = "better-panic" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa9e1d11a268684cbd90ed36370d7577afb6c62d912ddff5c15fc34343e5036" +dependencies = [ + "backtrace", + "console", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -149,6 +183,18 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -199,6 +245,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex 0.2.4", + "indexmap", + "strsim 0.10.0", + "termcolor", + "textwrap", +] + [[package]] name = "clap" version = "4.5.20" @@ -212,7 +273,7 @@ dependencies = [ [[package]] name = "clap-sys" version = "0.3.0" -source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature/cstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" +source = "git+https://github.com/robbert-vdh/clap-sys.git?branch=feature%2Fcstr-macro#523a5f8a8dd021ec99e7d6e0c0ebe7741a3da9d4" [[package]] name = "clap_builder" @@ -222,8 +283,8 @@ checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", - "clap_lex", - "strsim", + "clap_lex 0.7.2", + "strsim 0.11.1", ] [[package]] @@ -238,18 +299,48 @@ dependencies = [ "syn 2.0.85", ] +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "clap_lex" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "console" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -275,6 +366,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam" version = "0.8.4" @@ -349,6 +449,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "exe" version = "0.5.6" @@ -367,6 +473,31 @@ dependencies = [ "widestring", ] +[[package]] +name = "fern" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee" +dependencies = [ + "log", +] + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "generic-array" version = "0.14.7" @@ -383,6 +514,17 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "goblin" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" +dependencies = [ + "log", + "plain", + "scroll 0.11.0", +] + [[package]] name = "goblin" version = "0.9.2" @@ -391,9 +533,15 @@ checksum = "53ab3f32d1d77146981dea5d6b1e8fe31eedcb7013e5e00d6ccd1259a4b4d923" dependencies = [ "log", "plain", - "scroll", + "scroll 0.12.0", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "heck" version = "0.5.0" @@ -438,6 +586,25 @@ dependencies = [ "cc", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "inflate" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" +dependencies = [ + "adler32", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -459,6 +626,57 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lancelot" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c881da4146200b58efe507a51803ce5b643059c7154413e9645302b6a84b8c" +dependencies = [ + "ansi_term", + "anyhow", + "bitflags 1.3.2", + "bitvec", + "byteorder", + "goblin 0.6.1", + "lancelot-flirt", + "lazy_static", + "log", + "object 0.30.4", + "regex", + "smallvec", + "smol_str", + "thiserror", + "widestring", + "zydis", +] + +[[package]] +name = "lancelot-flirt" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030dc77778d64330bf958fb0913b56ecb2b98bf54c8c971ba67f6e85e404f4b9" +dependencies = [ + "anyhow", + "better-panic", + "bitflags 1.3.2", + "bitvec", + "chrono", + "clap 3.2.25", + "fern", + "inflate", + "log", + "nom", + "regex", + "smallvec", + "thiserror", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.161" @@ -513,6 +731,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f2dd5c7f8aaf48a76e389068ab25ed80bdbc226b887f9013844c415698c9952" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -576,6 +800,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -609,6 +843,16 @@ dependencies = [ "malloc_buf", ] +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "flate2", + "memchr", +] + [[package]] name = "object" version = "0.36.5" @@ -630,6 +874,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + [[package]] name = "parking_lot" version = "0.12.3" @@ -704,6 +954,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -719,6 +975,35 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -737,13 +1022,33 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive 0.11.1", +] + [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ - "scroll_derive", + "scroll_derive 0.12.0", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", ] [[package]] @@ -789,6 +1094,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -827,6 +1143,21 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "smol_str" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" +dependencies = [ + "serde", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" @@ -855,6 +1186,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syscalls" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d0e35dc7d73976a53c7e6d7d177ef804a0c0ee774ec77bcc520c2216fd7cbe" +dependencies = [ + "serde", + "serde_repr", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "termcolor" version = "1.4.1" @@ -864,6 +1211,32 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "time" version = "0.3.36" @@ -925,9 +1298,11 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" name = "vestal" version = "0.1.0" dependencies = [ - "clap", + "clap 4.5.20", "exe", - "goblin", + "goblin 0.9.2", + "lancelot", + "syscalls", ] [[package]] @@ -940,7 +1315,7 @@ dependencies = [ [[package]] name = "vst3-com" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" dependencies = [ "vst3-com-macros", ] @@ -948,7 +1323,7 @@ dependencies = [ [[package]] name = "vst3-com-macros" version = "0.2.0" -source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" dependencies = [ "proc-macro2", "quote", @@ -959,7 +1334,7 @@ dependencies = [ [[package]] name = "vst3-com-macros-support" version = "0.2.0" -source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" dependencies = [ "proc-macro2", "quote", @@ -969,7 +1344,7 @@ dependencies = [ [[package]] name = "vst3-sys" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix/drop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" +source = "git+https://github.com/robbert-vdh/vst3-sys.git?branch=fix%2Fdrop-box-from-raw#b3ff4d775940f5b476b9d1cca02a90e07e1922a2" dependencies = [ "vst3-com", ] @@ -1213,3 +1588,24 @@ name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zydis" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc13daee87922e0d6dc6137327be10327ad1cee0515ec775f898206193aaeb8" +dependencies = [ + "bitflags 1.3.2", + "cmake", + "serde", + "serde_derive", +] diff --git a/crates/vestal/Cargo.toml b/crates/vestal/Cargo.toml index 0d8e0d4..3ac8100 100644 --- a/crates/vestal/Cargo.toml +++ b/crates/vestal/Cargo.toml @@ -7,4 +7,6 @@ edition = "2021" exe = "0.5.6" goblin = "0.9.2" clap = { version = "4.5.4", features = [ "derive" ] } - +lancelot = "0.8.6" +syscalls = "0.6.18" +#falcon = "0.5.5" diff --git a/crates/vestal/src/execute.rs b/crates/vestal/src/execute.rs new file mode 100644 index 0000000..e418ac8 --- /dev/null +++ b/crates/vestal/src/execute.rs @@ -0,0 +1,17 @@ +use crate::*; + +impl Vestal { + pub fn execute (&self, path: impl AsRef) -> Usually<()> { + Self::with_pe(&path, |pe|{ + println!("PE: {}", path.as_ref().display()); + let mut main = None; + for export in pe.exports.iter() { + if let Some("VSTPluginMain") = export.name { + println!("VSTPluginMain: {:?} + {:?}", &export.rva, &export.offset); + main = Some(export); + break + } + } + }) + } +} diff --git a/crates/vestal/src/inspect.rs b/crates/vestal/src/inspect.rs new file mode 100644 index 0000000..36b3890 --- /dev/null +++ b/crates/vestal/src/inspect.rs @@ -0,0 +1,44 @@ +use crate::*; + +impl Vestal { + pub fn inspect (&self, path: impl AsRef) -> Usually<()> { + Self::with_pe(&path, |pe|{ + println!("PE: {}", path.as_ref().display()); + for export in pe.exports.iter() { + if let Some("VSTPluginMain") = export.name { + println!("VSTPluginMain: {:?} + {:?}", &export.rva, &export.offset); + break + } + } + use std::collections::HashMap; + let mut imports: HashMap> = Default::default(); + println!("Imports: {:#?}", &pe.imports.len()); + for import in pe.imports.iter() { + let dll = import.dll.clone(); + if !imports.contains_key(dll) { + imports.insert(dll.to_string(), vec![]); + } + imports.get_mut(dll).unwrap().push(import); + } + println!("Dependencies: {:#?}", &imports.len()); + for (dll, imports) in imports.iter() { + println!("- {dll}"); + for import in imports.iter() { + println!(" {:8} + {:8} {:32}", import.rva, import.offset, import.name); + } + } + }) + //let image = VecPE::from_disk_file(path)?; + //let import_directory = ImportDirectory::parse(&image)?; + //for descriptor in import_directory.descriptors { + //let name = descriptor.get_name(&image)?.as_str()?; + //println!("\n{name}:"); + //for import in descriptor.get_imports(&image).unwrap() { + //match import { + //ImportData::Ordinal(x) => println!("{name} #{x}"), + //ImportData::ImportByName(s) => println!("{name} {s}") + //} + //} + //} + } +} diff --git a/crates/vestal/src/main.rs b/crates/vestal/src/main.rs index 73feb1d..7bea55e 100644 --- a/crates/vestal/src/main.rs +++ b/crates/vestal/src/main.rs @@ -1,62 +1,41 @@ +pub(crate) use std::path::Path; +pub(crate) use goblin::{error, Object, pe::PE, pe::import::Import}; +//pub(crate) use exe::pe::{PE, VecPE}; +//pub(crate) use exe::types::{ImportDirectory, ImportData, CCharString}; use clap::Parser; -use std::path::Path; -use goblin::{error, Object}; -use exe::pe::{PE, VecPE}; -use exe::types::{ImportDirectory, ImportData, CCharString}; + +mod execute; +mod inspect; type Usually = Result>; fn main () -> Usually<()> { - VestalCli::parse().run() + Vestal::parse().run() } #[derive(Debug, Parser)] #[command(version, about, long_about = None)] -pub enum VestalCli { +pub enum Vestal { /// Inspect a DLL - Inspect { - path: String - } + Inspect { path: String }, + /// Load a VST DLL into memory + Execute { path: String }, } -impl VestalCli { - fn run (&self) -> Usually<()> { +impl Vestal { + pub fn run (&self) -> Usually<()> { match self { - Self::Inspect { path } => self.inspect(path.as_str()) + Self::Inspect { path } => self.inspect(path.as_str()), + Self::Execute { path } => self.execute(path.as_str()), } } - fn inspect (&self, path: impl AsRef) -> Usually<()> { + pub fn with_pe (path: &impl AsRef, cb: impl Fn(&PE<'_>)) -> Usually<()> { let buffer = std::fs::read(path.as_ref())?; - match Object::parse(&buffer)? { - Object::PE(pe) => { - println!("PE: {}", path.as_ref().display()); - println!("\nExports: {}", &pe.exports.len()); - for export in pe.exports.iter() { - println!("| {:?} | {:?} | {:?} |", - export.offset, export.name, export.rva - ); - } - println!("\nImports: {:#?}", &pe.imports.len()); - for import in pe.imports.iter() { - println!("| {:16} | {:32} | {} | {} | {} |", - import.dll, import.name, import.size, import.offset, import.rva - ); - } - }, - _ => panic!("not a PE") + if let Object::PE(ref pe) = Object::parse(&buffer)? { + cb(pe); + Ok(()) + } else { + Err("not a PE".into()) } - //let image = VecPE::from_disk_file(path)?; - //let import_directory = ImportDirectory::parse(&image)?; - //for descriptor in import_directory.descriptors { - //let name = descriptor.get_name(&image)?.as_str()?; - //println!("\n{name}:"); - //for import in descriptor.get_imports(&image).unwrap() { - //match import { - //ImportData::Ordinal(x) => println!("{name} #{x}"), - //ImportData::ImportByName(s) => println!("{name} {s}") - //} - //} - //} - Ok(()) } } diff --git a/shell.nix b/shell.nix new file mode 100755 index 0000000..78aa3b9 --- /dev/null +++ b/shell.nix @@ -0,0 +1,41 @@ +#!/usr/bin/env nix-shell +{pkgs?import{}}:let + #suil = pkgs.enableDebugging (pkgs.suil.overrideAttrs (a: b: { + #dontStrip = true; separateDebugInfo = true; + #})); +in pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + pkg-config + freetype + libclang + #bear + ]; + buildInputs = with pkgs; [ + jack2 + lilv + serd + libclang + #suil + glib + gtk3 + ]; + VST3_SDK_DIR = "/home/user/Lab/Music/tek/vst3sdk/"; + LIBCLANG_PATH = "${pkgs.libclang.lib.outPath}/lib"; + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath (with pkgs; [ + pipewire.jack + # for ChowKick.lv2: + freetype + libgcc.lib + # for Panagement + xorg.libX11 + xorg.libXcursor + xorg.libXi + libxkbcommon + #suil + # for Helm: + alsa-lib + curl + libglvnd + #xorg_sys_opengl + ]); +}