mirror of
https://codeberg.org/unspeaker/vestal.git
synced 2025-12-06 06:26:43 +01:00
borken with hello, works with kotel
This commit is contained in:
parent
a546f2d45e
commit
1d24f6e71f
3 changed files with 22 additions and 15 deletions
2
Justfile
2
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
|
||||
|
|
|
|||
|
|
@ -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<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 (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<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> {
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue