恶意代码相似度与家族聚类分析
用于比较多个恶意样本之间的代码和特征相似性,通过模糊哈希、字符串、函数、导入特征及聚类方法判断是否属于同一家族、同一代码基或存在复用关系。内置相似度计算与聚类脚本,适合批量样本归类、变种发现、家族演化分析和同源性研判,帮助从大量样本中建立关联。
在 AI 中使用此 Skill将本页链接复制给 AI,即可让 AI 获取完整 Skill 内容并按此执行
安全提示: 本站 Skill 均经 ChatGPT 最新模型扫描,未发现恶意脚本及危险指令、未检出已知恶意行为特征,但不保证绝对安全,使用即表示接受此风险
Skill 文件
版本 20260301 · 02dc0ce054eef9fd0d31e61636fcdf05
SKILL.md
---
name: code-similarity-analysis
description: >
Compare malware samples to identify code reuse, family relationships, and
shared authorship. Uses multiple similarity metrics including fuzzy hashing
(ssdeep, TLSH), import table comparison, string overlap, and function-level
matching. Supports clustering samples into families and generating similarity
matrices for large sample sets. Use when triaging new samples against known
families or investigating campaign connections.
---
# Code Similarity Analysis
Compare malware samples using multiple similarity metrics to identify
family relationships, code reuse, and shared tooling across campaigns.
## Prerequisites
- **Python 3.8+**: `hashlib`, `json`, `os`, `math` (standard library)
- **Python packages (optional)**: `ssdeep`, `tlsh`, `pefile`, `numpy`, `scipy`
- **Tools (optional)**: `ssdeep` CLI, `tlsh` CLI, `radare2`, `Ghidra`
- **Input**: Two or more malware samples (PE, ELF, or raw binaries)
## Step-by-Step Instructions
### Step 1: Compute Fuzzy Hashes
Calculate ssdeep and TLSH fuzzy hashes for each sample. These capture structural
similarity even when bytes change between variants.
**Using the similarity analyzer:**
```bash
python3 scripts/similarity_analyzer.py \
--samples sample1.exe sample2.exe sample3.exe \
--metrics ssdeep tlsh \
--output similarity_report.json
```
**Using ssdeep CLI directly:**
```bash
ssdeep -b sample1.exe sample2.exe sample3.exe
ssdeep -b -d sample1.exe sample2.exe # Compare two files
```
**Using TLSH:**
```bash
python3 -c "
import tlsh
h1 = tlsh.hash(open('sample1.exe', 'rb').read())
h2 = tlsh.hash(open('sample2.exe', 'rb').read())
print(f'Distance: {tlsh.diff(h1, h2)}') # Lower = more similar
"
```
**Interpreting results:**
- ssdeep: Score 0-100, higher means more similar. >30 is noteworthy, >70 is strong match
- TLSH: Distance score, lower means more similar. <100 is noteworthy, <30 is strong match
### Step 2: Compare Import Tables
Import table overlap is a strong indicator of shared functionality and tooling.
**Using the similarity analyzer:**
```bash
python3 scripts/similarity_analyzer.py \
--samples sample1.exe sample2.exe \
--metrics imports \
--output import_comparison.json
```
**Manual comparison with pefile:**
```bash
python3 -c "
import pefile
pe1 = pefile.PE('sample1.exe')
pe2 = pefile.PE('sample2.exe')
imports1 = set()
imports2 = set()
for entry in pe1.DIRECTORY_ENTRY_IMPORT:
for imp in entry.imports:
if imp.name:
imports1.add(f'{entry.dll.decode()}.{imp.name.decode()}')
for entry in pe2.DIRECTORY_ENTRY_IMPORT:
for imp in entry.imports:
if imp.name:
imports2.add(f'{entry.dll.decode()}.{imp.name.decode()}')
intersection = imports1 & imports2
union = imports1 | imports2
jaccard = len(intersection) / len(union) if union else 0
print(f'Jaccard similarity: {jaccard:.3f}')
print(f'Shared imports: {len(intersection)}/{len(union)}')
"
```
**Interpretation:**
- Jaccard > 0.8: Very similar import profiles, likely same family or tooling
- Jaccard 0.5-0.8: Significant overlap, possible shared components
- Jaccard 0.3-0.5: Moderate overlap, may share some functionality
- Jaccard < 0.3: Low overlap, likely different codebases
### Step 3: Compare String Artifacts
Extract and compare strings to identify shared configurations, C2 infrastructure,
or development artifacts.
**Using the similarity analyzer:**
```bash
python3 scripts/similarity_analyzer.py \
--samples sample1.exe sample2.exe \
--metrics strings \
--output string_comparison.json
```
**Manual string comparison:**
```bash
strings -n 8 sample1.exe | sort -u > strings1.txt
strings -n 8 sample2.exe | sort -u > strings2.txt
comm -12 strings1.txt strings2.txt # Shared strings
```
**Key strings to compare:**
- PDB paths (reveal build environment)
- Mutex names (execution markers)
- Registry key paths
- C2 URLs and domains
- Error messages and debug strings
- Encryption keys and configuration markers
### Step 4: Build Similarity Matrix
For multiple samples, compute pairwise similarity across all metrics.
**Generate full similarity matrix:**
```bash
python3 scripts/similarity_analyzer.py \
--samples-dir ./samples/ \
--metrics all \
--output similarity_matrix.json \
--format matrix
```
**Output as CSV for visualization:**
```bash
python3 scripts/similarity_analyzer.py \
--samples-dir ./samples/ \
--metrics all \
--output matrix.csv \
--format csv
```
### Step 5: Cluster Samples into Families
Use similarity scores to automatically group samples into families.
**Run clustering:**
```bash
python3 scripts/cluster_samples.py \
--similarity-matrix similarity_matrix.json \
--threshold 0.6 \
--output clusters.json
```
**Specify clustering method:**
```bash
python3 scripts/cluster_samples.py \
--samples-dir ./samples/ \
--method hierarchical \
--linkage average \
--threshold 0.6 \
--output clusters.json
```
### Step 6: Investigate Shared Code Blocks
For deeper analysis, compare function-level code patterns.
**Using radare2 for function comparison:**
```bash
r2 -qc "aaa; aflj" sample1.exe > funcs1.json
r2 -qc "aaa; aflj" sample2.exe > funcs2.json
```
**Check for shared unique strings in functions:**
```bash
python3 scripts/similarity_analyzer.py \
--samples sample1.exe sample2.exe \
--metrics strings imports ssdeep \
--verbose \
--output detailed_comparison.json
```
### Step 7: Document Family Classification
Based on similarity analysis, classify samples and document relationships.
**Classification criteria:**
| Similarity Level | Relationship | Action |
|-----------------|--------------|--------|
| >90% (all metrics) | Same sample or recompilation | Merge into single analysis |
| 70-90% | Same family variant | Group as variant, note differences |
| 50-70% | Related family or shared builder | Investigate shared components |
| 30-50% | Possible connection | Note for further investigation |
| <30% | Likely unrelated | Separate analysis tracks |
## Output Format
```json
{
"comparison_timestamp": "2025-01-15T10:00:00Z",
"samples": ["sample1.exe", "sample2.exe"],
"metrics": {
"ssdeep": {"score": 85, "hash1": "...", "hash2": "..."},
"tlsh": {"distance": 42, "hash1": "...", "hash2": "..."},
"imports": {"jaccard": 0.78, "shared": 45, "total_union": 58},
"strings": {"jaccard": 0.62, "shared": 128, "total_union": 207}
},
"overall_similarity": 0.75,
"classification": "Same family - high confidence",
"shared_artifacts": {
"imports": [],
"strings": [],
"mutexes": [],
"pdb_paths": []
}
}
```
## Tips
- Use multiple metrics together; no single metric is sufficient alone
- ssdeep requires minimum file size (~4KB) to produce useful hashes
- TLSH requires minimum 50 bytes of data and sufficient complexity
- Import comparison only works for PE files with intact import tables
- Packed samples should be unpacked before comparison for meaningful results
- Consider section-level hashing for more granular comparison
- PDB paths are high-value indicators of shared build environments
- Maintain a reference database of known family hashes for rapid classification
此文件不提供内嵌文本预览
请使用左侧文件行末尾的外链图标打开原始文件。
