myph-v2~ rust shellcode loader with evasive capabilities |
| git clone https://github.com/djnnvx/myph-v2.git |
| log | files | refs | archive | README |
cargo_config.rs (7323B)
1 #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] 2 pub enum BuildProfile { 3 #[default] 4 Standard, 5 LowResource, 6 } 7 8 impl BuildProfile { 9 pub fn lto_setting(&self) -> &'static str { 10 match self { 11 BuildProfile::Standard => "true", 12 BuildProfile::LowResource => "\"thin\"", 13 } 14 } 15 16 pub fn codegen_units(&self) -> u32 { 17 match self { 18 BuildProfile::Standard => 1, 19 BuildProfile::LowResource => 16, 20 } 21 } 22 23 pub fn opt_level(&self) -> &'static str { 24 match self { 25 BuildProfile::Standard => "\"z\"", 26 BuildProfile::LowResource => "\"s\"", 27 } 28 } 29 30 pub fn parallel_jobs(&self) -> Option<u32> { 31 match self { 32 BuildProfile::Standard => None, 33 BuildProfile::LowResource => Some(2), 34 } 35 } 36 } 37 38 pub trait CargoConfigGenerator { 39 fn generate_cargo_toml(&self, project_name: &str, dependencies: &str) -> String; 40 fn generate_cargo_config(&self) -> String; 41 } 42 43 pub struct ExeGenerator { 44 profile: BuildProfile, 45 } 46 47 impl ExeGenerator { 48 pub fn new(profile: BuildProfile) -> Self { 49 Self { profile } 50 } 51 } 52 53 impl CargoConfigGenerator for ExeGenerator { 54 fn generate_cargo_toml(&self, project_name: &str, dependencies: &str) -> String { 55 format!( 56 r#"[package] 57 name = "{project_name}" 58 version = "0.1.0" 59 edition = "2021" 60 61 [dependencies]{dependencies} 62 63 [profile.release] 64 strip = true 65 opt-level = {opt_level} 66 lto = {lto} 67 codegen-units = {codegen_units} 68 "#, 69 project_name = project_name, 70 dependencies = dependencies, 71 opt_level = self.profile.opt_level(), 72 lto = self.profile.lto_setting(), 73 codegen_units = self.profile.codegen_units(), 74 ) 75 } 76 77 fn generate_cargo_config(&self) -> String { 78 match self.profile.parallel_jobs() { 79 Some(jobs) => format!( 80 r#"[build] 81 target = "x86_64-pc-windows-gnu" 82 jobs = {jobs} 83 "# 84 ), 85 None => r#"[build] 86 target = "x86_64-pc-windows-gnu" 87 "# 88 .to_string(), 89 } 90 } 91 } 92 93 pub struct DllGenerator { 94 profile: BuildProfile, 95 } 96 97 impl DllGenerator { 98 pub fn new(profile: BuildProfile) -> Self { 99 Self { profile } 100 } 101 } 102 103 impl CargoConfigGenerator for DllGenerator { 104 fn generate_cargo_toml(&self, project_name: &str, dependencies: &str) -> String { 105 format!( 106 r#"[package] 107 name = "{project_name}" 108 version = "0.1.0" 109 edition = "2021" 110 111 [lib] 112 crate-type = ["cdylib"] 113 114 [dependencies]{dependencies} 115 116 [profile.release] 117 strip = true 118 opt-level = {opt_level} 119 lto = {lto} 120 codegen-units = {codegen_units} 121 "#, 122 project_name = project_name, 123 dependencies = dependencies, 124 opt_level = self.profile.opt_level(), 125 lto = self.profile.lto_setting(), 126 codegen_units = self.profile.codegen_units(), 127 ) 128 } 129 130 fn generate_cargo_config(&self) -> String { 131 match self.profile.parallel_jobs() { 132 Some(jobs) => format!( 133 r#"[build] 134 target = "x86_64-pc-windows-gnu" 135 jobs = {jobs} 136 "# 137 ), 138 None => r#"[build] 139 target = "x86_64-pc-windows-gnu" 140 "# 141 .to_string(), 142 } 143 } 144 } 145 146 pub fn generate_cargo_toml_exe(project_name: &str, dependencies: &str) -> String { 147 ExeGenerator::new(BuildProfile::Standard).generate_cargo_toml(project_name, dependencies) 148 } 149 150 pub fn generate_cargo_toml_dll(project_name: &str, dependencies: &str) -> String { 151 DllGenerator::new(BuildProfile::Standard).generate_cargo_toml(project_name, dependencies) 152 } 153 154 pub fn generate_cargo_config() -> &'static str { 155 r#"[build] 156 target = "x86_64-pc-windows-gnu" 157 "# 158 } 159 160 #[cfg(test)] 161 mod tests { 162 use super::*; 163 164 #[test] 165 fn standard_profile_uses_full_lto() { 166 let profile = BuildProfile::Standard; 167 assert_eq!(profile.lto_setting(), "true"); 168 } 169 170 #[test] 171 fn standard_profile_uses_single_codegen_unit() { 172 let profile = BuildProfile::Standard; 173 assert_eq!(profile.codegen_units(), 1); 174 } 175 176 #[test] 177 fn standard_profile_uses_size_optimization() { 178 let profile = BuildProfile::Standard; 179 assert_eq!(profile.opt_level(), "\"z\""); 180 } 181 182 #[test] 183 fn standard_profile_has_no_job_limit() { 184 let profile = BuildProfile::Standard; 185 assert_eq!(profile.parallel_jobs(), None); 186 } 187 188 #[test] 189 fn low_resource_profile_uses_thin_lto() { 190 let profile = BuildProfile::LowResource; 191 assert_eq!(profile.lto_setting(), "\"thin\""); 192 } 193 194 #[test] 195 fn low_resource_profile_uses_multiple_codegen_units() { 196 let profile = BuildProfile::LowResource; 197 assert_eq!(profile.codegen_units(), 16); 198 } 199 200 #[test] 201 fn low_resource_profile_uses_moderate_optimization() { 202 let profile = BuildProfile::LowResource; 203 assert_eq!(profile.opt_level(), "\"s\""); 204 } 205 206 #[test] 207 fn low_resource_profile_limits_parallel_jobs() { 208 let profile = BuildProfile::LowResource; 209 assert_eq!(profile.parallel_jobs(), Some(2)); 210 } 211 212 #[test] 213 fn exe_generator_includes_profile_settings() { 214 let generator = ExeGenerator::new(BuildProfile::Standard); 215 let toml = generator.generate_cargo_toml("test_project", ""); 216 217 assert!(toml.contains("lto = true")); 218 assert!(toml.contains("codegen-units = 1")); 219 assert!(toml.contains("opt-level = \"z\"")); 220 } 221 222 #[test] 223 fn exe_generator_low_resource_includes_adjusted_settings() { 224 let generator = ExeGenerator::new(BuildProfile::LowResource); 225 let toml = generator.generate_cargo_toml("test_project", ""); 226 227 assert!(toml.contains("lto = \"thin\"")); 228 assert!(toml.contains("codegen-units = 16")); 229 assert!(toml.contains("opt-level = \"s\"")); 230 } 231 232 #[test] 233 fn dll_generator_includes_cdylib_crate_type() { 234 let generator = DllGenerator::new(BuildProfile::Standard); 235 let toml = generator.generate_cargo_toml("test_dll", ""); 236 237 assert!(toml.contains("crate-type = [\"cdylib\"]")); 238 } 239 240 #[test] 241 fn dll_generator_low_resource_includes_adjusted_settings() { 242 let generator = DllGenerator::new(BuildProfile::LowResource); 243 let toml = generator.generate_cargo_toml("test_dll", ""); 244 245 assert!(toml.contains("lto = \"thin\"")); 246 assert!(toml.contains("codegen-units = 16")); 247 } 248 249 #[test] 250 fn cargo_config_standard_has_no_jobs_limit() { 251 let generator = ExeGenerator::new(BuildProfile::Standard); 252 let config = generator.generate_cargo_config(); 253 254 assert!(config.contains("target = \"x86_64-pc-windows-gnu\"")); 255 assert!(!config.contains("jobs")); 256 } 257 258 #[test] 259 fn cargo_config_low_resource_has_jobs_limit() { 260 let generator = ExeGenerator::new(BuildProfile::LowResource); 261 let config = generator.generate_cargo_config(); 262 263 assert!(config.contains("target = \"x86_64-pc-windows-gnu\"")); 264 assert!(config.contains("jobs = 2")); 265 } 266 267 #[test] 268 fn legacy_functions_use_standard_profile() { 269 let toml = generate_cargo_toml_exe("legacy_test", ""); 270 assert!(toml.contains("lto = true")); 271 assert!(toml.contains("codegen-units = 1")); 272 } 273 }