Add obfuscated logger.

This commit is contained in:
Michael Mikovsky
2025-11-09 12:34:52 -07:00
parent 997b98491a
commit 0881e46a17
23 changed files with 1313 additions and 130 deletions
+2 -1
View File
@@ -8,6 +8,7 @@ use std::{
thread::{self, JoinHandle},
};
use crate::*;
// use unshell_modules::{Manager, ModuleRuntime};
use crate::{Announcement, ModuleRuntime, module::Manager};
@@ -51,7 +52,7 @@ impl RuntimeTest {
match a {
Announcement::TestAnnouncement(s) => {
info!("Received test announcement: {}", s)
println!("Received test announcement: {}", s)
}
}
}
+1 -1
View File
@@ -1,6 +1,5 @@
mod client_runtime;
// use crate::module::Interface;
use std::sync::{Arc, Mutex};
pub const MODULE_NAME: &'static str = "client";
@@ -15,6 +14,7 @@ use crate::{
client::client_runtime::RuntimeTest,
module::{Interface, Manager},
module_interface,
warn,
// module_interface,
};
+2 -3
View File
@@ -1,8 +1,7 @@
#![no_main]
#[macro_use]
extern crate log;
pub mod client;
pub mod logger;
pub mod module;
pub mod server;
@@ -17,7 +16,7 @@ use crate::module::{Interface, Manager};
#[derive(Debug)]
pub enum ModuleError {
LibLoadingError(libloading::Error),
LogError(log::SetLoggerError),
// LogError(log::SetLoggerError),
LinkError(String),
Error(String),
}
+95
View File
@@ -0,0 +1,95 @@
#[macro_export]
macro_rules! debug {
($fmt:tt) => {{
let log_result = unshell_obfuscate::format_obs!($fmt);
$crate::logger::add_record(
$crate::logger::LogLevel::Debug,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
($fmt:tt, $($arg:expr),*) => {{
let log_result = unshell_obfuscate::format_obs!($fmt, $($arg),*);
$crate::logger::add_record(
$crate::logger::LogLevel::Debug,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
}
#[macro_export]
macro_rules! info {
($fmt:tt) => {{
let log_result = unshell_obfuscate::format_obs!($fmt);
$crate::logger::add_record(
$crate::logger::LogLevel::Info,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
($fmt:tt, $($arg:expr),*) => {{
let log_result = unshell_obfuscate::format_obs!($fmt, $($arg),*);
$crate::logger::add_record(
$crate::logger::LogLevel::Info,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
}
#[macro_export]
macro_rules! warn {
($fmt:tt) => {{
let log_result = unshell_obfuscate::format_obs!($fmt);
$crate::logger::add_record(
$crate::logger::LogLevel::Warn,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
($fmt:tt, $($arg:expr),*) => {{
let log_result = unshell_obfuscate::format_obs!($fmt, $($arg),*);
$crate::logger::add_record(
$crate::logger::LogLevel::Warn,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
}
#[macro_export]
macro_rules! error {
($fmt:tt) => {{
let log_result = unshell_obfuscate::format_obs!($fmt);
$crate::logger::add_record(
$crate::logger::LogLevel::Error,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
($fmt:tt, $($arg:expr),*) => {{
let log_result = unshell_obfuscate::format_obs!($fmt, $($arg),*);
$crate::logger::add_record(
$crate::logger::LogLevel::Error,
String::from(unshell_obfuscate::file_symbol!()),
std::time::SystemTime::now(),
log_result
);
}};
}
+69
View File
@@ -0,0 +1,69 @@
pub mod macros;
mod pretty_logger;
use std::time::SystemTime;
pub use pretty_logger::PrettyLogger;
static mut LOGGER: &dyn Logger = &DefaultLogger;
#[derive(Debug)]
pub enum LogLevel {
Debug,
Info,
Warn,
Error,
}
#[derive(Debug)]
pub struct Record {
log_level: LogLevel,
location: String,
// line: u32,
time: SystemTime,
message: String,
}
pub trait Logger {
fn log(&self, log: Record);
}
struct DefaultLogger;
impl Logger for DefaultLogger {
fn log(&self, _: Record) {}
}
pub fn set_logger_box(logger: Box<dyn Logger>) {
unsafe {
LOGGER = Box::leak(logger);
}
}
pub fn set_logger(logger: &'static dyn Logger) {
unsafe {
LOGGER = logger;
}
}
pub fn add_record(log_level: LogLevel, location: String, time: SystemTime, message: String) {
logger().log(Record {
log_level,
location,
time,
message,
});
}
pub fn logger<'a>() -> &'static dyn Logger {
unsafe { LOGGER }
}
#[allow(dead_code, improper_ctypes_definitions)]
pub type SetupLogger = extern "C" fn(logger: &'static dyn Logger);
#[unsafe(no_mangle)]
#[allow(improper_ctypes_definitions)]
pub extern "C" fn setup_logger(logger: &'static dyn Logger) {
set_logger(logger);
}
+41
View File
@@ -0,0 +1,41 @@
use chrono::{DateTime, Utc};
use crate::logger::{LogLevel, Logger, Record};
pub struct PrettyLogger;
// static TRACE_COLOR: &str = "\x1b[34m";
static DEBUG_COLOR: &str = "\x1b[36m";
static INFO_COLOR: &str = "\x1b[32m";
static WARN_COLOR: &str = "\x1b[33m";
static ERROR_COLOR: &str = "\x1b[31m";
static WHITE: &str = "\x1b[97m";
static OFF_WHITE: &str = "\x1b[37m";
static TIME_COLOR: &str = "\x1b[36m";
static GREY: &str = "\x1b[90m";
impl Logger for PrettyLogger {
fn log(&self, message: Record) {
let log_level = match message.log_level {
LogLevel::Debug => format!("{DEBUG_COLOR}DEBUG"),
LogLevel::Info => format!("{INFO_COLOR}INFO"),
LogLevel::Warn => format!("{WARN_COLOR}WARN"),
LogLevel::Error => format!("{ERROR_COLOR}ERROR"),
};
let date: DateTime<Utc> = message.time.into();
let date = date.to_rfc2822().to_string();
println!(
"{OFF_WHITE}[{TIME_COLOR}{}{OFF_WHITE}] {} {WHITE}{} {GREY}{}{WHITE}",
date, log_level, message.message, message.location
);
}
}
impl PrettyLogger {
pub fn init() {
crate::logger::set_logger_box(Box::new(PrettyLogger));
}
}
-16
View File
@@ -1,16 +0,0 @@
#![allow(improper_ctypes_definitions)]
use log::{LevelFilter, Log, SetLoggerError};
#[allow(dead_code)]
pub type SetupLogger =
extern "C" fn(logger: &'static dyn Log, level: LevelFilter) -> Result<(), SetLoggerError>;
#[unsafe(no_mangle)]
pub extern "C" fn setup_logger(
logger: &'static dyn log::Log,
level: log::LevelFilter,
) -> Result<(), log::SetLoggerError> {
log::set_max_level(level);
log::set_logger(logger)
}
+4 -2
View File
@@ -7,7 +7,8 @@ use std::{
use unshell_obfuscate::symbol;
use crate::{Component, ModuleRuntime, module::Module};
use crate::*;
use module::Module;
// #[derive(Debug)]
pub struct Manager {
@@ -65,7 +66,8 @@ impl Manager {
let components = component_func();
info!("[{i}] Loaded {} components", components.len());
let len = components.len();
info!("[{}] Loaded {} components", i, len);
this.components.extend(components);
}
+1 -2
View File
@@ -1,10 +1,9 @@
mod logger;
mod manager;
mod module;
// use std::any::Any;
pub use logger::setup_logger;
// pub use logger::setup_logger;
pub use manager::Manager;
pub use module::Module;
+5 -6
View File
@@ -1,6 +1,8 @@
use libloading::{Library, Symbol};
use crate::{ModuleError, module::logger::SetupLogger};
use crate::{ModuleError, logger::SetupLogger, logger::logger};
use crate::*;
pub struct Module {
// name: String,
@@ -11,13 +13,10 @@ impl Module {
pub fn new(path: &str) -> Result<Self, ModuleError> {
let lib = unsafe { Library::new(&path) }.map_err(|e| ModuleError::LibLoadingError(e))?;
let this = Self {
// name: path.to_owned(),
lib,
};
let this = Self { lib };
if let Ok(setup_logger) = this.get_symbol::<SetupLogger>(b"setup_logger") {
setup_logger(log::logger(), log::max_level()).map_err(|e| ModuleError::LogError(e))?;
setup_logger(logger());
} else {
warn!("setup_logger not found");
}
+2 -4
View File
@@ -5,9 +5,7 @@ use std::{
thread::{self, JoinHandle},
};
use crate::ModuleRuntime;
use crate::Announcement;
use crate::*;
pub struct ListenerRuntime {
thread_handle: JoinHandle<()>,
@@ -19,7 +17,7 @@ pub struct ListenerRuntime {
impl ListenerRuntime {
pub fn new() -> ListenerRuntime {
info!("Starting listener runtime on 127.0.0.1:1234");
info!("Starting listener runtime on 127.0.0.1:1234",);
let listener = TcpListener::bind("127.0.0.1:1234").unwrap();
let streams = Arc::new(Mutex::new(Vec::new()));