إنتقل إلى المحتوى الرئيسي

تحليل الإنتروبيا

كيف يستخدم باطن نظرية المعلومات لكشف الملفات المضغوطة والمشفرة والمشبوهة.

ما هي الإنتروبيا؟

الإنتروبيا تقيس العشوائية أو "محتوى المعلومات" للبيانات. في الأمن السيبراني، تكشف خصائص الملفات غير المرئية لكشف التوقيعات.

معادلة إنتروبيا شانون

H(X) = -Σ p(xᵢ) × log₂(p(xᵢ))

حيث:

  • H(X) = الإنتروبيا بالبت لكل بايت (0.0 إلى 8.0)
  • p(xᵢ) = احتمال حدوث قيمة البايت i
  • log₂ = اللوغاريتم بالأساس 2

الفهم البديهي

الإنتروبياالمعنىمثال
0.0كل البايتات متطابقةAAAAAAAAAA
~4.5نص إنجليزيكود المصدر، المستندات
~6.0كود مترجمملفات تنفيذية عادية
~7.5بيانات مضغوطةZIP، JPEG، MP3
~8.0عشوائي تماماًمشفر، مضغوط

لماذا الإنتروبيا مهمة للأمان

الملفات التنفيذية المضغوطة

البرمجيات الخبيثة غالباً تكون "معبأة" لـ:

  • تجنب كشف التوقيعات
  • تقليل حجم الملف
  • إخفاء الكود

التعبئة تضغط الملف التنفيذي، مما يؤدي إلى إنتروبيا عالية.

المحتوى المشفر

فيروسات الفدية والحمولات المشفرة والمستندات المشفرة لها:

  • إنتروبيا عالية جداً (>7.8)
  • توزيع بايتات شبه منتظم

الضغط مقابل التشفير

كلاهما له إنتروبيا عالية، لكن:

الخاصيةمضغوطمشفر
الإنتروبيا7.0-7.87.8-8.0
كاي مربعأعلىمنخفض جداً
له رؤوسنعم (ZIP, GZIP)غالباً لا

اختبار كاي مربع يميز بينهما: البيانات المشفرة لها توزيع منتظم تقريباً مثالي.


التنفيذ

خوارزمية المرور الواحد

pub fn calculate_entropy_stats(data: &[u8]) -> EntropyStats {
if data.is_empty() {
return EntropyStats::default();
}

// الخطوة 1: بناء جدول التردد في مرور واحد
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; // العدد المتوقع للمنتظم

// الخطوة 2: حساب كلا المقياسين من جدول التردد
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 }
}

اختبار كاي مربع

الغرض

كاي مربع يقيس مقدار انحراف التوزيع المرصود عن المتوقع (المنتظم).

المعادلة

χ² = Σ (Oᵢ - Eᵢ)² / Eᵢ

حيث:

  • Oᵢ = العدد المرصود للبايت i
  • Eᵢ = العدد المتوقع (data.len() / 256)

التفسير

كاي مربعالتفسير
< 50منتظم جداً (مشفر)
50-150منتظم إلى حد ما (معبأ/مضغوط)
150-500تباين عادي (ثنائي)
> 500غير منتظم (نص، بيانات منظمة)

إنتروبيا النافذة المنزلقة

الغرض

الإنتروبيا العامة تفقد الشذوذات المحلية:

[بيانات عادية ......... كتلة مشفرة مخفية .... بيانات عادية]
^^^^^^^^^^^^^^^^^^^
الإنتروبيا العامة: 5.5 (تبدو عادية)
الإنتروبيا المحلية: 7.9 (مشبوهة!)

التنفيذ

pub fn sliding_window_entropy(data: &[u8], window_size: usize) -> Vec<f64> {
if data.len() < window_size {
return vec![calculate_shannon_entropy(data)];
}

let mut entropies = Vec::with_capacity(data.len() - window_size + 1);

for i in 0..=(data.len() - window_size) {
let window = &data[i..i + window_size];
entropies.push(calculate_shannon_entropy(window));
}

entropies
}

أمثلة واقعية

ملف تنفيذي عادي

الملف: notepad.exe
الإنتروبيا: 6.12 بت/بايت
كاي مربع: 342.5
معبأ: لا
مشفر: لا
→ مستوى التهديد: مشبوه (exe عادي)

برمجية خبيثة معبأة بـ UPX

الملف: malware_packed.exe
الإنتروبيا: 7.89 بت/بايت
كاي مربع: 78.2
معبأ: نعم
مشفر: لا
→ مستوى التهديد: خطير

حمولة مشفرة

الملف: encrypted_data.bin
الإنتروبيا: 7.99 بت/بايت
كاي مربع: 23.1
معبأ: لا
مشفر: نعم
→ مستوى التهديد: خطير

الرؤية الأساسية

الإنتروبيا هي "الرأي الثاني" بعد البايتات السحرية. ملف يدعي أنه PDF بإنتروبيا 7.9 يكون مؤكداً تقريباً ليس PDF عادي - على الأرجح مشفر أو معبأ أو خبيث.

مع كاي مربع، يستطيع باطن التمييز بين:

  • الضغط العادي (ZIP، JPEG)
  • التعبئة المشبوهة (UPX، Themida)
  • التشفير المحتمل (فيروسات الفدية، الحمولات المشفرة)