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绕过, 网络安全, 资源验证, 逆向工具, 逆向工程, 隐私保护, 静态分析