borken with hello, works with kotel

This commit is contained in:
🪞👃🪞 2025-02-22 23:41:55 +02:00
parent a546f2d45e
commit 1d24f6e71f
3 changed files with 22 additions and 15 deletions

View file

@ -1,4 +1,6 @@
hello: hello:
clear; tmux clear-history || true; cargo build && target/debug/vestal bin/hello-msg.exe 2>&1 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: hello-v:
clear; tmux clear-history || true; cargo build && target/debug/vestal -v bin/hello-msg.exe 2>&1 clear; tmux clear-history || true; cargo build && target/debug/vestal -v bin/hello-msg.exe 2>&1

View file

@ -191,6 +191,8 @@ struct Dll {
text_section: Arc<[u8]>, text_section: Arc<[u8]>,
/// Start of `.text` section /// Start of `.text` section
text_section_start: usize, text_section_start: usize,
/// Size of `.text` section
text_section_size: usize,
/// Assumed address in memory /// Assumed address in memory
code_base: u32, code_base: u32,
/// Addresses of imported methods by library /// Addresses of imported methods by library
@ -207,17 +209,17 @@ struct Dll {
impl std::fmt::Debug for Dll { impl std::fmt::Debug for Dll {
fn fmt (&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> { 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_library.len(),
self.deps_by_address.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_source.len(),
self.calls_by_target.len()); self.calls_by_target.len());
let exports = format!("(exports {})", let exports = format!("exp {}",
self.exports.len()); 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.name,
&self.path, self.text_section_size,
self.text_section_start, self.text_section_start,
self.code_base) self.code_base)
} }
@ -228,10 +230,7 @@ impl Dll {
if verbose { if verbose {
println!("\n(load {BOLD}{path:?}{RESET})"); println!("\n(load {BOLD}{path:?}{RESET})");
} }
let name = path.file_name().expect("no file name"); let (name, pe, data, bang) = Self::read_pe(path)?;
let name: Arc<str> = 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 code = pe.get_section_by_name(".text")?; let code = pe.get_section_by_name(".text")?;
let start = code.pointer_to_raw_data.0 as usize; let start = code.pointer_to_raw_data.0 as usize;
let size = code.size_of_raw_data as usize; let size = code.size_of_raw_data as usize;
@ -247,24 +246,30 @@ impl Dll {
calls_by_target: Default::default(), calls_by_target: Default::default(),
text_section: Arc::from(text), text_section: Arc::from(text),
text_section_start: start, text_section_start: start,
text_section_size: size,
code_base: match pe.get_valid_nt_headers()? { code_base: match pe.get_valid_nt_headers()? {
NTHeaders::NTHeaders32(h32) => panic!("32 bit headers"), NTHeaders::NTHeaders32(h32) => panic!("32 bit headers"),
NTHeaders::NTHeaders64(h64) => h64.optional_header.base_of_code.0, NTHeaders::NTHeaders64(h64) => h64.optional_header.base_of_code.0,
}, },
pe, pe,
}; };
//let _exports = dll.collect_exports(verbose)?;
let (_modules_count, _methods_count) = dll.collect_deps(verbose)?; let (_modules_count, _methods_count) = dll.collect_deps(verbose)?;
let _calls = dll.collect_calls(verbose)?; let _calls = dll.collect_calls(verbose)?;
println!("{dll:?}"); println!("{dll:?}");
let _exports = dll.collect_exports(verbose)?;
Ok(dll) Ok(dll)
} }
fn read_pe (path: &Arc<PathBuf>) -> Usually<(Arc<str>, Arc<VecPE>, Arc<[u8]>, Arc<[u8]>)> {
let name = path.as_ref().file_name().expect("no file name");
let name: Arc<str> = 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<usize> { fn collect_exports (&mut self, _verbose: bool) -> Usually<usize> {
self.exports = ImageExportDirectory::parse(self.pe.as_ref())? let directory = ImageExportDirectory::parse(self.pe.as_ref())?;
.get_export_map(self.pe.as_ref())? let export_map = directory.get_export_map(self.pe.as_ref())?;
.into_iter() self.exports = export_map.into_iter().map(|(k, v)|(k.into(), v)).collect();
.map(|(k, v)|(k.into(), v))
.collect();
Ok(self.exports.len()) Ok(self.exports.len())
} }
} }