|
| 1 | +use std::fs; |
| 2 | + |
| 3 | +fn main() { |
| 4 | + let args: Vec<String> = std::env::args().collect(); |
| 5 | + let path = if args.len() > 1 { &args[1] } else { "Cargo.toml" }; |
| 6 | + let data = fs::read(path).expect("Failed to read file"); |
| 7 | + |
| 8 | + println!("File: {} ({} bytes)", path, data.len()); |
| 9 | + let (entropy, _) = cryptotrace::core::entropy::shannon_entropy(&data); |
| 10 | + println!("Global Shannon entropy: {:.2} bits/byte", entropy); |
| 11 | + |
| 12 | + let sw = cryptotrace::core::sliding_entropy::sliding_window_entropy(&data, Some(4096), None, Some(7.5)); |
| 13 | + |
| 14 | + if sw.window_scores.is_empty() { |
| 15 | + println!("File too small for any window"); |
| 16 | + return; |
| 17 | + } |
| 18 | + |
| 19 | + let avg: f64 = sw.window_scores.iter().sum::<f64>() / sw.window_scores.len() as f64; |
| 20 | + let max_score = sw.window_scores.iter().cloned().fold(f64::NEG_INFINITY, f64::max); |
| 21 | + let min_score = sw.window_scores.iter().cloned().fold(f64::INFINITY, f64::min); |
| 22 | + |
| 23 | + println!("Windows analyzed: {}", sw.window_scores.len()); |
| 24 | + println!("Avg window entropy: {:.2}", avg); |
| 25 | + println!("Max window entropy: {:.2}", max_score); |
| 26 | + println!("Min window entropy: {:.2}", min_score); |
| 27 | + println!("Max window entropy (struct): {:.2}", sw.max_window_entropy); |
| 28 | + println!("Entropy variance: {:.2}", sw.entropy_variance); |
| 29 | + |
| 30 | + let hot_count = sw.window_scores.iter().filter(|&&s| s > 7.5).count(); |
| 31 | + if hot_count > 0 { |
| 32 | + println!("\nHigh-entropy regions (>7.5 bits/byte):"); |
| 33 | + println!(" {} windows above threshold", hot_count); |
| 34 | + for region in sw.embedded_regions.iter().take(10) { |
| 35 | + println!(" offset {}-{}", region.start, region.end); |
| 36 | + } |
| 37 | + if sw.embedded_regions.len() > 10 { |
| 38 | + println!(" ... and {} more", sw.embedded_regions.len() - 10); |
| 39 | + } |
| 40 | + } |
| 41 | +} |
0 commit comments