خط الكشف
شرح مفصل لخط الكشف الرباعي المراحل في باطن.
نظرة عامة
كل تحليل ملف يمر عبر أربع مراحل:
كل مرحلة يمكنها:
- المساهمة في الكشف النهائي
- تعديل درجات الثقة
- تفعيل تغييرات مستوى التهديد
- التجاوز للكفاءة
المرحلة 1: مطابقة توقيعات البايتات السحرية
ما هي البايتات السحرية؟
البايتات السحرية هي تسلسلات بايت ثابتة في مواقع محددة تحدد صيغ الملفات:
| الصيغة | ال بايتات السحرية | الموقع |
|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | 0 |
25 50 44 46 (%PDF) | 0 | |
| ZIP | 50 4B 03 04 (PK..) | 0 |
| PE/EXE | 4D 5A (MZ) | 0 |
| MP4 | 66 74 79 70 (ftyp) | 4 |
الخوارزمية
fn match_signatures(&self, data: &[u8]) -> Vec<(usize, f64)> {
let mut matches = Vec::new();
for (idx, sig) in self.signatures.iter().enumerate() {
// التحقق من طول البيانات
if data.len() < sig.offset + sig.magic.len() {
continue;
}
// مقارنة البايتات السحرية في الموقع
let slice = &data[sig.offset..sig.offset + sig.magic.len()];
if slice == sig.magic {
// التحقق من التحقق الإضافي
let additional_match = sig.additional_magic
.map(|(offset, bytes)| {
data.len() >= offset + bytes.len() &&
&data[offset..offset + bytes.len()] == bytes
})
.unwrap_or(true);
if additional_match {
matches.push((idx, 0.9)); // 90% ثقة أساسية
}
}
}
matches
}
لماذا هذا النهج؟
المميزات:
- ✅ سريع: O(n×m) حيث n=التوقيعات، m=طول السحر
- ✅ موثوق: البايتات السحرية نادراً ما تتغير
- ✅ إيجابيات خاطئة منخفضة: أنماط بايت محددة
العيوب:
- ❌ يفقد الملفات بدون سحر (نص عادي)
- ❌ يمكن تزويره (إضافة رأس صالح)
- ❌ بعض الصيغ تشترك في البادئات
التخفيف: المراحل الأخرى تلتقط ما تفقده البايتات السحرية.
المرحلة 2: تحليل الإنتروبيا
لماذا الإنتروبيا؟
الإنتروبيا تقيس العشوائية. أنواع الملفات المختلفة لها إنتروبيا مميزة:
معادلة إنتروبيا شانون
H(X) = -Σ p(x) × log₂(p(x))
حيث:
- H(X) = الإنتروبيا بالبت لكل بايت
- p(x) = احتمال قيمة البايت x
- النطاق: 0.0 (كل نفس البايت) إلى 8.0 (عشوائي منتظم)
تنفيذ المرور الواحد
pub fn calculate_entropy_stats(data: &[u8]) -> EntropyStats {
// بناء توزيع التردد في مرور واحد
let mut frequency: [usize; 256] = [0; 256];
for &byte in data {
frequency[byte as usize] += 1;
}
let len = data.len() as f64;
let mut entropy = 0.0;
let mut chi_square = 0.0;
let expected = len / 256.0;
for &count in &frequency {
if count > 0 {
// إنتروبيا شانون
let p = count as f64 / len;
entropy -= p * p.log2();
// إحصائية كاي مربع
let diff = count as f64 - expected;
chi_square += (diff * diff) / expected;
}
}
EntropyStats {
frequency,
entropy,
chi_square,
}
}