محلل البرمجيات الضارة
ما هو محلل البرمجيات الضارة؟
خبير الأمن السيبراني والهندسة العكسية
محلل البرمجيات الضارة يركز على تحليل البرمجيات الضارة باستخدام أدوات مثل Ghidra وCuckoo Sandbox، يهدف لفهم سلوكها وحماية الأنظمة من الهجمات السيبرانية.
التحليل الثابت
فحص البرمجيات دون تشغيلها
التحليل الديناميكي
مراقبة السلوك أثناء التشغيل
الهندسة العكسية
فهم كود البرمجيات الضارة
حماية الأنظمة
تطوير آليات الدفاع والكشف
اللغات والأدوات المستخدمة
Assembly
فهم كيفية عمل البرمجيات الضارة على مستوى التعليمات المنخفضة
Python
اللغة الأساسية للتعامل مع البيانات وتحليل النماذج
C/C++
للبرمجة على أجهزة مثل Raspberry Pi وArduino
JSON/YAML
تكوين ملفات الإعدادات والمعلمات
NoSQL/Hive
قواعد البيانات لتخزين نتائج التحليل
Shell Scripting
لأتمتة مهام التحليل والفحص
أدوات التحليل والتقنيات
أدوات الهندسة العكسية
IDA Pro، Ghidra، Radare2 لتحليل الشيفرات العكسية
أدوات التحليل الثابت
PE Explorer، Strings لاستخراج النصوص والبيانات
أدوات التحليل الديناميكي
OllyDbg، x64Dbg، Process Monitor لمراقبة السلوك
بيئات Sandbox
Cuckoo Sandbox، Any Run للتحليل الآمن
إدارة النسخ
Git، GitHub لتتبع التغييرات والتعاون
الحاويات
Docker، Kubernetes لتوفير بيئات معزولة
خارطة التعلم خطوة بخطوة
الخطوة 1: تعلم الهندسة العكسية
الهندسة العكسية هي عملية تحليل البرمجيات الضارة لفهم كيفية عملها دون الوصول إلى الشيفرة المصدرية. يتم استخدامها لاكتشاف نقاط الضعف واستراتيجيات الهجوم.
الأهمية:
ضروري لفهم كيفية عمل البرمجيات الضارة وإصلاح الثغرات
الأدوات:
IDA Pro، Ghidra، Radare2
أمثلة الهندسة العكسية:
# ===== تشغيل Ghidra =====
# تشغيل Ghidra على Linux/Mac
./ghidraRun
# تشغيل Ghidra على Windows
ghidraRun.bat
# خطوات التحليل:
# 1. File > New Project
# 2. Import File (اختر الملف التنفيذي)
# 3. Analyze (التحليل التلقائي)
# ===== استخدام Radare2 =====
# فتح ملف للتحليل
r2 -A malware_sample.exe
# أوامر أساسية في Radare2:
[0x00401000]> ii # معلومات الاستيراد
[0x00401000]> iI # معلومات الملف
[0x00401000]> aaaa # تحليل شامل
[0x00401000]> afl # قائمة الدوال
[0x00401000]> s main # الانتقال إلى main
[0x00401000]> pdf # عرض دالة التفكيك
[0x00401000]> V # الوضع المرئي
# البحث عن سلاسل النصوص
[0x00401000]> iz # سلاسل في البيانات
[0x00401000]> izz # جميع السلاسل
# ===== استخدام IDA Pro =====
# 1. فتح الملف في IDA
# 2. الانتظار حتى ينتهي التحليل الأولي
# 3. استخدام Graph View لرؤية تدفق البرنامج
# 4. البحث عن cross-references (X)
# 5. إضافة تعليقات على الكود
# سكربت Python لـ IDA
import idautils
import idaapi
# الحصول على جميع الدوال
for func in idautils.Functions():
func_name = idc.get_func_name(func)
print(f"Function: {func_name} at {hex(func)}")
# البحث عن سلاسل معينة
strings = idautils.Strings()
for s in strings:
if "http" in str(s):
print(f"Found URL: {s} at {hex(s.ea)}")
الخطوة 2: تعلم التحليل الثابت
التحليل الثابت هو عملية تحليل البرمجيات الضارة دون تشغيلها. يتضمن فحص الملفات التنفيذية، استخراج النصوص، وتحليل الشيفرات.
الأهمية:
ضروري لفهم البنية الأساسية للبرمجيات الضارة واكتشاف الأنشطة المشبوهة
الأدوات:
PE Explorer، Strings، ExifTool
أمثلة التحليل الثابت:
# ===== استخدام Strings =====
# استخراج النصوص من ملف
strings suspicious_file.exe > extracted_strings.txt
# استخراج النصوص بترميز Unicode
strings -e l suspicious_file.exe > unicode_strings.txt
# استخراج النصوص مع معلومات الإزاحة
strings -o suspicious_file.exe > strings_with_offset.txt
# البحث عن URLs و IPs
strings suspicious_file.exe | grep -E "(http|https|ftp)://[a-zA-Z0-9./?=_-]*"
strings suspicious_file.exe | grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
# ===== استخدام ExifTool =====
# قراءة البيانات الوصفية للملف
exiftool malware_sample.exe
# التحقق من توقيع الملف
exiftool -FileTypeDescription malware_sample.exe
# ===== استخدام PE Explorer =====
# 1. فتح الملف في PE Explorer
# 2. فحص Headers (DOS Header, PE Header)
# 3. التحقق من Imports/Exports
# 4. فحص Resources (الأيقونات، النصوص)
# 5. التحقق من Sections (.text, .data, .rsrc)
# ===== سكربت Python للتحليل الثابت =====
import pefile
import hashlib
import os
class StaticAnalyzer:
def __init__(self, file_path):
self.file_path = file_path
self.pe = pefile.PE(file_path)
def get_hashes(self):
"""حساب hashes الملف"""
with open(self.file_path, 'rb') as f:
content = f.read()
hashes = {
'md5': hashlib.md5(content).hexdigest(),
'sha1': hashlib.sha1(content).hexdigest(),
'sha256': hashlib.sha256(content).hexdigest()
}
return hashes
def get_strings(self, min_length=4):
"""استخراج النصوص من الملف"""
strings = []
with open(self.file_path, 'rb') as f:
content = f.read()
# استخراج النصوص القابلة للطباعة
current_string = ""
for byte in content:
if 32 <= byte <= 126:
current_string += chr(byte)
else:
if len(current_string) >= min_length:
strings.append(current_string)
current_string = ""
return strings
def analyze_pe_structure(self):
"""تحليل هيكل PE"""
info = {
'entry_point': hex(self.pe.OPTIONAL_HEADER.AddressOfEntryPoint),
'image_base': hex(self.pe.OPTIONAL_HEADER.ImageBase),
'sections': [],
'imports': [],
'exports': []
}
# تحليل الأقسام
for section in self.pe.sections:
info['sections'].append({
'name': section.Name.decode().strip('\x00'),
'virtual_address': hex(section.VirtualAddress),
'virtual_size': hex(section.Misc_VirtualSize),
'raw_size': section.SizeOfRawData
})
# تحليل الواردات
if hasattr(self.pe, 'DIRECTORY_ENTRY_IMPORT'):
for entry in self.pe.DIRECTORY_ENTRY_IMPORT:
dll_name = entry.dll.decode()
functions = [func.name.decode() for func in entry.imports if func.name]
info['imports'].append({
'dll': dll_name,
'functions': functions
})
return info
def detect_packing(self):
"""الكشف عن الضغط/التشفير"""
# فحص نسبة الـ entropy
high_entropy_sections = []
for section in self.pe.sections:
entropy = section.get_entropy()
if entropy > 7.0: # Entropy عالي يشير إلى ضغط/تشفير
high_entropy_sections.append({
'name': section.Name.decode().strip('\x00'),
'entropy': entropy
})
return high_entropy_sections
def generate_report(self):
"""إنشاء تقرير التحليل"""
print("=" * 60)
print("تقرير التحليل الثابت")
print("=" * 60)
# Hashes
hashes = self.get_hashes()
print("\n[+] Hashes:")
for hash_type, hash_value in hashes.items():
print(f" {hash_type.upper()}: {hash_value}")
# PE Structure
pe_info = self.analyze_pe_structure()
print(f"\n[+] Entry Point: {pe_info['entry_point']}")
print(f"[+] Image Base: {pe_info['image_base']}")
print("\n[+] Sections:")
for section in pe_info['sections']:
print(f" {section['name']}: {section['virtual_address']} (Size: {section['virtual_size']})")
# Packing Detection
packed = self.detect_packing()
if packed:
print("\n[!] Warning: Possible packing detected:")
for section in packed:
print(f" {section['name']}: Entropy {section['entropy']:.2f}")
# Suspicious Strings
strings = self.get_strings()
suspicious = [s for s in strings if any(keyword in s.lower() for keyword in ['http', 'ftp', 'smtp', 'socket', 'registry', 'createprocess'])]
if suspicious:
print("\n[!] Suspicious Strings Found:")
for s in suspicious[:10]: # عرض أول 10 فقط
print(f" {s}")
# استخدام المحلل
if __name__ == "__main__":
analyzer = StaticAnalyzer("suspicious_file.exe")
analyzer.generate_report()
الخطوة 3: تعلم التحليل الديناميكي
التحليل الديناميكي هو عملية تحليل البرمجيات الضارة أثناء تشغيلها. يتضمن مراقبة العمليات، الحركات على القرص، وحركة مرور الشبكة.
الأهمية:
ضروري لفهم السلوك الفعلي للبرمجيات الضارة وكيفية تفاعلها مع النظام
الأدوات:
OllyDbg، x64Dbg، Process Monitor
أمثلة التحليل الديناميكي:
# ===== استخدام Process Monitor =====
# تشغيل Process Monitor
procmon.exe
# خطوات المراقبة:
# 1. Filter > Process Name > suspicious_file.exe
# 2. Monitor: Registry, File System, Network, Process
# 3. Capture Events
# 4. Analyze Results
# تصدير النتائج
# File > Save > CSV Format
# ===== استخدام OllyDbg =====
# 1. فتح الملف في OllyDbg
# 2. تحديد نقاط التوقف (Breakpoints) على:
# - CreateFileA/W
# - RegSetValueExA/W
# - InternetConnectA/W
# - CreateProcessA/W
# 3. تشغيل البرنامج (F9)
# 4. متابعة التنفيذ خطوة بخطوة (F7, F8)
# 5. مراقبة الـ Stack و Registers
# ===== سكربت Python للتحليل الديناميكي =====
import subprocess
import time
import psutil
import winreg
from datetime import datetime
class DynamicAnalyzer:
def __init__(self, malware_path):
self.malware_path = malware_path
self.process = None
self.baseline = self.get_system_state()
def get_system_state(self):
"""الحصول على حالة النظام الأساسية"""
state = {
'processes': set(p.name() for p in psutil.process_iter()),
'registry_keys': [],
'files': set(),
'network_connections': set()
}
return state
def monitor_process(self, duration=60):
"""مراقبة العملية أثناء التشغيل"""
print(f"[*] Starting dynamic analysis for {duration} seconds...")
# تشغيل البرمجية الضارة في بيئة معزولة (Caution!)
try:
self.process = subprocess.Popen(
self.malware_path,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
start_time = time.time()
activities = {
'file_operations': [],
'registry_operations': [],
'network_activity': [],
'process_spawns': []
}
while time.time() - start_time < duration:
# مراقبة العمليات الجديدة
current_processes = set(p.name() for p in psutil.process_iter())
new_processes = current_processes - self.baseline['processes']
if new_processes:
activities['process_spawns'].extend(new_processes)
self.baseline['processes'] = current_processes
# مراقبة الاتصالات الشبكية
for conn in psutil.net_connections():
if conn.status == 'ESTABLISHED' and conn.pid == self.process.pid:
activities['network_activity'].append({
'local': f"{conn.laddr.ip}:{conn.laddr.port}",
'remote': f"{conn.raddr.ip}:{conn.raddr.port}" if conn.raddr else "N/A",
'status': conn.status
})
time.sleep(1)
self.process.terminate()
return activities
except Exception as e:
print(f"[!] Error during analysis: {e}")
return None
def analyze_network_traffic(self, pcap_file):
"""تحليل حركة المرور الشبكية"""
try:
from scapy.all import rdpcap, IP, TCP, UDP
packets = rdpcap(pcap_file)
analysis = {
'total_packets': len(packets),
'unique_ips': set(),
'suspicious_ports': [],
'dns_queries': []
}
for packet in packets:
if IP in packet:
analysis['unique_ips'].add(packet[IP].dst)
if TCP in packet:
dport = packet[TCP].dport
if dport in [4444, 5555, 6666, 8080, 9999]: # Ports مشبوهة
analysis['suspicious_ports'].append({
'dst': packet[IP].dst,
'port': dport
})
return analysis
except ImportError:
print("[!] Scapy not installed. Install with: pip install scapy")
return None
def check_persistence_mechanisms(self):
"""التحقق من آليات الاستمرارية"""
persistence_locations = [
(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run"),
(winreg.HKEY_LOCAL_MACHINE, r"Software\Microsoft\Windows\CurrentVersion\Run"),
(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\RunOnce"),
]
found_persistence = []
for hive, path in persistence_locations:
try:
key = winreg.OpenKey(hive, path)
i = 0
while True:
try:
name, value, _ = winreg.EnumValue(key, i)
found_persistence.append({
'location': path,
'name': name,
'value': value
})
i += 1
except WindowsError:
break
winreg.CloseKey(key)
except WindowsError:
continue
return found_persistence
def generate_dynamic_report(self, activities):
"""إنشاء تقرير التحليل الديناميكي"""
print("\n" + "=" * 60)
print("تقرير التحليل الديناميكي")
print("=" * 60)
print(f"وقت التحليل: {datetime.now()}")
print(f"الملف: {self.malware_path}")
if activities:
print(f"\n[+] العمليات المنشأة: {len(activities['process_spawns'])}")
for proc in activities['process_spawns']:
print(f" - {proc}")
print(f"\n[+] العمليات الشبكية: {len(activities['network_activity'])}")
for conn in activities['network_activity']:
print(f" {conn['local']} -> {conn['remote']} ({conn['status']})")
print(f"\n[+] عمليات الملفات: {len(activities['file_operations'])}")
for file_op in activities['file_operations']:
print(f" {file_op}")
# التحقق من الاستمرارية
persistence = self.check_persistence_mechanisms()
if persistence:
print(f"\n[!] آليات استمرارية مكتشفة: {len(persistence)}")
for item in persistence:
print(f" {item['location']}: {item['name']} = {item['value']}")
# استخدام المحلل الديناميكي
if __name__ == "__main__":
# تحذير: استخدم فقط في بيئة معزولة (VM)
analyzer = DynamicAnalyzer("malware_sample.exe")
activities = analyzer.monitor_process(duration=30)
analyzer.generate_dynamic_report(activities)
الخطوة 4: تعلم الساندبوكس
الساندبوكس هو عملية تشغيل البرمجيات الضارة في بيئة معزولة لتحليل سلوكها دون تعريض النظام الأساسي للخطر.
الأهمية:
ضروري لتحليل البرمجيات الضارة بشكل آمن ومنع أي ضرر محتمل
الأدوات:
Cuckoo Sandbox، Any Run، Joe Sandbox
أمثلة استخدام الساندبوكس:
# ===== تثبيت Cuckoo Sandbox =====
# 1. تثبيت المتطلبات
sudo apt-get install python python-pip python-dev libffi-dev libssl-dev
sudo apt-get install mongodb qemu-kvm libvirt-bin bridge-utils
# 2. تثبيت Cuckoo
pip install cuckoo
# 3. إعداد Cuckoo
cuckoo init
cuckoo community
# 4. تشغيل Cuckoo
cuckoo web --host 0.0.0.0 --port 8080
cuckoo api --host 0.0.0.0 --port 8090
# ===== إرسال عينة إلى Cuckoo =====
# إرسال ملف للتحليل
cuckoo submit suspicious_file.exe
# إرسال مع خيارات متقدمة
cuckoo submit --options "procmemdump=yes,route=internet" malware.exe
# إرسال URL للتحليل
cuckoo submit --url http://suspicious-site.com/payload.exe
# مراقبة حالة التحليل
cuckoo status
# ===== استخدام API Cuckoo =====
import requests
import time
import json
class CuckooAPI:
def __init__(self, host='http://localhost:8090'):
self.host = host
def submit_file(self, file_path):
"""إرسال ملف للتحليل"""
with open(file_path, 'rb') as f:
response = requests.post(
f"{self.host}/tasks/create/file",
files={'file': f}
)
return response.json()['task_id']
def get_report(self, task_id):
"""الحصول على التقرير"""
response = requests.get(f"{self.host}/tasks/report/{task_id}")
return response.json()
def wait_for_analysis(self, task_id, timeout=300):
"""انتظار انتهاء التحليل"""
start_time = time.time()
while time.time() - start_time < timeout:
response = requests.get(f"{self.host}/tasks/view/{task_id}")
status = response.json()['task']['status']
if status == 'reported':
return True
elif status == 'failed':
return False
time.sleep(10)
return False
def analyze_file(self, file_path):
"""تحليل ملف كامل"""
print(f"[*] Submitting {file_path} to Cuckoo...")
task_id = self.submit_file(file_path)
print(f"[+] Task ID: {task_id}")
print("[*] Waiting for analysis to complete...")
if self.wait_for_analysis(task_id):
print("[+] Analysis complete!")
report = self.get_report(task_id)
self.parse_report(report)
else:
print("[!] Analysis failed or timed out")
def parse_report(self, report):
"""تحليل التقرير"""
print("\n" + "=" * 60)
print("تقرير تحليل Cuckoo Sandbox")
print("=" * 60)
# معلومات أساسية
info = report.get('info', {})
print(f"\n[+] اسم الملف: {info.get('target', {}).get('file', {}).get('name', 'N/A')}")
print(f"[+] النتيجة: {report.get('info', {}).get('score', 0)}/10")
# التوقيعات
signatures = report.get('signatures', [])
if signatures:
print(f"\n[!] التوقيعات المكتشفة ({len(signatures)}):")
for sig in signatures:
print(f" - {sig['name']}: {sig['description']}")
# الاتصالات الشبكية
network = report.get('network', {})
if network.get('hosts'):
print(f"\n[+] الاتصالات الشبكية:")
for host in network['hosts']:
print(f" {host['ip']} ({host['country_name']})")
# العمليات المنشأة
behavior = report.get('behavior', {})
processes = behavior.get('processes', [])
if processes:
print(f"\n[+] العمليات المنشأة ({len(processes)}):")
for proc in processes[:5]: # أول 5 فقط
print(f" - {proc['process_name']} (PID: {proc['pid']})")
# الملفات المعدلة
summary = behavior.get('summary', {})
files = summary.get('files', [])
if files:
print(f"\n[+] الملفات المعدلة ({len(files)}):")
for file in files[:5]:
print(f" {file}")
# ===== استخدام Docker للعزل =====
# Dockerfile لبيئة تحليل آمنة
"""
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
strace \
tcpdump \
inotify-tools \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /analysis
COPY analyze.py .
COPY sample.exe .
CMD ["python3", "analyze.py", "sample.exe"]
"""
# بناء وتشغيل الحاوية
# docker build -t malware-analysis .
# docker run --rm -v $(pwd)/results:/results malware-analysis
# ===== سكربت Python للتحليل في الحاوية =====
import subprocess
import json
import os
import sys
def analyze_in_container(sample_path):
"""تحليل العينة في بيئة معزولة"""
results = {
'system_calls': [],
'file_operations': [],
'network_activity': [],
'registry_changes': []
}
# استخدام strace لتتبع استدعاءات النظام
print("[*] Running strace...")
strace_cmd = ['strace', '-f', '-e', 'trace=all', '-o', '/tmp/strace.log', 'wine', sample_path]
subprocess.run(strace_cmd, timeout=30, capture_output=True)
# قراءة نتائج strace
with open('/tmp/strace.log', 'r') as f:
for line in f:
if 'open(' in line or 'write(' in line:
results['file_operations'].append(line.strip())
elif 'socket(' in line or 'connect(' in line:
results['network_activity'].append(line.strip())
elif 'registry' in line.lower():
results['registry_changes'].append(line.strip())
results['system_calls'].append(line.strip())
# حفظ النتائج
with open('/results/analysis.json', 'w') as f:
json.dump(results, f, indent=2)
print("[+] Analysis complete. Results saved to /results/analysis.json")
if __name__ == "__main__":
if len(sys.argv) > 1:
analyze_in_container(sys.argv[1])
else:
print("Usage: python3 analyze.py ")
هندسة تحليل البرمجيات الضارة
جمع العينات
جمع البرمجيات الضارة من مصادر مختلفة
التحليل الثابت
فحص الملفات دون تشغيلها
التحليل الديناميكي
مراقبة السلوك في بيئة معزولة
الهندسة العكسية
فهم الكود والتعليمات المنخفضة المستوى
تطوير الحماية
إنشاء توقيعات وقواعد كشف
أدوات تحليل البرمجيات الضارة
Ghidra
أداة الهندسة العكسية مفتوحة المصدر من NSA
IDA Pro
أداة احترافية للهندسة العكسية
Cuckoo Sandbox
بيئة معزولة لتحليل البرمجيات الضارة
Radare2
إطار عمل مفتوح المصدر للهندسة العكسية
x64Dbg
مصحح أخطاء مفتوح المصدر لنظام Windows
Process Monitor
مراقبة العمليات والملفات والسجل
المزايا والتحديات
المزايا
- طلب عالي: هناك طلب كبير على محللي البرمجيات الضارة، خاصة في الشركات التي تعتمد على الأمن السيبراني
- أدوات مجانية: معظم الأدوات المستخدمة مثل Radare2 و Cuckoo Sandbox مجانية ومفتوحة المصدر
- تأثير إيجابي: يمكنك المساهمة في حماية الأنظمة من البرمجيات الضارة ومنع الهجمات السيبرانية
- إبداع لا محدود: يمكنك تصميم استراتيجيات جديدة لاكتشاف البرمجيات الضارة وتحليلها
- رواتب ممتازة: محللو البرمجيات الضارة من الأعلى أجراً في مجال الأمن السيبراني
التحديات
- منحنى التعلم الحاد: يتطلب فهماً جيداً للغات البرمجة مثل Assembly و Python
- مسؤولية كبيرة: يجب أن تكون حذراً جداً عند التعامل مع البرمجيات الضارة لتجنب التسبب في أضرار
- تحديثات متكررة: الأدوات والتقنيات تتطور باستمرار، مما يتطلب تحديث المعرفة بشكل منتظم
- مخاطر الأمان: التعامل مع برمجيات ضارة حقيقية يحمل مخاطر على البنية التحتية إذا لم يتم العزل بشكل صحيح
أنواع البرمجيات الضارة
الفيروسات
برمجيات تتكاثر عن طريق إلحاق نفسها بملفات أخرى
الديدان
برمجيات تنتشر عبر الشبكات دون تدخل المستخدم
أحصنة طروادة
برمجيات تتنكر كبرامج شرعية لخداع المستخدمين
برمجيات الفدية
تشفير الملفات ومطالبة المستخدم بدفع فدية
برمجيات التجسس
جمع المعلومات سراً دون علم المستخدم
البوت نت
شبكات من الأجهزة المصابة للتحكم عن بعد
الخلاصة
هذا الـ Roadmap يوفر لك أساساً قوياً لتصبح محلل برمجيات ضارة. من خلال إتقان الهندسة العكسية والتحليل الثابت والديناميكي واستخدام أدوات مثل Ghidra و Cuckoo Sandbox، يمكنك فهم سلوك البرمجيات الضارة وتطوير آليات لحماية الأنظمة منها.
نصائح للبدء:
- ابدأ بتعلم أساسيات Assembly والبرمجة منخفضة المستوى
- تدرب على أدوات الهندسة العكسية مثل Ghidra (مجاني) قبل IDA Pro (مدفوع)
- استخدم بيئات افتراضية معزولة دائماً عند التعامل مع برمجيات ضارة حقيقية
- حل تحديات CTF المتعلقة بالهندسة العكسية وتحليل البرمجيات الضارة
- اقرأ تقارير تحليل البرمجيات الضارة من شركات الأمان الكبرى
- انضم إلى مجتمعات الأمن السيبراني لمشاركة المعرفة والتعلم من الخبراء