yousef-ahmed-1234/malware-analysis-project

GitHub: yousef-ahmed-1234/malware-analysis-project

基于 PE 文件静态特征提取与随机森林机器学习的 Windows 恶意软件自动检测系统,附带 Ghidra 逆向验证流程。

Stars: 0 | Forks: 0

# 🛡️ 基于 PE 静态分析与机器学习的恶意软件检测系统 ## 📌 概述 本项目实现了一个基于 Windows 可移植可执行 (PE) 文件静态分析与机器学习相结合的端到端恶意软件检测系统。 该系统无需执行文件,而是从可执行文件中提取结构特征,并训练模型将其分类为: - 0 → 良性 - 1 → 恶意软件 处理流程包括: - PE 特征提取 (main.py) - 数据集生成 (features.csv) - 机器学习模型 (train.py) - 使用交叉验证进行评估 - 使用 Ghidra 进行手动逆向工程 ## ⚙️ 系统架构 ``` PE Files (.exe) ↓ Feature Extraction (main.py) ↓ features.csv ↓ ML Training (train.py) ↓ Prediction (Benign / Malware) ``` ## 📁 项目结构 ``` malware_project/ │ ├── main.py # Feature extraction from PE files ├── train.py # Machine learning model training ├── features.csv # Generated dataset ├── samples/ # Benign + malware executables └── README.md ``` ## 🔍 特征提取 (main.py) 此脚本从可执行文件中提取 PE 结构特征。 ### 提取的特征: - PE 头 - 可选头 - 节区熵 (随机性) - 可执行且可写入的节区 - 导入/导出表 ## 🧾 完整 main.py 代码 ``` import pefile import os import math import pandas as pd def entropy(data): if not data: return 0 occurences = [0] * 256 for b in data: occurences[b] += 1 ent = 0 for x in occurences: if x == 0: continue p = float(x) / len(data) ent -= p * math.log2(p) return ent def extract_features(file): features = {} features['file'] = file try: pe = pefile.PE(file) except Exception as e: raise Exception(f"PE parsing error: {e}") features['Machine'] = pe.FILE_HEADER.Machine features['NumberOfSections'] = pe.FILE_HEADER.NumberOfSections features['TimeDateStamp'] = pe.FILE_HEADER.TimeDateStamp features['Characteristics'] = pe.FILE_HEADER.Characteristics opt = pe.OPTIONAL_HEADER features['AddressOfEntryPoint'] = opt.AddressOfEntryPoint features['ImageBase'] = opt.ImageBase features['Subsystem'] = opt.Subsystem entropies = [] exec_sections = 0 for section in pe.sections: data = section.get_data() entropies.append(entropy(data)) if section.Characteristics & 0x20000000: exec_sections += 1 features['SectionsNb'] = len(pe.sections) features['SectionsMeanEntropy'] = sum(entropies)/len(entropies) if entropies else 0 features['ExecutableSections'] = exec_sections try: features['ImportsNbDLL'] = len(pe.DIRECTORY_ENTRY_IMPORT) features['ImportsNb'] = sum(len(i.imports) for i in pe.DIRECTORY_ENTRY_IMPORT) except: features['ImportsNbDLL'] = 0 features['ImportsNb'] = 0 try: features['ExportsNb'] = len(pe.DIRECTORY_ENTRY_EXPORT.symbols) except: features['ExportsNb'] = 0 return features data = [] folder = "samples" for file in os.listdir(folder): if file.endswith(".exe"): path = os.path.join(folder, file) try: data.append(extract_features(path)) print(f"[+] Processed {file}") except Exception as e: print(f"[-] Failed {file} -> {e}") df = pd.DataFrame(data) df.to_csv("features.csv", index=False) print("Done.") ``` ## 🤖 机器学习 (train.py) 使用 Random Forest 分类器进行恶意软件检测。 ### 为什么选择 Random Forest? - 多棵决策树 - 降低过拟合 - 非常适合处理 PE 结构化数据 ## 🧾 完整 train.py 代码 ``` import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report df = pd.read_csv("features.csv") def label_file(name): if "benign" in str(name).lower(): return 0 return 1 df["label"] = df["file"].apply(label_file) df = df.drop(columns=["file"]) df = df.fillna(0) X = df.drop(columns=["label"]) y = df["label"] print("\nClass distribution:") print(y.value_counts()) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) model = RandomForestClassifier(n_estimators=200, random_state=42) model.fit(X_train, y_train) y_pred = model.predict(X_test) print("\n=== RESULTS ===") print("Accuracy:", accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred)) cv_scores = cross_val_score(model, X, y, cv=5) print("\n=== CROSS VALIDATION ===") print("Scores:", cv_scores) print("Mean:", cv_scores.mean()) print("Std:", cv_scores.std()) ``` ## 🔬 Ghidra 分析 手动逆向工程验证了机器学习的结果: ### 恶意软件: - 混淆的执行流程 - 高熵节区 - 可疑的 API 调用 ### 良性软件: - 清晰的结构 - 标准的导入 - 正常的执行流程 ## ⚠️ 挑战 - 缺少依赖项 - 损坏的 PE 文件 - 在 Linux 上通过 Wine 运行 Windows 工具时出现的问题 - 小数据集偏差 - 工具集成复杂性 ## 📊 结论 本项目展示了一个使用 PE 静态分析和机器学习构建的完整恶意软件检测流程。 Random Forest 能够利用从 PE 文件中提取的结构特征,有效地对可执行文件进行分类。 Ghidra 分析证实,与良性软件相比,恶意软件表现出异常的结构行为。 本项目为以下领域奠定了基础技能: - 恶意软件分析 - PE 文件结构 - 特征工程 - 机器学习 - 逆向工程
标签:AMSI绕过, Apex, API接口, Conpot, DNS 反向解析, Ghidra, pefile, PE文件分析, Python, Windows安全, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 人工智能, 可执行文件, 威胁检测, 归档响应下载, 恶意代码识别, 数据科学, 文件熵计算, 无后门, 机器学习, 特征提取, 用户模式Hook绕过, 网络安全, 资源验证, 逆向工具, 逆向工程, 隐私保护, 静态分析