From 0881e46a1706df6c4df5eba5bef039cba31b56c4 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:34:52 -0700 Subject: [PATCH] Add obfuscated logger. --- unshell-breakout-module/Cargo.lock | 218 ++++++++++++++++- unshell-cli/Cargo.lock | 218 ++++++++++++++++- unshell-lib/Cargo.lock | 218 ++++++++++++++++- unshell-lib/Cargo.toml | 2 +- unshell-lib/src/client/client_runtime.rs | 3 +- unshell-lib/src/client/mod.rs | 2 +- unshell-lib/src/lib.rs | 5 +- unshell-lib/src/logger/macros.rs | 95 ++++++++ unshell-lib/src/logger/mod.rs | 69 ++++++ unshell-lib/src/logger/pretty_logger.rs | 41 ++++ unshell-lib/src/module/logger.rs | 16 -- unshell-lib/src/module/manager.rs | 6 +- unshell-lib/src/module/mod.rs | 3 +- unshell-lib/src/module/module.rs | 11 +- unshell-lib/src/server/server_runtime.rs | 6 +- unshell-obfuscate/Cargo.lock | 1 + unshell-obfuscate/Cargo.toml | 1 + unshell-obfuscate/src/encrypt.rs | 9 +- unshell-obfuscate/src/format_helper.rs | 97 ++++++++ unshell-obfuscate/src/lib.rs | 112 ++++++++- unshell-payload/Cargo.lock | 290 +++++++++++++++++------ unshell-payload/Cargo.toml | 7 +- unshell-payload/src/main.rs | 13 +- 23 files changed, 1313 insertions(+), 130 deletions(-) create mode 100644 unshell-lib/src/logger/macros.rs create mode 100644 unshell-lib/src/logger/mod.rs create mode 100644 unshell-lib/src/logger/pretty_logger.rs delete mode 100644 unshell-lib/src/module/logger.rs create mode 100644 unshell-obfuscate/src/format_helper.rs diff --git a/unshell-breakout-module/Cargo.lock b/unshell-breakout-module/Cargo.lock index c2aa52a..a8887e6 100644 --- a/unshell-breakout-module/Cargo.lock +++ b/unshell-breakout-module/Cargo.lock @@ -13,6 +13,21 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "bincode" version = "2.0.1" @@ -60,6 +75,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "cbc" version = "0.1.2" @@ -69,12 +90,35 @@ dependencies = [ "cipher", ] +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -85,6 +129,12 @@ dependencies = [ "inout", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -114,6 +164,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "generic-array" version = "0.14.9" @@ -157,6 +213,30 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "inout" version = "0.1.4" @@ -167,6 +247,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.177" @@ -189,6 +279,21 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "proc-macro2" version = "1.0.103" @@ -213,6 +318,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -253,6 +364,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" version = "2.0.109" @@ -289,8 +406,8 @@ name = "unshell-lib" version = "0.1.0" dependencies = [ "bincode", + "chrono", "libloading", - "log", "unshell-obfuscate", ] @@ -304,6 +421,7 @@ dependencies = [ "getrandom", "hex", "hex-literal", + "proc-macro2", "quote", "sha2", "syn", @@ -336,12 +454,110 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/unshell-cli/Cargo.lock b/unshell-cli/Cargo.lock index 2c78934..f5062ff 100644 --- a/unshell-cli/Cargo.lock +++ b/unshell-cli/Cargo.lock @@ -13,6 +13,21 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "bincode" version = "2.0.1" @@ -60,6 +75,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "cbc" version = "0.1.2" @@ -69,12 +90,35 @@ dependencies = [ "cipher", ] +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -85,6 +129,12 @@ dependencies = [ "inout", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -114,6 +164,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "generic-array" version = "0.14.9" @@ -157,6 +213,30 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "inout" version = "0.1.4" @@ -167,6 +247,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.177" @@ -189,6 +279,21 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "proc-macro2" version = "1.0.103" @@ -213,6 +318,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -253,6 +364,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" version = "2.0.109" @@ -288,8 +405,8 @@ name = "unshell-lib" version = "0.1.0" dependencies = [ "bincode", + "chrono", "libloading", - "log", "unshell-obfuscate", ] @@ -303,6 +420,7 @@ dependencies = [ "getrandom", "hex", "hex-literal", + "proc-macro2", "quote", "sha2", "syn", @@ -335,12 +453,110 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/unshell-lib/Cargo.lock b/unshell-lib/Cargo.lock index b801af5..64a0002 100644 --- a/unshell-lib/Cargo.lock +++ b/unshell-lib/Cargo.lock @@ -13,6 +13,21 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "bincode" version = "2.0.1" @@ -60,6 +75,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "cbc" version = "0.1.2" @@ -69,12 +90,35 @@ dependencies = [ "cipher", ] +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -85,6 +129,12 @@ dependencies = [ "inout", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -114,6 +164,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "generic-array" version = "0.14.9" @@ -157,6 +213,30 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "inout" version = "0.1.4" @@ -167,6 +247,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.177" @@ -189,6 +279,21 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "proc-macro2" version = "1.0.103" @@ -213,6 +318,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -253,6 +364,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" version = "2.0.109" @@ -281,8 +398,8 @@ name = "unshell-lib" version = "0.1.0" dependencies = [ "bincode", + "chrono", "libloading", - "log", "unshell-obfuscate", ] @@ -296,6 +413,7 @@ dependencies = [ "getrandom", "hex", "hex-literal", + "proc-macro2", "quote", "sha2", "syn", @@ -328,12 +446,110 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/unshell-lib/Cargo.toml b/unshell-lib/Cargo.toml index ac1f59d..adcfb5f 100644 --- a/unshell-lib/Cargo.toml +++ b/unshell-lib/Cargo.toml @@ -6,5 +6,5 @@ edition = "2024" [dependencies] libloading = {version = "0.8.9"} bincode = "2.0.1" -log = "0.4.28" unshell-obfuscate = {path = "../unshell-obfuscate"} +chrono = "0.4.42" diff --git a/unshell-lib/src/client/client_runtime.rs b/unshell-lib/src/client/client_runtime.rs index 06341e5..8ccc4bc 100644 --- a/unshell-lib/src/client/client_runtime.rs +++ b/unshell-lib/src/client/client_runtime.rs @@ -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) } } } diff --git a/unshell-lib/src/client/mod.rs b/unshell-lib/src/client/mod.rs index 1eeea46..966ab87 100644 --- a/unshell-lib/src/client/mod.rs +++ b/unshell-lib/src/client/mod.rs @@ -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, }; diff --git a/unshell-lib/src/lib.rs b/unshell-lib/src/lib.rs index 3c047ee..e033ec6 100644 --- a/unshell-lib/src/lib.rs +++ b/unshell-lib/src/lib.rs @@ -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), } diff --git a/unshell-lib/src/logger/macros.rs b/unshell-lib/src/logger/macros.rs new file mode 100644 index 0000000..011c91d --- /dev/null +++ b/unshell-lib/src/logger/macros.rs @@ -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 + ); + }}; +} diff --git a/unshell-lib/src/logger/mod.rs b/unshell-lib/src/logger/mod.rs new file mode 100644 index 0000000..7785d71 --- /dev/null +++ b/unshell-lib/src/logger/mod.rs @@ -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) { + 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); +} diff --git a/unshell-lib/src/logger/pretty_logger.rs b/unshell-lib/src/logger/pretty_logger.rs new file mode 100644 index 0000000..05cf7e6 --- /dev/null +++ b/unshell-lib/src/logger/pretty_logger.rs @@ -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 = 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)); + } +} diff --git a/unshell-lib/src/module/logger.rs b/unshell-lib/src/module/logger.rs deleted file mode 100644 index acb2b04..0000000 --- a/unshell-lib/src/module/logger.rs +++ /dev/null @@ -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) -} diff --git a/unshell-lib/src/module/manager.rs b/unshell-lib/src/module/manager.rs index a4dded2..2fd7420 100644 --- a/unshell-lib/src/module/manager.rs +++ b/unshell-lib/src/module/manager.rs @@ -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); } diff --git a/unshell-lib/src/module/mod.rs b/unshell-lib/src/module/mod.rs index e2ff5d5..42597de 100644 --- a/unshell-lib/src/module/mod.rs +++ b/unshell-lib/src/module/mod.rs @@ -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; diff --git a/unshell-lib/src/module/module.rs b/unshell-lib/src/module/module.rs index 0b8af76..ef40258 100644 --- a/unshell-lib/src/module/module.rs +++ b/unshell-lib/src/module/module.rs @@ -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 { 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::(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"); } diff --git a/unshell-lib/src/server/server_runtime.rs b/unshell-lib/src/server/server_runtime.rs index ebef55b..49e09e0 100644 --- a/unshell-lib/src/server/server_runtime.rs +++ b/unshell-lib/src/server/server_runtime.rs @@ -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())); diff --git a/unshell-obfuscate/Cargo.lock b/unshell-obfuscate/Cargo.lock index 99d24cd..177d78b 100644 --- a/unshell-obfuscate/Cargo.lock +++ b/unshell-obfuscate/Cargo.lock @@ -221,6 +221,7 @@ dependencies = [ "getrandom", "hex", "hex-literal", + "proc-macro2", "quote", "sha2", "syn", diff --git a/unshell-obfuscate/Cargo.toml b/unshell-obfuscate/Cargo.toml index 7b1ba53..0d1a516 100644 --- a/unshell-obfuscate/Cargo.toml +++ b/unshell-obfuscate/Cargo.toml @@ -20,3 +20,4 @@ hex-literal = "1.1.0" quote = "1.0.42" sha2 = "0.10.9" syn = {version = "2.0.109", features = ["full"]} +proc-macro2 = "1.0.103" diff --git a/unshell-obfuscate/src/encrypt.rs b/unshell-obfuscate/src/encrypt.rs index 3f298af..cf7483e 100644 --- a/unshell-obfuscate/src/encrypt.rs +++ b/unshell-obfuscate/src/encrypt.rs @@ -19,6 +19,11 @@ const STATIC_IV: [u8; 16] = [ 0x6d, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x69, 0x76, 0x5f, 0x30, 0x31, 0x32, ]; +fn pkcs7_padded_length(input_len: usize) -> usize { + let block_size = 16; + ((input_len / block_size) + 1) * block_size +} + pub fn get_obfuscated_symbol_name(input: &str) -> String { // 1. Get the key from the environment // let key_str = @@ -36,7 +41,9 @@ pub fn get_obfuscated_symbol_name(input: &str) -> String { let mut plaintext = input.to_string(); let plaintext = unsafe { plaintext.as_bytes_mut() }; - let mut buf = [0u8; 48]; + let buf_len = pkcs7_padded_length(plaintext.len()); + let mut buf: Vec = vec![0; buf_len]; + buf[..plaintext.len()].copy_from_slice(plaintext); let ciphertext = cipher .encrypt_padded_mut::(&mut buf, plaintext.len()) diff --git a/unshell-obfuscate/src/format_helper.rs b/unshell-obfuscate/src/format_helper.rs new file mode 100644 index 0000000..54279ad --- /dev/null +++ b/unshell-obfuscate/src/format_helper.rs @@ -0,0 +1,97 @@ +use syn::parse::{Parse, ParseStream}; +use syn::{Expr, Lit, Token}; + +pub struct PrintlnArgs { + pub format_str: String, + pub args: Vec, +} + +impl Parse for PrintlnArgs { + fn parse(input: ParseStream) -> syn::Result { + let format_expr: Expr = input.parse()?; + + let format_str = match format_expr { + Expr::Lit(ref lit) => { + if let Lit::Str(ref s) = lit.lit { + s.value() + } else { + return Err(syn::Error::new_spanned(lit, "Expected string literal")); + } + } + _ => { + return Err(syn::Error::new_spanned( + format_expr, + "Expected string literal", + )); + } + }; + + let mut args = Vec::new(); + while !input.is_empty() { + input.parse::()?; + if input.is_empty() { + break; + } + args.push(input.parse()?); + } + + Ok(PrintlnArgs { format_str, args }) + } +} + +#[derive(Debug)] +pub enum FormatSegment { + Static(String), + Dynamic(String, usize), // format spec, arg index +} + +pub fn parse_format_string(fmt: &str) -> Vec { + let mut segments = Vec::new(); + let mut current_static = String::new(); + let mut chars = fmt.chars().peekable(); + let mut arg_idx = 0; + + while let Some(ch) = chars.next() { + if ch == '{' { + if chars.peek() == Some(&'{') { + chars.next(); + current_static.push('{'); + continue; + } + + // Save current static segment + if !current_static.is_empty() { + segments.push(FormatSegment::Static(current_static.clone())); + current_static.clear(); + } + + // Parse format spec + let mut spec = String::new(); + while let Some(&next_ch) = chars.peek() { + if next_ch == '}' { + chars.next(); + break; + } + spec.push(chars.next().unwrap()); + } + + segments.push(FormatSegment::Dynamic(spec, arg_idx)); + arg_idx += 1; + } else if ch == '}' { + if chars.peek() == Some(&'}') { + chars.next(); + current_static.push('}'); + } else { + current_static.push(ch); + } + } else { + current_static.push(ch); + } + } + + if !current_static.is_empty() { + segments.push(FormatSegment::Static(current_static)); + } + + segments +} diff --git a/unshell-obfuscate/src/lib.rs b/unshell-obfuscate/src/lib.rs index 6da9649..2d92088 100644 --- a/unshell-obfuscate/src/lib.rs +++ b/unshell-obfuscate/src/lib.rs @@ -1,14 +1,16 @@ #![feature(proc_macro_quote)] +#![feature(proc_macro_span)] use proc_macro::TokenStream; - use quote::quote; - -use syn::{ItemFn, parse_macro_input}; +use syn::{Expr, ItemFn, LitStr, parse_macro_input}; #[cfg(feature = "obfuscate")] mod encrypt; +mod format_helper; +use format_helper::*; + // Put all encrypt-related dependencies in a module, so they are easier to use with the feature flag #[cfg(feature = "obfuscate")] mod obs_deps { @@ -132,3 +134,107 @@ pub fn obs(input: TokenStream) -> TokenStream { TokenStream::from(obfuscated_expansion) } + +// #[proc_macro] +// pub fn file_literal(_input: TokenStream) -> TokenStream { +// // let input = input.into_iter().collect::>(); +// // if input.len() != 1 { +// // let msg = format!("expected exactly one input token, got {}", input.len()); +// // return quote! { compile_error!(#msg) }.into(); +// // } + +// let string = file!(); +// let lit_str = LitStr::new(string, proc_macro2::Span::call_site()); + +// // let string_lit = match LitStr::try_from(&input) { +// // // Error if the token is not a string literal +// // Err(e) => return e.to_compile_error(), +// // Ok(lit) => lit, +// // }; + +// (quote! { +// #lit_str +// }) +// .into() +// } + +#[proc_macro] +pub fn file_symbol(_input: TokenStream) -> TokenStream { + // Get the call site span to extract file information + let span = proc_macro::Span::call_site(); + let source_file = span.source(); + let file_path = source_file.file(); + let line_num = source_file.line(); + let concatted = format!("{}:{}", file_path, line_num); + + // Return as a string literal + let output = quote! { + unshell_obfuscate::symbol!(#concatted) + }; + // let output = quote! { + // #concatted + // }; + output.into() +} + +#[proc_macro] +pub fn format_obs(input: TokenStream) -> TokenStream { + let PrintlnArgs { format_str, args } = parse_macro_input!(input as PrintlnArgs); + + let segments = parse_format_string(&format_str); + + if segments.is_empty() { + return quote! { + print!("\n") + } + .into(); + } + + let mut parts = Vec::new(); + + for segment in segments { + match segment { + FormatSegment::Static(text) => { + parts.push(quote! { + unshell_obfuscate::symbol!(#text).to_string() + }); + } + FormatSegment::Dynamic(spec, idx) => { + if idx >= args.len() { + return syn::Error::new( + proc_macro2::Span::call_site(), + format!("argument {} is missing", idx), + ) + .to_compile_error() + .into(); + } + + let arg = &args[idx]; + let fmt_spec = if spec.is_empty() { + quote! { "{}" } + } else { + let full_spec = format!("{{{}}}", spec); + quote! { #full_spec } + }; + + // quote! { + // println!(#fmt_spec, #arg); + // } + parts.push(quote! { + format!(#fmt_spec, #arg) + }); + } + } + } + + (quote! { + { + let mut string = String::new(); + #( + string.push_str(&#parts); + )* + string + } + }) + .into() +} diff --git a/unshell-payload/Cargo.lock b/unshell-payload/Cargo.lock index 7d3c9c8..6b4e035 100644 --- a/unshell-payload/Cargo.lock +++ b/unshell-payload/Cargo.lock @@ -22,6 +22,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.21" @@ -58,7 +67,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.60.2", + "windows-sys", ] [[package]] @@ -69,9 +78,15 @@ checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys", ] +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "bincode" version = "2.0.1" @@ -119,6 +134,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "cbc" version = "0.1.2" @@ -128,12 +149,35 @@ dependencies = [ "cipher", ] +[[package]] +name = "cc" +version = "1.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -150,6 +194,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -189,19 +239,6 @@ dependencies = [ "regex", ] -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.11.8" @@ -215,6 +252,12 @@ dependencies = [ "log", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "generic-array" version = "0.14.9" @@ -237,12 +280,6 @@ dependencies = [ "wasip2", ] -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -255,12 +292,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1" -[[package]] -name = "humantime" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" - [[package]] name = "hybrid-array" version = "0.4.5" @@ -270,6 +301,30 @@ dependencies = [ "typenum", ] +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "inout" version = "0.1.4" @@ -280,17 +335,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -321,6 +365,16 @@ dependencies = [ "syn", ] +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.177" @@ -349,6 +403,21 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "once_cell_polyfill" version = "1.70.2" @@ -370,16 +439,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "pretty_env_logger" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" -dependencies = [ - "env_logger 0.10.2", - "log", -] - [[package]] name = "proc-macro2" version = "1.0.103" @@ -433,6 +492,12 @@ version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "serde" version = "1.0.228" @@ -473,6 +538,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "syn" version = "2.0.109" @@ -484,15 +555,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "typenum" version = "1.19.0" @@ -510,8 +572,8 @@ name = "unshell-lib" version = "0.1.0" dependencies = [ "bincode", + "chrono", "libloading", - "log", "unshell-obfuscate", ] @@ -525,6 +587,7 @@ dependencies = [ "getrandom", "hex", "hex-literal", + "proc-macro2", "quote", "sha2", "syn", @@ -534,10 +597,9 @@ dependencies = [ name = "unshell-payload" version = "0.1.0" dependencies = [ - "env_logger 0.11.8", + "env_logger", "libloading", - "log", - "pretty_env_logger", + "proc-macro2", "unshell-lib", "unshell-obfuscate", ] @@ -576,12 +638,83 @@ dependencies = [ ] [[package]] -name = "winapi-util" -version = "0.1.11" +name = "wasm-bindgen" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ - "windows-sys 0.61.2", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -590,6 +723,24 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -599,15 +750,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-targets" version = "0.53.5" diff --git a/unshell-payload/Cargo.toml b/unshell-payload/Cargo.toml index 0c417da..9ff3124 100644 --- a/unshell-payload/Cargo.toml +++ b/unshell-payload/Cargo.toml @@ -1,4 +1,4 @@ -# cargo-features = ["trim-paths"] +cargo-features = ["trim-paths"] [package] name = "unshell-payload" @@ -11,8 +11,7 @@ obfuscate = ["unshell-obfuscate/obfuscate"] [dependencies] env_logger = "0.11.8" libloading = "0.8.9" -log = "0.4.28" -pretty_env_logger = "0.5.0" +proc-macro2 = "1.0.103" # unshell-logger = {path = "../unshell-logger"} unshell-lib = {path = "../unshell-lib"} unshell-obfuscate = {path = "../unshell-obfuscate"} @@ -24,5 +23,5 @@ lto = true # Link tree optimization codegen-units = 1 panic = "abort" debug = false # Remove debug -# trim-paths="all" +trim-paths="all" # panic=immediate-abort diff --git a/unshell-payload/src/main.rs b/unshell-payload/src/main.rs index 69583e5..c2591ef 100644 --- a/unshell-payload/src/main.rs +++ b/unshell-payload/src/main.rs @@ -3,20 +3,15 @@ use unshell_lib::{ module::{Manager, Module}, }; -use unshell_obfuscate::obs; - #[macro_use] -extern crate log; +extern crate unshell_lib; fn main() { - // Init the logger (This uses like 600MB of storage) - pretty_env_logger::init(); + // #[cfg(not(feature = "obfuscate"))] + unshell_lib::logger::PrettyLogger::init(); info!("Initialized"); - let s = obs!("Obvias string"); - info!("{}", s); - match || -> Result<(), ModuleError> { let args = std::env::args(); @@ -31,7 +26,7 @@ fn main() { }() { Ok(_) => {} Err(e) => { - error!("ERROR! {:?}", e); + info!("ERROR! {:?}", e); } } }