myph-v2.git


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 }