From 1d24f6e71ff9715fe872b4f3cde408a00958d247 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 22 Feb 2025 23:41:55 +0200 Subject: [PATCH] borken with hello, works with kotel --- Justfile | 2 ++ crates/vestal/src/dll.rs | 0 crates/vestal/src/main.rs | 35 ++++++++++++++++++++--------------- 3 files changed, 22 insertions(+), 15 deletions(-) delete mode 100644 crates/vestal/src/dll.rs diff --git a/Justfile b/Justfile index 5a643ad..8b2dfe8 100644 --- a/Justfile +++ b/Justfile @@ -1,4 +1,6 @@ hello: clear; tmux clear-history || true; cargo build && target/debug/vestal bin/hello-msg.exe 2>&1 +kotel: + clear; tmux clear-history || true; cargo build && target/debug/vestal bin/kotel.dll 2>&1 hello-v: clear; tmux clear-history || true; cargo build && target/debug/vestal -v bin/hello-msg.exe 2>&1 diff --git a/crates/vestal/src/dll.rs b/crates/vestal/src/dll.rs deleted file mode 100644 index e69de29..0000000 diff --git a/crates/vestal/src/main.rs b/crates/vestal/src/main.rs index 2dbbeb1..e4fc7d8 100644 --- a/crates/vestal/src/main.rs +++ b/crates/vestal/src/main.rs @@ -191,6 +191,8 @@ struct Dll { text_section: Arc<[u8]>, /// Start of `.text` section text_section_start: usize, + /// Size of `.text` section + text_section_size: usize, /// Assumed address in memory code_base: u32, /// Addresses of imported methods by library @@ -207,17 +209,17 @@ struct Dll { impl std::fmt::Debug for Dll { fn fmt (&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> { - let deps = format!("(deps :by-lib {} :by-addr {})", + let deps = format!("deps (lib {}) (addr {:3})", self.deps_by_library.len(), self.deps_by_address.len()); - let calls = format!("(calls :by-src {} :by-tgt {})", + let calls = format!("calls (src {:4}) (tgt {:4})", self.calls_by_source.len(), self.calls_by_target.len()); - let exports = format!("(exports {})", + let exports = format!("exp {}", self.exports.len()); - write!(f, "(dll {} {:?}\n (img 0x{:>08x} -> mem 0x{:>08x})\n {deps}\n {calls}\n {exports})", + write!(f, "(dll {BOLD}{UNDERLINE}{:15}{RESET} [0x{:>08x}] (img 0x{:>08x} -> mem 0x{:>08x}) {deps} {calls} {exports})", &self.name, - &self.path, + self.text_section_size, self.text_section_start, self.code_base) } @@ -228,10 +230,7 @@ impl Dll { if verbose { println!("\n(load {BOLD}{path:?}{RESET})"); } - let name = path.file_name().expect("no file name"); - let name: Arc = name.to_str().map(Arc::from).expect("non-unicode filename"); - let (bang, data) = crate::bang::slice_shebang(read(path.as_path())?.as_slice()); - let pe = Arc::new(VecPE::from_disk_data(data.clone())); + let (name, pe, data, bang) = Self::read_pe(path)?; let code = pe.get_section_by_name(".text")?; let start = code.pointer_to_raw_data.0 as usize; let size = code.size_of_raw_data as usize; @@ -247,24 +246,30 @@ impl Dll { calls_by_target: Default::default(), text_section: Arc::from(text), text_section_start: start, + text_section_size: size, code_base: match pe.get_valid_nt_headers()? { NTHeaders::NTHeaders32(h32) => panic!("32 bit headers"), NTHeaders::NTHeaders64(h64) => h64.optional_header.base_of_code.0, }, pe, }; - //let _exports = dll.collect_exports(verbose)?; let (_modules_count, _methods_count) = dll.collect_deps(verbose)?; let _calls = dll.collect_calls(verbose)?; println!("{dll:?}"); + let _exports = dll.collect_exports(verbose)?; Ok(dll) } + fn read_pe (path: &Arc) -> Usually<(Arc, Arc, Arc<[u8]>, Arc<[u8]>)> { + let name = path.as_ref().file_name().expect("no file name"); + let name: Arc = name.to_str().map(Arc::from).expect("non-unicode filename"); + let (bang, data) = crate::bang::slice_shebang(read(path.as_path())?.as_slice()); + let pe = Arc::new(VecPE::from_disk_data(data.clone())); + Ok((name, pe, data, bang)) + } fn collect_exports (&mut self, _verbose: bool) -> Usually { - self.exports = ImageExportDirectory::parse(self.pe.as_ref())? - .get_export_map(self.pe.as_ref())? - .into_iter() - .map(|(k, v)|(k.into(), v)) - .collect(); + let directory = ImageExportDirectory::parse(self.pe.as_ref())?; + let export_map = directory.get_export_map(self.pe.as_ref())?; + self.exports = export_map.into_iter().map(|(k, v)|(k.into(), v)).collect(); Ok(self.exports.len()) } }