From 2aef77c68da53c93e4520d670fade0311d8b42b9 Mon Sep 17 00:00:00 2001 From: KishouYusa Date: Fri, 3 Oct 2025 22:03:52 +0700 Subject: [PATCH 1/4] temporary remove dump on exit for easy to understand output log --- crates/libmwemu/src/config.rs | 2 +- crates/mwemu/src/main.rs | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/libmwemu/src/config.rs b/crates/libmwemu/src/config.rs index 31541f4c..8acaf90d 100644 --- a/crates/libmwemu/src/config.rs +++ b/crates/libmwemu/src/config.rs @@ -79,7 +79,7 @@ impl Config { console_addr: 0, entry_point: constants::CFG_DEFAULT_BASE, exit_position: 0, - dump_on_exit: true, // TODO: a way to make it false/set it through cli + lib + dump_on_exit: false, // TODO: a way to make it false/set it through cli + lib dump_filename: Some("dumps/emu.bin".to_string()), // TODO: a way to set it through cli + lib code_base_addr: constants::CFG_DEFAULT_BASE, is_64bits: false, diff --git a/crates/mwemu/src/main.rs b/crates/mwemu/src/main.rs index 0fce70c7..c177428f 100644 --- a/crates/mwemu/src/main.rs +++ b/crates/mwemu/src/main.rs @@ -391,22 +391,22 @@ fn main() { // stack trace if matches.is_present("stack_trace") { - emu.cfg.stack_trace = true; + emu.cfg.stack_trace = false; } // test mode if matches.is_present("test_mode") { - emu.cfg.test_mode = true; + emu.cfg.test_mode = false; } // trace fpu if matches.is_present("fpu") { - emu.fpu_mut().trace = true; + emu.fpu_mut().trace = false; } // trace flags if matches.is_present("flags") { - emu.cfg.trace_flags = true; + emu.cfg.trace_flags = false; } // cmd @@ -443,16 +443,14 @@ fn main() { .format(CustomLogFormat::new()) .file(filename) .chan_len(Some(100000)), - ) - .unwrap(); + ).unwrap(); } else { fast_log::init( Config::new() .format(CustomLogFormat::new()) .console() .chan_len(Some(100000)), - ) - .unwrap(); + ).unwrap(); } // definitions From 981d1c578ebdb0be02a5a677cbe9ddd4327b3715 Mon Sep 17 00:00:00 2001 From: KishouYusa Date: Tue, 4 Nov 2025 22:49:37 +0700 Subject: [PATCH 2/4] Adding null color --- crates/libmwemu/src/emu/utils/mod.rs | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 crates/libmwemu/src/emu/utils/mod.rs diff --git a/crates/libmwemu/src/emu/utils/mod.rs b/crates/libmwemu/src/emu/utils/mod.rs new file mode 100644 index 00000000..d286ab6d --- /dev/null +++ b/crates/libmwemu/src/emu/utils/mod.rs @@ -0,0 +1,84 @@ +use std::sync::atomic::{AtomicBool, Ordering}; + +static COLOR_ENABLED: AtomicBool = AtomicBool::new(true); + +pub fn disable_color() { + COLOR_ENABLED.store(false, Ordering::Relaxed); +} + +pub fn enable_color() { + COLOR_ENABLED.store(true, Ordering::Relaxed); +} + +#[inline] +fn color_enabled() -> bool { + COLOR_ENABLED.load(Ordering::Relaxed) +} + +#[macro_export] +macro_rules! color { + ("Black") => { + if $crate::color_enabled() { "\x1b[0;30m" } else { "" } + }; + ("Red") => { + if $crate::color_enabled() { "\x1b[0;31m" } else { "" } + }; + ("Green") => { + if $crate::color_enabled() { "\x1b[0;32m" } else { "" } + }; + ("Orange") => { + if $crate::color_enabled() { "\x1b[0;33m" } else { "" } + }; + ("Blue") => { + if $crate::color_enabled() { "\x1b[0;34m" } else { "" } + }; + ("Purple") => { + if $crate::color_enabled() { "\x1b[0;35m" } else { "" } + }; + ("Cyan") => { + if $crate::color_enabled() { "\x1b[0;36m" } else { "" } + }; + ("LightGray") => { + if $crate::color_enabled() { "\x1b[0;37m" } else { "" } + }; + ("DarkGray") => { + if $crate::color_enabled() { "\x1b[1;30m" } else { "" } + }; + ("LightRed") => { + if $crate::color_enabled() { "\x1b[1;31m" } else { "" } + }; + ("LightGreen") => { + if $crate::color_enabled() { "\x1b[1;32m" } else { "" } + }; + ("Yellow") => { + if $crate::color_enabled() { "\x1b[1;33m" } else { "" } + }; + ("LightBlue") => { + if $crate::color_enabled() { "\x1b[1;34m" } else { "" } + }; + ("LightPurple") => { + if $crate::color_enabled() { "\x1b[1;35m" } else { "" } + }; + ("LightCyan") => { + if $crate::color_enabled() { "\x1b[1;36m" } else { "" } + }; + ("White") => { + if $crate::color_enabled() { "\x1b[1;37m" } else { "" } + }; + ("nc") => { + if $crate::color_enabled() { "\x1b[0m" } else { "" } + }; + ("ClearScreen") => { + if $crate::color_enabled() { "\x1bc" } else { "" } + }; + ($unknown:tt) => { + compile_error!(concat!( + "Unknown color name: '", + $unknown, + "'. Valid options are: \ + Black, Red, Green, Orange, Blue, Purple, Cyan, LightGray, \ + DarkGray, LightRed, LightGreen, Yellow, LightBlue, \ + LightPurple, LightCyan, White, nc, ClearScreen" + )) + }; +} \ No newline at end of file From 11e1a9415d6cd8cd9dc4f2c5c8885382c3421c0b Mon Sep 17 00:00:00 2001 From: KishouYusa Date: Wed, 12 Nov 2025 23:14:25 +0700 Subject: [PATCH 3/4] Update config --- crates/libmwemu/src/config.rs | 2 ++ crates/libmwemu/src/emu/loaders.rs | 8 ++++---- crates/mwemu/src/main.rs | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/crates/libmwemu/src/config.rs b/crates/libmwemu/src/config.rs index 8acaf90d..b8a6bb20 100644 --- a/crates/libmwemu/src/config.rs +++ b/crates/libmwemu/src/config.rs @@ -44,6 +44,7 @@ pub struct Config { pub command: Option, pub definitions: HashMap, pub entropy: bool, + pub shellcode: bool } impl Default for Config { @@ -94,6 +95,7 @@ impl Config { command: None, definitions: HashMap::new(), entropy: false, + shellcode: false, } } } diff --git a/crates/libmwemu/src/emu/loaders.rs b/crates/libmwemu/src/emu/loaders.rs index 328644b5..64597463 100644 --- a/crates/libmwemu/src/emu/loaders.rs +++ b/crates/libmwemu/src/emu/loaders.rs @@ -485,7 +485,7 @@ impl Emu { //let map_name = self.filename_to_mapname(filename); //self.cfg.filename = map_name; - if Elf32::is_elf32(filename) { + if Elf32::is_elf32(filename) && !self.cfg.shellcode { self.linux = true; self.cfg.is_64bits = false; @@ -497,13 +497,13 @@ impl Emu { let stack = self.alloc("stack", stack_sz, Permission::READ_WRITE); self.regs_mut().rsp = stack + (stack_sz / 2); //unimplemented!("elf32 is not supported for now"); - } else if Elf64::is_elf64(filename) { + } else if Elf64::is_elf64(filename) && !self.cfg.shellcode { self.linux = true; self.cfg.is_64bits = true; self.maps.clear(); let base = self.load_elf64(filename); - } else if !self.cfg.is_64bits && PE32::is_pe32(filename) { + } else if !self.cfg.is_64bits && PE32::is_pe32(filename) && !self.cfg.shellcode { log::info!("PE32 header detected."); let clear_registers = false; // TODO: this needs to be more dynamic, like if we have a register set via args or not let clear_flags = false; // TODO: this needs to be more dynamic, like if we have a flag set via args or not @@ -521,7 +521,7 @@ impl Emu { }*/ self.regs_mut().rip = ep; - } else if self.cfg.is_64bits && PE64::is_pe64(filename) { + } else if self.cfg.is_64bits && PE64::is_pe64(filename) && !self.cfg.shellcode { log::info!("PE64 header detected."); let clear_registers = false; // TODO: this needs to be more dynamic, like if we have a register set via args or not let clear_flags = false; // TODO: this needs to be more dynamic, like if we have a flag set via args or not diff --git a/crates/mwemu/src/main.rs b/crates/mwemu/src/main.rs index bd583e65..3490a96a 100644 --- a/crates/mwemu/src/main.rs +++ b/crates/mwemu/src/main.rs @@ -136,6 +136,7 @@ fn main() { .arg(clap_arg!("cmd", "", "cmd", "launch a console command", "COMMAND")) .arg(clap_arg!("entropy", "", "entropy", "display changes in the entropy")) .arg(clap_arg!("multithread", "", "multithread", "enable multithread emulation")) + .arg(clap_arg!("is_shellcode", "", "is_shellcode", "Force the binary to be shellcode")) .get_matches(); if !matches.is_present("filename") { @@ -424,6 +425,10 @@ fn main() { ); } + if matches.is_present("is_shellcode") { + emu.cfg.shellcode = true; + } + // args if matches.is_present("args") { log::info!( From 537153d1234715a6f0bb698317ac5ef71628a45d Mon Sep 17 00:00:00 2001 From: KishouYusa Date: Wed, 12 Nov 2025 23:55:08 +0700 Subject: [PATCH 4/4] Remove the utils in emu and merge it into the main utils --- crates/libmwemu/src/emu/mod.rs | 2 - crates/libmwemu/src/emu/utils.rs | 67 ---------------------- crates/libmwemu/src/emu/utils/mod.rs | 84 --------------------------- crates/libmwemu/src/lib.rs | 4 +- crates/libmwemu/src/utils.rs | 85 ++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 154 deletions(-) delete mode 100644 crates/libmwemu/src/emu/utils/mod.rs diff --git a/crates/libmwemu/src/emu/mod.rs b/crates/libmwemu/src/emu/mod.rs index 56fff485..4541e5ff 100644 --- a/crates/libmwemu/src/emu/mod.rs +++ b/crates/libmwemu/src/emu/mod.rs @@ -49,8 +49,6 @@ mod threading; mod tls; mod trace; mod winapi; -#[macro_use] -mod utils; pub struct Emu { // Global/shared state diff --git a/crates/libmwemu/src/emu/utils.rs b/crates/libmwemu/src/emu/utils.rs index 2a269914..e69de29b 100644 --- a/crates/libmwemu/src/emu/utils.rs +++ b/crates/libmwemu/src/emu/utils.rs @@ -1,67 +0,0 @@ -#[macro_export] -macro_rules! color { - ("Black") => { - "\x1b[0;30m" - }; - ("Red") => { - "\x1b[0;31m" - }; - ("Green") => { - "\x1b[0;32m" - }; - ("Orange") => { - "\x1b[0;33m" - }; - ("Blue") => { - "\x1b[0;34m" - }; - ("Purple") => { - "\x1b[0;35m" - }; - ("Cyan") => { - "\x1b[0;36m" - }; - ("LightGray") => { - "\x1b[0;37m" - }; - ("DarkGray") => { - "\x1b[1;30m" - }; - ("LightRed") => { - "\x1b[1;31m" - }; - ("LightGreen") => { - "\x1b[1;32m" - }; - ("Yellow") => { - "\x1b[1;33m" - }; - ("LightBlue") => { - "\x1b[1;34m" - }; - ("LightPurple") => { - "\x1b[1;35m" - }; - ("LightCyan") => { - "\x1b[1;36m" - }; - ("White") => { - "\x1b[1;37m" - }; - ("nc") => { - "\x1b[0m" - }; - ("ClearScreen") => { - "\x1bc" - }; - ($unknown:tt) => { - compile_error!(concat!( - "Unknown color name: '", - $unknown, - "'. Valid options are: \ - Black, Red, Green, Orange, Blue, Purple, Cyan, LightGray, \ - DarkGray, LightRed, LightGreen, Yellow, LightBlue, \ - LightPurple, LightCyan, White, nc, ClearScreen" - )) - }; -} diff --git a/crates/libmwemu/src/emu/utils/mod.rs b/crates/libmwemu/src/emu/utils/mod.rs deleted file mode 100644 index d286ab6d..00000000 --- a/crates/libmwemu/src/emu/utils/mod.rs +++ /dev/null @@ -1,84 +0,0 @@ -use std::sync::atomic::{AtomicBool, Ordering}; - -static COLOR_ENABLED: AtomicBool = AtomicBool::new(true); - -pub fn disable_color() { - COLOR_ENABLED.store(false, Ordering::Relaxed); -} - -pub fn enable_color() { - COLOR_ENABLED.store(true, Ordering::Relaxed); -} - -#[inline] -fn color_enabled() -> bool { - COLOR_ENABLED.load(Ordering::Relaxed) -} - -#[macro_export] -macro_rules! color { - ("Black") => { - if $crate::color_enabled() { "\x1b[0;30m" } else { "" } - }; - ("Red") => { - if $crate::color_enabled() { "\x1b[0;31m" } else { "" } - }; - ("Green") => { - if $crate::color_enabled() { "\x1b[0;32m" } else { "" } - }; - ("Orange") => { - if $crate::color_enabled() { "\x1b[0;33m" } else { "" } - }; - ("Blue") => { - if $crate::color_enabled() { "\x1b[0;34m" } else { "" } - }; - ("Purple") => { - if $crate::color_enabled() { "\x1b[0;35m" } else { "" } - }; - ("Cyan") => { - if $crate::color_enabled() { "\x1b[0;36m" } else { "" } - }; - ("LightGray") => { - if $crate::color_enabled() { "\x1b[0;37m" } else { "" } - }; - ("DarkGray") => { - if $crate::color_enabled() { "\x1b[1;30m" } else { "" } - }; - ("LightRed") => { - if $crate::color_enabled() { "\x1b[1;31m" } else { "" } - }; - ("LightGreen") => { - if $crate::color_enabled() { "\x1b[1;32m" } else { "" } - }; - ("Yellow") => { - if $crate::color_enabled() { "\x1b[1;33m" } else { "" } - }; - ("LightBlue") => { - if $crate::color_enabled() { "\x1b[1;34m" } else { "" } - }; - ("LightPurple") => { - if $crate::color_enabled() { "\x1b[1;35m" } else { "" } - }; - ("LightCyan") => { - if $crate::color_enabled() { "\x1b[1;36m" } else { "" } - }; - ("White") => { - if $crate::color_enabled() { "\x1b[1;37m" } else { "" } - }; - ("nc") => { - if $crate::color_enabled() { "\x1b[0m" } else { "" } - }; - ("ClearScreen") => { - if $crate::color_enabled() { "\x1bc" } else { "" } - }; - ($unknown:tt) => { - compile_error!(concat!( - "Unknown color name: '", - $unknown, - "'. Valid options are: \ - Black, Red, Green, Orange, Blue, Purple, Cyan, LightGray, \ - DarkGray, LightRed, LightGreen, Yellow, LightBlue, \ - LightPurple, LightCyan, White, nc, ClearScreen" - )) - }; -} \ No newline at end of file diff --git a/crates/libmwemu/src/lib.rs b/crates/libmwemu/src/lib.rs index 9f2bdab5..b0b9b04c 100644 --- a/crates/libmwemu/src/lib.rs +++ b/crates/libmwemu/src/lib.rs @@ -42,10 +42,12 @@ pub mod threading; pub mod tracing; pub mod winapi; +// re-export the helper so the macro can reach it +pub use utils::color_enabled; + #[cfg(test)] mod tests; mod utils; - use config::Config; use emu::Emu; diff --git a/crates/libmwemu/src/utils.rs b/crates/libmwemu/src/utils.rs index 34f21d88..206ebd5f 100644 --- a/crates/libmwemu/src/utils.rs +++ b/crates/libmwemu/src/utils.rs @@ -1,3 +1,7 @@ +use std::sync::atomic::{AtomicBool, Ordering}; + +static COLOR_ENABLED: AtomicBool = AtomicBool::new(true); + // TODO: remove the code when 'likely' and 'unlikely' are stable #[inline(always)] #[cold] @@ -21,4 +25,85 @@ pub(crate) fn unlikely(b: bool) -> bool { } else { false } +} + +pub fn disable_color() { + COLOR_ENABLED.store(false, Ordering::Relaxed); +} + +pub fn enable_color() { + COLOR_ENABLED.store(true, Ordering::Relaxed); +} + +#[inline] +pub fn color_enabled() -> bool { + COLOR_ENABLED.load(Ordering::Relaxed) +} + +#[macro_export] +macro_rules! color { + ("Black") => { + if $crate::color_enabled() { "\x1b[0;30m" } else { "" } + }; + ("Red") => { + if $crate::color_enabled() { "\x1b[0;31m" } else { "" } + }; + ("Green") => { + if $crate::color_enabled() { "\x1b[0;32m" } else { "" } + }; + ("Orange") => { + if $crate::color_enabled() { "\x1b[0;33m" } else { "" } + }; + ("Blue") => { + if $crate::color_enabled() { "\x1b[0;34m" } else { "" } + }; + ("Purple") => { + if $crate::color_enabled() { "\x1b[0;35m" } else { "" } + }; + ("Cyan") => { + if $crate::color_enabled() { "\x1b[0;36m" } else { "" } + }; + ("LightGray") => { + if $crate::color_enabled() { "\x1b[0;37m" } else { "" } + }; + ("DarkGray") => { + if $crate::color_enabled() { "\x1b[1;30m" } else { "" } + }; + ("LightRed") => { + if $crate::color_enabled() { "\x1b[1;31m" } else { "" } + }; + ("LightGreen") => { + if $crate::color_enabled() { "\x1b[1;32m" } else { "" } + }; + ("Yellow") => { + if $crate::color_enabled() { "\x1b[1;33m" } else { "" } + }; + ("LightBlue") => { + if $crate::color_enabled() { "\x1b[1;34m" } else { "" } + }; + ("LightPurple") => { + if $crate::color_enabled() { "\x1b[1;35m" } else { "" } + }; + ("LightCyan") => { + if $crate::color_enabled() { "\x1b[1;36m" } else { "" } + }; + ("White") => { + if $crate::color_enabled() { "\x1b[1;37m" } else { "" } + }; + ("nc") => { + if $crate::color_enabled() { "\x1b[0m" } else { "" } + }; + ("ClearScreen") => { + if $crate::color_enabled() { "\x1bc" } else { "" } + }; + ($unknown:tt) => { + compile_error!(concat!( + "Unknown color name: '", + $unknown, + "'. Valid options are: \ + Black, Red, Green, Orange, Blue, Purple, Cyan, LightGray, \ + DarkGray, LightRed, LightGreen, Yellow, LightBlue, \ + LightPurple, LightCyan, White, nc, ClearScreen" + )) + }; } \ No newline at end of file