iflow-mcp_developermode-korea_reversecore-mcp 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/METADATA +543 -0
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/RECORD +79 -0
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/WHEEL +5 -0
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/entry_points.txt +2 -0
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/licenses/LICENSE +21 -0
- iflow_mcp_developermode_korea_reversecore_mcp-1.0.0.dist-info/top_level.txt +1 -0
- reversecore_mcp/__init__.py +9 -0
- reversecore_mcp/core/__init__.py +78 -0
- reversecore_mcp/core/audit.py +101 -0
- reversecore_mcp/core/binary_cache.py +138 -0
- reversecore_mcp/core/command_spec.py +357 -0
- reversecore_mcp/core/config.py +432 -0
- reversecore_mcp/core/container.py +288 -0
- reversecore_mcp/core/decorators.py +152 -0
- reversecore_mcp/core/error_formatting.py +93 -0
- reversecore_mcp/core/error_handling.py +142 -0
- reversecore_mcp/core/evidence.py +229 -0
- reversecore_mcp/core/exceptions.py +296 -0
- reversecore_mcp/core/execution.py +240 -0
- reversecore_mcp/core/ghidra.py +642 -0
- reversecore_mcp/core/ghidra_helper.py +481 -0
- reversecore_mcp/core/ghidra_manager.py +234 -0
- reversecore_mcp/core/json_utils.py +131 -0
- reversecore_mcp/core/loader.py +73 -0
- reversecore_mcp/core/logging_config.py +206 -0
- reversecore_mcp/core/memory.py +721 -0
- reversecore_mcp/core/metrics.py +198 -0
- reversecore_mcp/core/mitre_mapper.py +365 -0
- reversecore_mcp/core/plugin.py +45 -0
- reversecore_mcp/core/r2_helpers.py +404 -0
- reversecore_mcp/core/r2_pool.py +403 -0
- reversecore_mcp/core/report_generator.py +268 -0
- reversecore_mcp/core/resilience.py +252 -0
- reversecore_mcp/core/resource_manager.py +169 -0
- reversecore_mcp/core/result.py +132 -0
- reversecore_mcp/core/security.py +213 -0
- reversecore_mcp/core/validators.py +238 -0
- reversecore_mcp/dashboard/__init__.py +221 -0
- reversecore_mcp/prompts/__init__.py +56 -0
- reversecore_mcp/prompts/common.py +24 -0
- reversecore_mcp/prompts/game.py +280 -0
- reversecore_mcp/prompts/malware.py +1219 -0
- reversecore_mcp/prompts/report.py +150 -0
- reversecore_mcp/prompts/security.py +136 -0
- reversecore_mcp/resources.py +329 -0
- reversecore_mcp/server.py +727 -0
- reversecore_mcp/tools/__init__.py +49 -0
- reversecore_mcp/tools/analysis/__init__.py +74 -0
- reversecore_mcp/tools/analysis/capa_tools.py +215 -0
- reversecore_mcp/tools/analysis/die_tools.py +180 -0
- reversecore_mcp/tools/analysis/diff_tools.py +643 -0
- reversecore_mcp/tools/analysis/lief_tools.py +272 -0
- reversecore_mcp/tools/analysis/signature_tools.py +591 -0
- reversecore_mcp/tools/analysis/static_analysis.py +479 -0
- reversecore_mcp/tools/common/__init__.py +58 -0
- reversecore_mcp/tools/common/file_operations.py +352 -0
- reversecore_mcp/tools/common/memory_tools.py +516 -0
- reversecore_mcp/tools/common/patch_explainer.py +230 -0
- reversecore_mcp/tools/common/server_tools.py +115 -0
- reversecore_mcp/tools/ghidra/__init__.py +19 -0
- reversecore_mcp/tools/ghidra/decompilation.py +975 -0
- reversecore_mcp/tools/ghidra/ghidra_tools.py +1052 -0
- reversecore_mcp/tools/malware/__init__.py +61 -0
- reversecore_mcp/tools/malware/adaptive_vaccine.py +579 -0
- reversecore_mcp/tools/malware/dormant_detector.py +756 -0
- reversecore_mcp/tools/malware/ioc_tools.py +228 -0
- reversecore_mcp/tools/malware/vulnerability_hunter.py +519 -0
- reversecore_mcp/tools/malware/yara_tools.py +214 -0
- reversecore_mcp/tools/patch_explainer.py +19 -0
- reversecore_mcp/tools/radare2/__init__.py +13 -0
- reversecore_mcp/tools/radare2/r2_analysis.py +972 -0
- reversecore_mcp/tools/radare2/r2_session.py +376 -0
- reversecore_mcp/tools/radare2/radare2_mcp_tools.py +1183 -0
- reversecore_mcp/tools/report/__init__.py +4 -0
- reversecore_mcp/tools/report/email.py +82 -0
- reversecore_mcp/tools/report/report_mcp_tools.py +344 -0
- reversecore_mcp/tools/report/report_tools.py +1076 -0
- reversecore_mcp/tools/report/session.py +194 -0
- reversecore_mcp/tools/report_tools.py +11 -0
|
@@ -0,0 +1,1219 @@
|
|
|
1
|
+
"""Prompts for malware analysis modes."""
|
|
2
|
+
|
|
3
|
+
from reversecore_mcp.prompts.common import DOCKER_PATH_RULE, LANGUAGE_RULE
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def full_analysis_mode(filename: str) -> str:
|
|
7
|
+
"""Expert mode that analyzes a file completely from A to Z with maximum AI reasoning."""
|
|
8
|
+
return f"""
|
|
9
|
+
You are an Elite Reverse Engineering Expert with 20+ years of experience in:
|
|
10
|
+
- Malware analysis and threat intelligence (APT, Ransomware, RAT, Rootkits)
|
|
11
|
+
- Binary exploitation and vulnerability research (0-day hunting)
|
|
12
|
+
- Anti-analysis bypass and advanced evasion techniques
|
|
13
|
+
- Cryptographic analysis and protocol reverse engineering
|
|
14
|
+
- Firmware and embedded systems security
|
|
15
|
+
- Code deobfuscation and unpacking (Themida, VMProtect, custom packers)
|
|
16
|
+
|
|
17
|
+
Your mission: Perform a COMPREHENSIVE security analysis of '{filename}'
|
|
18
|
+
that leaves no stone unturned. You will identify ALL threats, understand
|
|
19
|
+
their purpose, and generate actionable intelligence.
|
|
20
|
+
|
|
21
|
+
{LANGUAGE_RULE}
|
|
22
|
+
|
|
23
|
+
{DOCKER_PATH_RULE}
|
|
24
|
+
|
|
25
|
+
[CRITICAL: Evidence-Based Analysis Rule]
|
|
26
|
+
==========================================
|
|
27
|
+
**Every finding MUST be labeled with an evidence level:**
|
|
28
|
+
|
|
29
|
+
🔍 [OBSERVED] - Directly observed through dynamic analysis, logs, or traces
|
|
30
|
+
Example: "Procmon captured CreateMutexA('WNcry@2ol7') call"
|
|
31
|
+
Confidence: 100%
|
|
32
|
+
|
|
33
|
+
🔎 [INFERRED] - Logically inferred from static analysis (high confidence)
|
|
34
|
+
Example: "CryptEncrypt import suggests encryption capability"
|
|
35
|
+
Confidence: 70-85%
|
|
36
|
+
|
|
37
|
+
❓ [POSSIBLE] - Possible based on patterns, requires verification
|
|
38
|
+
Example: "SMB functions present, may attempt lateral movement"
|
|
39
|
+
Confidence: 40-60%
|
|
40
|
+
|
|
41
|
+
**NEVER state 'confirmed' or 'detected' for inferred/possible findings!**
|
|
42
|
+
Use language like:
|
|
43
|
+
- OBSERVED: "확인됨", "detected", "observed"
|
|
44
|
+
- INFERRED: "추정됨", "likely", "suggests"
|
|
45
|
+
- POSSIBLE: "가능성 있음", "may", "could"
|
|
46
|
+
|
|
47
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
48
|
+
██ PHASE 1: INITIAL TRIAGE & THREAT CLASSIFICATION ██
|
|
49
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
50
|
+
|
|
51
|
+
[STEP 1.1] File Intelligence Gathering
|
|
52
|
+
Build your initial mental model with these foundational tools:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
detect_packer("{filename}") # FIRST: Packer/Compiler/Protector detection
|
|
56
|
+
run_file("{filename}") # File type, architecture, compiler
|
|
57
|
+
parse_binary_with_lief("{filename}") # PE/ELF structure, sections, entropy
|
|
58
|
+
run_strings("{filename}", min_length=5) # Extract all meaningful strings
|
|
59
|
+
extract_iocs("{filename}") # IP, URL, Email, Bitcoin, Hashes
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Why detect_packer First?**
|
|
63
|
+
- If packed (UPX, Themida, VMProtect), skip deep analysis until unpacked
|
|
64
|
+
- Compiler info helps understand the binary's origin
|
|
65
|
+
- Protector detection guides anti-analysis strategy
|
|
66
|
+
|
|
67
|
+
[REASONING CHECKPOINT 1 - THREAT HYPOTHESIS]
|
|
68
|
+
Before proceeding, form initial hypotheses by answering:
|
|
69
|
+
|
|
70
|
+
**File Characteristics:**
|
|
71
|
+
Q1: What is the exact file format? (PE32/PE64/ELF/Mach-O/Script?)
|
|
72
|
+
Q2: What compiler/language produced this? (MSVC/GCC/Go/Rust/Python?)
|
|
73
|
+
Q3: Is it packed? (Section entropy > 7.0? Suspicious section names?)
|
|
74
|
+
Q4: What's the apparent purpose? (Installer/DLL/Service/Standalone?)
|
|
75
|
+
|
|
76
|
+
**Initial Threat Assessment:**
|
|
77
|
+
Q5: Based on strings, what capabilities might this have?
|
|
78
|
+
- Network? (socket, http, connect, send, recv)
|
|
79
|
+
- File System? (CreateFile, DeleteFile, encrypt, ransom)
|
|
80
|
+
- Persistence? (Registry, Service, Scheduled Task)
|
|
81
|
+
- Credential Theft? (chrome, firefox, password, vault)
|
|
82
|
+
- Evasion? (IsDebugger, Sleep, VM, sandbox)
|
|
83
|
+
|
|
84
|
+
Q6: What malware family does this MOST LIKELY belong to?
|
|
85
|
+
Form a hypothesis: "This appears to be [type] because [evidence]"
|
|
86
|
+
|
|
87
|
+
**Threat Score (0-100):**
|
|
88
|
+
Calculate preliminary threat score based on IOCs and strings found.
|
|
89
|
+
|
|
90
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
91
|
+
██ PHASE 2: HIDDEN THREAT DISCOVERY ██
|
|
92
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
93
|
+
|
|
94
|
+
[STEP 2.1] Dormant Detector Analysis (Critical for APT/Backdoors)
|
|
95
|
+
```
|
|
96
|
+
dormant_detector("{filename}")
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This is your PRIMARY tool for finding hidden threats. Analyze results carefully:
|
|
100
|
+
|
|
101
|
+
**Orphan Functions (No Cross-References):**
|
|
102
|
+
- Why would legitimate code have unreferenced functions?
|
|
103
|
+
- Possible explanations: Dead code, conditional activation, backdoor
|
|
104
|
+
- Size matters: Small orphans (<50 bytes) = likely dead code
|
|
105
|
+
Large orphans (>100 bytes) = SUSPICIOUS, investigate!
|
|
106
|
+
|
|
107
|
+
**Magic Value Triggers:**
|
|
108
|
+
- Date/Time checks = Time bombs (activates on specific date)
|
|
109
|
+
- Environment checks = Targeted attacks (specific hostname/user)
|
|
110
|
+
- Network triggers = C2 activation conditions
|
|
111
|
+
|
|
112
|
+
[STEP 2.2] Library Identification & Filtering
|
|
113
|
+
```
|
|
114
|
+
match_libraries("{filename}")
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Why This Matters:**
|
|
118
|
+
- Standard library code is NOT interesting - filter it out!
|
|
119
|
+
- Focus only on CUSTOM code that's unique to this binary
|
|
120
|
+
- Low match percentage (< 50%) = Heavy custom code = More suspicious
|
|
121
|
+
|
|
122
|
+
[REASONING CHECKPOINT 2 - THREAT CONFIRMATION]
|
|
123
|
+
Update your hypothesis based on Phase 2 findings:
|
|
124
|
+
|
|
125
|
+
**Hidden Threat Assessment:**
|
|
126
|
+
Q7: Were orphan functions found? What do they appear to do?
|
|
127
|
+
Q8: Were magic value triggers found? What conditions activate them?
|
|
128
|
+
Q9: What percentage is standard library vs custom code?
|
|
129
|
+
Q10: Does this change your initial threat hypothesis? How?
|
|
130
|
+
|
|
131
|
+
**Confidence Level:**
|
|
132
|
+
- HIGH: Clear malicious indicators found
|
|
133
|
+
- MEDIUM: Suspicious but needs deeper analysis
|
|
134
|
+
- LOW: Appears benign but continue analysis
|
|
135
|
+
|
|
136
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
137
|
+
██ PHASE 3: DEEP BEHAVIORAL ANALYSIS ██
|
|
138
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
139
|
+
|
|
140
|
+
[STEP 3.1] Import Analysis - Capability Mapping
|
|
141
|
+
```
|
|
142
|
+
run_radare2("{filename}", "iij")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Map imports to MITRE ATT&CK techniques:
|
|
146
|
+
|
|
147
|
+
| Import Pattern | Capability | MITRE Technique |
|
|
148
|
+
|---------------|------------|-----------------|
|
|
149
|
+
| CreateProcess, ShellExecute | Execution | T1059 |
|
|
150
|
+
| RegSetValue, RegCreateKey | Persistence | T1547 |
|
|
151
|
+
| socket, connect, send | C2 Communication | T1071 |
|
|
152
|
+
| CryptEncrypt, CryptDecrypt | Data Encryption | T1486 |
|
|
153
|
+
| CreateToolhelp32Snapshot | Process Discovery | T1057 |
|
|
154
|
+
| VirtualAlloc, WriteProcessMemory | Process Injection | T1055 |
|
|
155
|
+
| IsDebuggerPresent, CheckRemoteDebugger | Anti-Analysis | T1622 |
|
|
156
|
+
|
|
157
|
+
[STEP 3.2] Cross-Reference Analysis for Suspicious APIs
|
|
158
|
+
For each dangerous API found, trace backwards:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
analyze_xrefs("{filename}", "CreateProcessW")
|
|
162
|
+
analyze_xrefs("{filename}", "VirtualAlloc")
|
|
163
|
+
analyze_xrefs("{filename}", "InternetOpenW")
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Think Like an Analyst:**
|
|
167
|
+
- WHO calls this dangerous function?
|
|
168
|
+
- WHAT data is passed to it?
|
|
169
|
+
- WHEN is it called? (startup, trigger, always?)
|
|
170
|
+
- HOW can this be weaponized?
|
|
171
|
+
|
|
172
|
+
[STEP 3.3] Execution Path Tracing (Sink Analysis)
|
|
173
|
+
```
|
|
174
|
+
trace_execution_path("{filename}", "system", max_depth=3)
|
|
175
|
+
trace_execution_path("{filename}", "connect", max_depth=3)
|
|
176
|
+
trace_execution_path("{filename}", "CryptEncrypt", max_depth=3)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Key Question:** Can untrusted input reach these dangerous sinks?
|
|
180
|
+
- If YES → Potential vulnerability or intentional malicious path
|
|
181
|
+
- If NO → Function may be used legitimately
|
|
182
|
+
|
|
183
|
+
[REASONING CHECKPOINT 3 - BEHAVIORAL PROFILE]
|
|
184
|
+
Build a complete behavioral profile:
|
|
185
|
+
|
|
186
|
+
**Capabilities Confirmed:**
|
|
187
|
+
Q11: What execution capabilities does this have?
|
|
188
|
+
Q12: What persistence mechanisms are implemented?
|
|
189
|
+
Q13: What data exfiltration methods exist?
|
|
190
|
+
Q14: What evasion techniques are present?
|
|
191
|
+
|
|
192
|
+
**Kill Chain Position:**
|
|
193
|
+
Where does this fit in the cyber kill chain?
|
|
194
|
+
[ ] Reconnaissance → [ ] Weaponization → [ ] Delivery →
|
|
195
|
+
[ ] Exploitation → [ ] Installation → [ ] C2 → [ ] Actions
|
|
196
|
+
|
|
197
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
198
|
+
██ PHASE 4: CODE-LEVEL DEEP DIVE ██
|
|
199
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
200
|
+
|
|
201
|
+
[STEP 4.1] Decompilation of Critical Functions
|
|
202
|
+
For each suspicious function identified in Phases 2-3:
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
smart_decompile("{filename}", "<suspicious_function_address>")
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
If the code is obfuscated or complex:
|
|
209
|
+
```
|
|
210
|
+
smart_decompile("{filename}", "<address>")
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Code Analysis Framework:**
|
|
214
|
+
When reading decompiled code, look for:
|
|
215
|
+
|
|
216
|
+
1. **String Decryption Routines:**
|
|
217
|
+
- XOR loops, Base64, custom encoding
|
|
218
|
+
- Key material (hardcoded or derived)
|
|
219
|
+
|
|
220
|
+
2. **Network Communication:**
|
|
221
|
+
- C2 server addresses (IP, domain)
|
|
222
|
+
- Protocol structure (HTTP, custom binary)
|
|
223
|
+
- Encryption/authentication
|
|
224
|
+
|
|
225
|
+
3. **Anti-Analysis Tricks:**
|
|
226
|
+
- Timing checks (GetTickCount differences)
|
|
227
|
+
- Environment detection (VM, sandbox, debugger)
|
|
228
|
+
- Self-modification (unpacking, decryption)
|
|
229
|
+
|
|
230
|
+
4. **Payload Delivery:**
|
|
231
|
+
- Download and execute patterns
|
|
232
|
+
- Process injection techniques
|
|
233
|
+
- Fileless execution methods
|
|
234
|
+
|
|
235
|
+
[STEP 4.2] Structure Recovery
|
|
236
|
+
For data-heavy malware (credential stealers, etc.):
|
|
237
|
+
```
|
|
238
|
+
recover_structures("{filename}", "<data_handling_function>")
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Look For:**
|
|
242
|
+
- Credential structures (username, password, url)
|
|
243
|
+
- Configuration structures (C2 list, encryption keys)
|
|
244
|
+
- Exfiltration buffers
|
|
245
|
+
|
|
246
|
+
[STEP 4.3] Emulation for Dynamic Behavior (If Needed)
|
|
247
|
+
If code appears to unpack or decrypt at runtime:
|
|
248
|
+
```
|
|
249
|
+
emulate_machine_code("{filename}", "<unpacking_function>", max_steps=1000)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Caution:** Only emulate small, contained routines.
|
|
253
|
+
|
|
254
|
+
[REASONING CHECKPOINT 4 - INTENT DETERMINATION]
|
|
255
|
+
Determine the TRUE PURPOSE of this binary:
|
|
256
|
+
|
|
257
|
+
Q15: What is the PRIMARY malicious function?
|
|
258
|
+
Q16: What is the SECONDARY function (if any)?
|
|
259
|
+
Q17: Is this a:
|
|
260
|
+
[ ] Dropper/Downloader → Delivers next stage
|
|
261
|
+
[ ] RAT/Backdoor → Persistent access
|
|
262
|
+
[ ] Stealer → Data theft
|
|
263
|
+
[ ] Ransomware → Encryption/extortion
|
|
264
|
+
[ ] Wiper → Destruction
|
|
265
|
+
[ ] Loader → Executes in-memory payloads
|
|
266
|
+
[ ] Rootkit → Stealth/persistence
|
|
267
|
+
[ ] Cryptominer → Resource theft
|
|
268
|
+
|
|
269
|
+
Q18: What's the sophistication level? (1-10)
|
|
270
|
+
1-3: Script kiddie / commodity malware
|
|
271
|
+
4-6: Professional cybercrime
|
|
272
|
+
7-9: Advanced threat actor / APT
|
|
273
|
+
10: Nation-state level
|
|
274
|
+
|
|
275
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
276
|
+
██ PHASE 5: DEFENSE ARTIFACT GENERATION ██
|
|
277
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
278
|
+
|
|
279
|
+
[STEP 5.1] Enhanced YARA Rule Generation (Low False Positive)
|
|
280
|
+
**IMPORTANT: Use enhanced YARA generator with structural conditions!**
|
|
281
|
+
|
|
282
|
+
Simple string-only rules have HIGH false positive rates.
|
|
283
|
+
Use `generate_enhanced_yara_rule` with structural conditions:
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
generate_enhanced_yara_rule(
|
|
287
|
+
"{filename}",
|
|
288
|
+
rule_name="Sample_Detection",
|
|
289
|
+
strings=["unique_string1", "unique_string2", "unique_string3"],
|
|
290
|
+
imports=["CryptEncrypt", "CreateServiceA"], # Optional but reduces FP
|
|
291
|
+
file_type="PE",
|
|
292
|
+
min_filesize=100000, # Minimum file size
|
|
293
|
+
max_filesize=5000000, # Maximum file size
|
|
294
|
+
section_names=[".rsrc"], # Required section names (optional)
|
|
295
|
+
)
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Good Enhanced YARA Signatures Include:**
|
|
299
|
+
- Unique strings (C2 domains, mutex names, registry keys)
|
|
300
|
+
- Structural conditions (PE header, file size range)
|
|
301
|
+
- Import table checks (at least 1-2 dangerous APIs)
|
|
302
|
+
- Minimum string match threshold (default: 2/3 of strings)
|
|
303
|
+
|
|
304
|
+
[STEP 5.2] MITRE ATT&CK Mapping with Confidence Levels
|
|
305
|
+
**CRITICAL: Every MITRE technique MUST have a confidence level!**
|
|
306
|
+
|
|
307
|
+
Use this format in your report:
|
|
308
|
+
| Technique ID | Name | Tactic | Confidence | Evidence |
|
|
309
|
+
|-------------|------|--------|------------|----------|
|
|
310
|
+
| T1486 | Data Encrypted for Impact | Impact | ✅ CONFIRMED | CryptEncrypt + ransom note strings |
|
|
311
|
+
| T1055 | Process Injection | Defense Evasion | 🟢 HIGH | VirtualAllocEx + WriteProcessMemory imports |
|
|
312
|
+
| T1570 | Lateral Tool Transfer | Lateral Movement | 🟡 MEDIUM | SMB API imports (no observed network activity) |
|
|
313
|
+
| T1021 | Remote Services | Lateral Movement | 🔴 LOW | Possible based on port 445 reference |
|
|
314
|
+
|
|
315
|
+
**Confidence Levels:**
|
|
316
|
+
- ✅ CONFIRMED: Multiple independent evidence sources
|
|
317
|
+
- 🟢 HIGH: Strong single evidence (observed or high-confidence inferred)
|
|
318
|
+
- 🟡 MEDIUM: Inferred from API/patterns (needs verification)
|
|
319
|
+
- 🔴 LOW: Possible based on weak indicators
|
|
320
|
+
|
|
321
|
+
[STEP 5.3] Vulnerability Hunter Report (Automated)
|
|
322
|
+
For comprehensive defense artifacts:
|
|
323
|
+
```
|
|
324
|
+
vulnerability_hunter("{filename}", mode="full")
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
This generates:
|
|
328
|
+
- Detection rules (YARA)
|
|
329
|
+
- Behavioral indicators
|
|
330
|
+
- Remediation recommendations
|
|
331
|
+
|
|
332
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
333
|
+
██ PHASE 6: FINAL SYNTHESIS & INTELLIGENCE REPORT ██
|
|
334
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
335
|
+
|
|
336
|
+
Synthesize ALL findings into a comprehensive intelligence report:
|
|
337
|
+
|
|
338
|
+
```markdown
|
|
339
|
+
# 🔬 Binary Analysis Intelligence Report
|
|
340
|
+
|
|
341
|
+
## Executive Summary
|
|
342
|
+
| Attribute | Value |
|
|
343
|
+
|-----------|-------|
|
|
344
|
+
| **File** | {filename} |
|
|
345
|
+
| **SHA256** | [hash] |
|
|
346
|
+
| **Verdict** | MALICIOUS / SUSPICIOUS / CLEAN |
|
|
347
|
+
| **Threat Type** | [Ransomware/RAT/Stealer/etc.] |
|
|
348
|
+
| **Sophistication** | [1-10] |
|
|
349
|
+
| **Confidence** | [HIGH/MEDIUM/LOW] |
|
|
350
|
+
|
|
351
|
+
## Threat Overview
|
|
352
|
+
**One-Line Summary:** [What this malware does in plain language]
|
|
353
|
+
|
|
354
|
+
**Detailed Description:**
|
|
355
|
+
[2-3 paragraphs explaining the malware's purpose, behavior, and impact]
|
|
356
|
+
|
|
357
|
+
## Technical Analysis
|
|
358
|
+
|
|
359
|
+
### File Characteristics
|
|
360
|
+
| Property | Value |
|
|
361
|
+
|----------|-------|
|
|
362
|
+
| Type | PE32/PE64/ELF |
|
|
363
|
+
| Compiler | MSVC/GCC/etc |
|
|
364
|
+
| Packed | Yes/No (packer name) |
|
|
365
|
+
| Size | X bytes |
|
|
366
|
+
| Entropy | X.XX |
|
|
367
|
+
|
|
368
|
+
### Capabilities (MITRE ATT&CK Mapping with Confidence)
|
|
369
|
+
| Technique ID | Technique Name | Tactic | Confidence | Evidence |
|
|
370
|
+
|-------------|----------------|--------|------------|----------|
|
|
371
|
+
| T1486 | Data Encrypted for Impact | Impact | ✅ CONFIRMED | [specific finding + source] |
|
|
372
|
+
| T1055 | Process Injection | Defense Evasion | 🟢 HIGH | [specific finding] |
|
|
373
|
+
| ... | ... | ... | ... | ... |
|
|
374
|
+
|
|
375
|
+
### Indicators of Compromise (IOCs)
|
|
376
|
+
**Network:**
|
|
377
|
+
- C2: [IP/domain]
|
|
378
|
+
- User-Agent: [string]
|
|
379
|
+
- URI Pattern: [path]
|
|
380
|
+
|
|
381
|
+
**Host:**
|
|
382
|
+
- Mutex: [name]
|
|
383
|
+
- Registry: [key]
|
|
384
|
+
- Files: [paths]
|
|
385
|
+
|
|
386
|
+
**Hashes:**
|
|
387
|
+
- SHA256: [hash]
|
|
388
|
+
- Imphash: [hash]
|
|
389
|
+
- SSDEEP: [hash]
|
|
390
|
+
|
|
391
|
+
### Hidden Threats Discovered
|
|
392
|
+
| Function | Address | Purpose | Trigger |
|
|
393
|
+
|----------|---------|---------|---------|
|
|
394
|
+
| [name] | 0x... | [purpose] | [condition] |
|
|
395
|
+
|
|
396
|
+
### Decompiled Code Highlights
|
|
397
|
+
```c
|
|
398
|
+
// Key malicious function
|
|
399
|
+
[relevant code snippet with comments]
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## Detection & Response
|
|
403
|
+
|
|
404
|
+
### YARA Rules
|
|
405
|
+
```yara
|
|
406
|
+
[generated YARA rule]
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Detection Opportunities
|
|
410
|
+
1. **Network:** [specific signatures]
|
|
411
|
+
2. **Endpoint:** [behavioral indicators]
|
|
412
|
+
3. **Memory:** [patterns to scan for]
|
|
413
|
+
|
|
414
|
+
### Remediation Steps
|
|
415
|
+
1. **Immediate:** [containment actions]
|
|
416
|
+
2. **Short-term:** [eradication steps]
|
|
417
|
+
3. **Long-term:** [prevention measures]
|
|
418
|
+
|
|
419
|
+
## Analyst Notes
|
|
420
|
+
- **Confidence Assessment:** [Detailed breakdown: X observed, Y inferred, Z possible]
|
|
421
|
+
- **Evidence Summary:**
|
|
422
|
+
- 🔍 Observed findings: [count] (highest confidence)
|
|
423
|
+
- 🔎 Inferred findings: [count] (medium-high confidence)
|
|
424
|
+
- ❓ Possible findings: [count] (requires verification)
|
|
425
|
+
- **Gaps in Analysis:** [what couldn't be determined and why]
|
|
426
|
+
- **Recommended Next Steps:** [additional analysis or dynamic analysis needed]
|
|
427
|
+
- **Recommended Next Steps:** [additional analysis needed]
|
|
428
|
+
|
|
429
|
+
## Appendix
|
|
430
|
+
- Full IOC list
|
|
431
|
+
- All function addresses analyzed
|
|
432
|
+
- Raw tool outputs (summarized)
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
436
|
+
██ EXECUTION INSTRUCTIONS ██
|
|
437
|
+
═══════════════════════════════════════════════════════════════════════════
|
|
438
|
+
|
|
439
|
+
BEGIN ANALYSIS NOW.
|
|
440
|
+
|
|
441
|
+
**Critical Guidelines:**
|
|
442
|
+
1. Execute Phase 1 tools first to build your initial hypothesis
|
|
443
|
+
2. At each REASONING CHECKPOINT, explicitly state your thinking
|
|
444
|
+
3. Update your hypothesis as new evidence emerges
|
|
445
|
+
4. Don't skip phases - each builds on the previous
|
|
446
|
+
5. Show confidence levels for each major conclusion
|
|
447
|
+
6. If you hit a dead end, explain why and adjust approach
|
|
448
|
+
|
|
449
|
+
**Quality Standards:**
|
|
450
|
+
- Every claim must have supporting evidence
|
|
451
|
+
- Every tool call must have a clear purpose
|
|
452
|
+
- Every finding must map to a threat or be explicitly ruled out
|
|
453
|
+
- The final report must be actionable for defenders
|
|
454
|
+
|
|
455
|
+
Remember: You are not just running tools - you are THINKING like an expert
|
|
456
|
+
malware analyst. Each finding should trigger new questions and hypotheses.
|
|
457
|
+
The goal is UNDERSTANDING, not just detection.
|
|
458
|
+
|
|
459
|
+
START PHASE 1 NOW.
|
|
460
|
+
"""
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def malware_analysis_mode(filename: str) -> str:
|
|
464
|
+
"""Focused analysis on Malware behaviors (Ransomware, Stealer, Backdoor)."""
|
|
465
|
+
return f"""
|
|
466
|
+
You are a Malware Analyst.
|
|
467
|
+
Analyze the file '{filename}' focusing on malicious behaviors and indicators of compromise (IOCs).
|
|
468
|
+
|
|
469
|
+
{LANGUAGE_RULE}
|
|
470
|
+
|
|
471
|
+
{DOCKER_PATH_RULE}
|
|
472
|
+
|
|
473
|
+
[CRITICAL: Evidence-Based Analysis]
|
|
474
|
+
==========================================
|
|
475
|
+
**Every finding MUST be labeled with an evidence level:**
|
|
476
|
+
|
|
477
|
+
🔍 [OBSERVED] - Directly observed (sandbox, Procmon, API trace)
|
|
478
|
+
Confidence: 100% - Use "detected", "confirmed", "확인됨"
|
|
479
|
+
|
|
480
|
+
🔎 [INFERRED] - Inferred from static analysis (imports, strings)
|
|
481
|
+
Confidence: 70-85% - Use "likely", "suggests", "추정됨"
|
|
482
|
+
|
|
483
|
+
❓ [POSSIBLE] - Possible based on patterns (needs verification)
|
|
484
|
+
Confidence: 40-60% - Use "may", "could", "가능성 있음"
|
|
485
|
+
|
|
486
|
+
[Analysis SOP]
|
|
487
|
+
1. Behavioral Triage:
|
|
488
|
+
- Check for Ransomware indicators (crypto constants, file enumeration) using `run_yara` and `run_strings`.
|
|
489
|
+
- Check for Stealer behaviors (browser paths, credential vaults) using `run_strings`.
|
|
490
|
+
- Check for Backdoor/C2 (socket APIs, connect, listen) using `run_radare2` imports.
|
|
491
|
+
→ Label each finding: [🔍 OBSERVED] or [🔎 INFERRED]
|
|
492
|
+
|
|
493
|
+
2. Evasion Detection:
|
|
494
|
+
- Use `dormant_detector` to find anti-analysis tricks (IsDebuggerPresent, sleep loops, time checks).
|
|
495
|
+
- Check for packing using `parse_binary_with_lief`.
|
|
496
|
+
→ Orphan functions = [❓ POSSIBLE] hidden behavior
|
|
497
|
+
|
|
498
|
+
3. Persistence Mechanism:
|
|
499
|
+
- Look for Registry keys (Run, RunOnce), Service creation, or Scheduled Tasks in strings or imports.
|
|
500
|
+
→ API import only = [🔎 INFERRED], Registry log = [🔍 OBSERVED]
|
|
501
|
+
|
|
502
|
+
4. Payload Analysis:
|
|
503
|
+
- Decompile suspicious functions using `smart_decompile` to understand the payload logic.
|
|
504
|
+
|
|
505
|
+
5. Reporting:
|
|
506
|
+
- Map behaviors to MITRE ATT&CK framework with confidence levels:
|
|
507
|
+
| Technique | Confidence | Evidence |
|
|
508
|
+
|-----------|------------|----------|
|
|
509
|
+
| T1486 | ✅ CONFIRMED | CryptEncrypt + ransom note |
|
|
510
|
+
| T1055 | 🟢 HIGH | VirtualAllocEx import |
|
|
511
|
+
|
|
512
|
+
- Extract all IOCs (C2, Hashes, Mutexes).
|
|
513
|
+
- Generate enhanced YARA rule: `generate_enhanced_yara_rule()` with structural conditions.
|
|
514
|
+
"""
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def basic_analysis_mode(filename: str) -> str:
|
|
518
|
+
"""Rapid analysis mode that quickly identifies basic static analysis and threat elements."""
|
|
519
|
+
return f"""
|
|
520
|
+
You are a Reverse Engineering Security Analyst.
|
|
521
|
+
Perform 'Rapid Static Analysis' on the file '{filename}' to identify initial threats.
|
|
522
|
+
|
|
523
|
+
{LANGUAGE_RULE}
|
|
524
|
+
|
|
525
|
+
{DOCKER_PATH_RULE}
|
|
526
|
+
|
|
527
|
+
[Analysis SOP (Standard Operating Procedure)]
|
|
528
|
+
Never use time-consuming deep analysis tools (Ghidra, Decompile, Emulation).
|
|
529
|
+
Use only the following lightweight tools to get results quickly:
|
|
530
|
+
|
|
531
|
+
0. Packer Detection (FIRST!):
|
|
532
|
+
- `detect_packer("{filename}")`: Check for packer/compiler/protector.
|
|
533
|
+
- If packed → Note packer name and consider unpacking before deep analysis.
|
|
534
|
+
|
|
535
|
+
1. Identification:
|
|
536
|
+
- `run_file("{filename}")`: Identify the exact file type.
|
|
537
|
+
- `parse_binary_with_lief("{filename}")`: Check binary structure, entropy, and section information to determine packing status.
|
|
538
|
+
|
|
539
|
+
2. Strings & IOCs Analysis:
|
|
540
|
+
- `run_strings("{filename}", min_length=5)`: Extract meaningful strings.
|
|
541
|
+
- Based on the results, run `extract_iocs` to identify C2 IPs, URLs, emails, Bitcoin addresses, etc.
|
|
542
|
+
|
|
543
|
+
3. API & Capabilities Summary:
|
|
544
|
+
- `run_radare2("{filename}", "ii")`: Quickly list import functions to infer the file's main behavior (network connection, file manipulation, etc.).
|
|
545
|
+
|
|
546
|
+
4. Quick Triage Report:
|
|
547
|
+
- Summarize the file's identity, major IOCs found, and suspicious API behaviors.
|
|
548
|
+
- Estimate the probability of the file being malicious (High/Medium/Low).
|
|
549
|
+
- Advise the next step:
|
|
550
|
+
* General Malware -> `malware_analysis_mode`
|
|
551
|
+
* Complex/Hidden Threats -> `full_analysis_mode` or `apt_hunting_mode`
|
|
552
|
+
* Game/Firmware -> Specialized modes
|
|
553
|
+
"""
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def apt_hunting_mode(filename: str) -> str:
|
|
557
|
+
"""Advanced Persistent Threat (APT) detection using Dormant Detector and Smart Decompiler."""
|
|
558
|
+
return f"""
|
|
559
|
+
You are an APT Hunter - specialized in detecting sophisticated, state-sponsored malware.
|
|
560
|
+
Analyze '{filename}' for APT indicators using advanced signature technologies.
|
|
561
|
+
|
|
562
|
+
{LANGUAGE_RULE}
|
|
563
|
+
|
|
564
|
+
{DOCKER_PATH_RULE}
|
|
565
|
+
|
|
566
|
+
[CRITICAL: Evidence-Based Analysis]
|
|
567
|
+
==========================================
|
|
568
|
+
APT hunting requires RIGOROUS evidence standards. Never speculate without evidence.
|
|
569
|
+
|
|
570
|
+
🔍 [OBSERVED] - Dynamic analysis confirmed (sandbox, memory forensics)
|
|
571
|
+
Example: "Network capture shows C2 beacon to 1.2.3.4:443"
|
|
572
|
+
|
|
573
|
+
🔎 [INFERRED] - High-confidence static analysis
|
|
574
|
+
Example: "Custom XOR encryption routine at 0x401000"
|
|
575
|
+
|
|
576
|
+
❓ [POSSIBLE] - Pattern matching, needs verification
|
|
577
|
+
Example: "Code similarity with APT29 tooling"
|
|
578
|
+
|
|
579
|
+
**Attribution requires MULTIPLE [🔍 OBSERVED] + [🔎 INFERRED] findings!**
|
|
580
|
+
|
|
581
|
+
[APT Hunting SOP]
|
|
582
|
+
|
|
583
|
+
1. Dormant Detector Analysis (Primary Detection):
|
|
584
|
+
Use `dormant_detector("{filename}")` to find APT characteristics:
|
|
585
|
+
- Orphan Functions: APTs often hide backdoors in unused code paths [❓ POSSIBLE]
|
|
586
|
+
- Magic Value Triggers: Look for date/time bombs or environment checks [🔎 INFERRED]
|
|
587
|
+
- Conditional Execution: APT malware activates only in specific conditions
|
|
588
|
+
|
|
589
|
+
2. Smart Decompiler Refinement:
|
|
590
|
+
For each suspicious function from Dormant Detector:
|
|
591
|
+
- Run `smart_decompile("{filename}", address)`
|
|
592
|
+
- Analyze refined code for APT patterns
|
|
593
|
+
|
|
594
|
+
3. MITRE ATT&CK with Confidence Levels:
|
|
595
|
+
| Technique ID | Name | Confidence | Evidence Source |
|
|
596
|
+
|-------------|------|------------|------------------|
|
|
597
|
+
| T1055 | Process Injection | 🟢 HIGH | [🔎 INFERRED] VirtualAllocEx+WriteProcessMemory |
|
|
598
|
+
| T1071.001 | HTTPS C2 | ✅ CONFIRMED | [🔍 OBSERVED] PCAP + [🔎 INFERRED] imports |
|
|
599
|
+
| T1070.006 | Timestomping | 🟡 MEDIUM | [🔎 INFERRED] SetFileTime import |
|
|
600
|
+
|
|
601
|
+
4. APT Attribution Standards:
|
|
602
|
+
- NEVER attribute without multiple independent evidence sources
|
|
603
|
+
- Use "Code similarities suggest" not "This is APT29"
|
|
604
|
+
- List evidence explicitly for any attribution claim
|
|
605
|
+
|
|
606
|
+
5. Defense Generation:
|
|
607
|
+
If APT confirmed:
|
|
608
|
+
- Use `generate_enhanced_yara_rule()` with structural conditions
|
|
609
|
+
- Document TTPs with evidence levels
|
|
610
|
+
- Create IOC list with confidence ratings
|
|
611
|
+
|
|
612
|
+
[Report Format]
|
|
613
|
+
|
|
614
|
+
## 🎯 APT Hunting Report
|
|
615
|
+
|
|
616
|
+
### Evidence Summary
|
|
617
|
+
| Level | Count | Examples |
|
|
618
|
+
|-------|-------|----------|
|
|
619
|
+
| 🔍 OBSERVED | X | (list key findings) |
|
|
620
|
+
| 🔎 INFERRED | Y | (list key findings) |
|
|
621
|
+
| ❓ POSSIBLE | Z | (list hypotheses) |
|
|
622
|
+
|
|
623
|
+
### Dormant Detector Findings
|
|
624
|
+
- Orphan Functions: [count] [❓ POSSIBLE hidden functionality]
|
|
625
|
+
- Logic Bombs: [triggers found] [🔎 INFERRED/🔍 OBSERVED]
|
|
626
|
+
- Emulation Results: [ESIL verification] [🔍 OBSERVED]
|
|
627
|
+
|
|
628
|
+
### APT Assessment
|
|
629
|
+
- Sophistication Level: [1-10] (evidence-based)
|
|
630
|
+
- Attribution: ["Possible APT29" or "Unknown - insufficient evidence"]
|
|
631
|
+
- Confidence: [✅ CONFIRMED / 🟢 HIGH / 🟡 MEDIUM / 🔴 LOW]
|
|
632
|
+
- Key Evidence: [list of evidence supporting attribution]
|
|
633
|
+
|
|
634
|
+
Begin APT analysis now.
|
|
635
|
+
"""
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
def vulnerability_hunter_mode(filename: str) -> str:
|
|
639
|
+
"""Automated 3-phase threat detection and defense generation (DISCOVER → UNDERSTAND → NEUTRALIZE)."""
|
|
640
|
+
return f"""
|
|
641
|
+
You are a Vulnerability Hunter System Operator - an elite automated threat hunter.
|
|
642
|
+
Execute a complete defense automation workflow on '{filename}' using Vulnerability Hunter System.
|
|
643
|
+
|
|
644
|
+
{LANGUAGE_RULE}
|
|
645
|
+
|
|
646
|
+
{DOCKER_PATH_RULE}
|
|
647
|
+
|
|
648
|
+
[Vulnerability Hunter SOP - 3 Phase Pipeline]
|
|
649
|
+
|
|
650
|
+
OPTION 1: Full Automation (Recommended)
|
|
651
|
+
----------------------------------------
|
|
652
|
+
Use `vulnerability_hunter("{filename}", mode="full")` for complete automation:
|
|
653
|
+
- Phase 1 (DISCOVER): Dormant Detector finds hidden threats
|
|
654
|
+
- Phase 2 (UNDERSTAND): Smart Decompiler analyzes intent
|
|
655
|
+
- Phase 3 (NEUTRALIZE): Adaptive Vaccine generates defenses
|
|
656
|
+
|
|
657
|
+
This single command will:
|
|
658
|
+
1. Scan for orphan functions and logic bombs
|
|
659
|
+
2. Analyze suspicious code with AI-powered decompilation
|
|
660
|
+
3. Generate YARA rules and provide actionable recommendations
|
|
661
|
+
4. Return a comprehensive threat report with confidence scores
|
|
662
|
+
|
|
663
|
+
OPTION 2: Step-by-Step (For Complex Analysis)
|
|
664
|
+
----------------------------------------------
|
|
665
|
+
If you need granular control, execute phases manually:
|
|
666
|
+
|
|
667
|
+
Phase 1 - DISCOVER:
|
|
668
|
+
- `dormant_detector("{filename}")` → Find hidden threats
|
|
669
|
+
- Review orphan_functions and suspicious_logic in results
|
|
670
|
+
- Identify high-priority targets for Phase 2
|
|
671
|
+
|
|
672
|
+
Phase 2 - UNDERSTAND:
|
|
673
|
+
For each threat found in Phase 1:
|
|
674
|
+
- `smart_decompile("{filename}", address)` → Get readable code
|
|
675
|
+
- Analyze the refined_code to understand intent
|
|
676
|
+
- Look for patterns: backdoor, time_bomb, data_exfiltration
|
|
677
|
+
|
|
678
|
+
Phase 3 - NEUTRALIZE:
|
|
679
|
+
For confirmed threats:
|
|
680
|
+
- `adaptive_vaccine(threat_report, action="yara")` → Generate detection rule
|
|
681
|
+
- Deploy YARA rules to endpoints
|
|
682
|
+
- Follow recommendations from Vulnerability Hunter report
|
|
683
|
+
|
|
684
|
+
[Output Requirements]
|
|
685
|
+
Present results in this format:
|
|
686
|
+
|
|
687
|
+
## 🔱 Vulnerability Hunter Analysis Report
|
|
688
|
+
|
|
689
|
+
### Phase 1: Discovery Results
|
|
690
|
+
- Threats Discovered: [count]
|
|
691
|
+
- Orphan Functions: [list]
|
|
692
|
+
- Suspicious Logic: [list]
|
|
693
|
+
|
|
694
|
+
### Phase 2: Threat Understanding
|
|
695
|
+
For each threat:
|
|
696
|
+
- Function: [name @ address]
|
|
697
|
+
- Intent: [backdoor/time_bomb/etc.]
|
|
698
|
+
- Confidence: [0.0-1.0]
|
|
699
|
+
- Key Code Snippet: [refined code]
|
|
700
|
+
|
|
701
|
+
### Phase 3: Defense Measures
|
|
702
|
+
- YARA Rules Generated: [count]
|
|
703
|
+
- Recommendations:
|
|
704
|
+
* Immediate Actions
|
|
705
|
+
* Investigation Steps
|
|
706
|
+
* Remediation Plan
|
|
707
|
+
|
|
708
|
+
### Final Verdict
|
|
709
|
+
- Overall Risk: CRITICAL/HIGH/MEDIUM/LOW
|
|
710
|
+
- Recommended Actions: [priority list]
|
|
711
|
+
|
|
712
|
+
Start Vulnerability Hunter System now.
|
|
713
|
+
"""
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
def unpacking_mode(filename: str) -> str:
|
|
717
|
+
"""Guide for unpacking packed binaries (UPX, Themida, VMProtect, custom packers)."""
|
|
718
|
+
return f"""
|
|
719
|
+
You are an Expert Binary Unpacker with deep knowledge of packing techniques.
|
|
720
|
+
Your mission: Analyze and unpack '{filename}' to reveal the original code.
|
|
721
|
+
|
|
722
|
+
{LANGUAGE_RULE}
|
|
723
|
+
|
|
724
|
+
{DOCKER_PATH_RULE}
|
|
725
|
+
|
|
726
|
+
[PHASE 1: PACKER IDENTIFICATION]
|
|
727
|
+
================================
|
|
728
|
+
|
|
729
|
+
1. Detect Packer Type:
|
|
730
|
+
```
|
|
731
|
+
detect_packer("{filename}")
|
|
732
|
+
detect_packer_deep("{filename}")
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
2. Analyze Packing Indicators:
|
|
736
|
+
```
|
|
737
|
+
parse_binary_with_lief("{filename}")
|
|
738
|
+
```
|
|
739
|
+
Look for:
|
|
740
|
+
- High entropy sections (> 7.0) = packed/encrypted
|
|
741
|
+
- Suspicious section names (.UPX, .themida, .vmp)
|
|
742
|
+
- Small code section + large data section
|
|
743
|
+
- Modified PE header
|
|
744
|
+
|
|
745
|
+
[PHASE 2: UNPACKING STRATEGY]
|
|
746
|
+
============================
|
|
747
|
+
|
|
748
|
+
Based on packer type, choose approach:
|
|
749
|
+
|
|
750
|
+
**UPX (Simple)**
|
|
751
|
+
- Try: `upx -d {filename} -o unpacked.exe`
|
|
752
|
+
- If modified UPX: Manual OEP finding
|
|
753
|
+
|
|
754
|
+
**Themida/VMProtect (Complex)**
|
|
755
|
+
- Cannot be statically unpacked
|
|
756
|
+
- Strategy: Dynamic unpacking (dump at OEP)
|
|
757
|
+
- Look for: VM handler patterns, virtualized code
|
|
758
|
+
|
|
759
|
+
**Custom Packer**
|
|
760
|
+
- Analyze unpacking stub:
|
|
761
|
+
```
|
|
762
|
+
smart_decompile("{filename}", "entry0")
|
|
763
|
+
```
|
|
764
|
+
- Find decryption loop and OEP jump
|
|
765
|
+
|
|
766
|
+
3. Common Unpacking Indicators:
|
|
767
|
+
- VirtualAlloc + WriteProcessMemory = code injection
|
|
768
|
+
- GetProcAddress + LoadLibrary = dynamic API resolution
|
|
769
|
+
- Large XOR/ADD loops = decryption routine
|
|
770
|
+
|
|
771
|
+
[PHASE 3: OEP (Original Entry Point) FINDING]
|
|
772
|
+
=============================================
|
|
773
|
+
|
|
774
|
+
For manual unpacking:
|
|
775
|
+
|
|
776
|
+
1. Trace entry point:
|
|
777
|
+
```
|
|
778
|
+
run_radare2("{filename}", "pdf @ entry0")
|
|
779
|
+
```
|
|
780
|
+
|
|
781
|
+
2. Look for patterns:
|
|
782
|
+
- PUSHAD ... POPAD (classic packer pattern)
|
|
783
|
+
- Large jump to different section
|
|
784
|
+
- Self-modifying code
|
|
785
|
+
|
|
786
|
+
3. Common OEP patterns by compiler:
|
|
787
|
+
| Compiler | OEP Pattern |
|
|
788
|
+
|----------|-------------|
|
|
789
|
+
| MSVC | call __security_init_cookie |
|
|
790
|
+
| Delphi | push ebp; mov ebp, esp; add esp, -XX |
|
|
791
|
+
| Borland | push ebp; mov ebp, esp; push ebx |
|
|
792
|
+
|
|
793
|
+
[REPORT FORMAT]
|
|
794
|
+
===============
|
|
795
|
+
|
|
796
|
+
## 📦 Unpacking Analysis Report
|
|
797
|
+
|
|
798
|
+
### Packer Identification
|
|
799
|
+
- Packer: [name and version]
|
|
800
|
+
- Confidence: [HIGH/MEDIUM/LOW]
|
|
801
|
+
- Complexity: [Simple/Moderate/Complex/Extreme]
|
|
802
|
+
|
|
803
|
+
### Entry Point Analysis
|
|
804
|
+
- Packed Entry: 0x...
|
|
805
|
+
- Suspected OEP: 0x... (if found)
|
|
806
|
+
|
|
807
|
+
### Unpacking Strategy
|
|
808
|
+
- Method: [Automatic/Manual/Dynamic]
|
|
809
|
+
- Steps: [detailed instructions]
|
|
810
|
+
|
|
811
|
+
### Recommendations
|
|
812
|
+
- [ ] Suitable tool for unpacking
|
|
813
|
+
- [ ] Expected challenges
|
|
814
|
+
- [ ] Alternative approaches
|
|
815
|
+
|
|
816
|
+
Begin unpacking analysis now.
|
|
817
|
+
"""
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
def c2_extraction_mode(filename: str) -> str:
|
|
821
|
+
"""Specialized analysis for extracting C2 (Command & Control) server information."""
|
|
822
|
+
return f"""
|
|
823
|
+
You are a C2 Infrastructure Analyst specializing in extracting command and control details.
|
|
824
|
+
Your mission: Extract ALL C2 communication details from '{filename}'.
|
|
825
|
+
|
|
826
|
+
{LANGUAGE_RULE}
|
|
827
|
+
|
|
828
|
+
{DOCKER_PATH_RULE}
|
|
829
|
+
|
|
830
|
+
[PHASE 1: NETWORK INDICATOR EXTRACTION]
|
|
831
|
+
======================================
|
|
832
|
+
|
|
833
|
+
1. Extract All IOCs:
|
|
834
|
+
```
|
|
835
|
+
extract_iocs("{filename}")
|
|
836
|
+
run_strings("{filename}", min_length=6)
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
2. Look for network patterns in strings:
|
|
840
|
+
- IP addresses (IPv4/IPv6)
|
|
841
|
+
- Domain names (especially DGA patterns)
|
|
842
|
+
- URLs (HTTP/HTTPS endpoints)
|
|
843
|
+
- Port numbers (common: 80, 443, 4444, 8080)
|
|
844
|
+
|
|
845
|
+
3. Check for encoded/encrypted C2:
|
|
846
|
+
- Base64 encoded strings
|
|
847
|
+
- XOR encrypted configs
|
|
848
|
+
- Custom encoding schemes
|
|
849
|
+
|
|
850
|
+
[PHASE 2: NETWORK API ANALYSIS]
|
|
851
|
+
===============================
|
|
852
|
+
|
|
853
|
+
1. Identify network imports:
|
|
854
|
+
```
|
|
855
|
+
run_radare2("{filename}", "iij")
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
Key APIs to find:
|
|
859
|
+
| API | Purpose |
|
|
860
|
+
|-----|---------|
|
|
861
|
+
| socket, connect | Raw socket C2 |
|
|
862
|
+
| InternetOpen, HttpSendRequest | HTTP C2 |
|
|
863
|
+
| WSAStartup, send, recv | Winsock C2 |
|
|
864
|
+
| WinHttpOpen | WinHTTP C2 |
|
|
865
|
+
| DnsQuery | DNS tunneling |
|
|
866
|
+
|
|
867
|
+
2. Trace C2 initialization:
|
|
868
|
+
```
|
|
869
|
+
analyze_xrefs("{filename}", "connect")
|
|
870
|
+
analyze_xrefs("{filename}", "InternetOpenA")
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
[PHASE 3: C2 COMMUNICATION PROTOCOL]
|
|
874
|
+
===================================
|
|
875
|
+
|
|
876
|
+
1. Decompile C2 functions:
|
|
877
|
+
```
|
|
878
|
+
smart_decompile("{filename}", "<network_function>")
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
2. Identify protocol characteristics:
|
|
882
|
+
- Request format (JSON, binary, custom)
|
|
883
|
+
- Authentication/encryption
|
|
884
|
+
- Beacon interval patterns
|
|
885
|
+
- Command structure
|
|
886
|
+
|
|
887
|
+
3. Look for C2 config structures:
|
|
888
|
+
```
|
|
889
|
+
recover_structures("{filename}", "<config_function>")
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
[PHASE 4: C2 INFRASTRUCTURE MAPPING]
|
|
893
|
+
===================================
|
|
894
|
+
|
|
895
|
+
Document the complete C2 infrastructure:
|
|
896
|
+
|
|
897
|
+
1. Primary C2 servers
|
|
898
|
+
2. Fallback/backup servers
|
|
899
|
+
3. DGA seeds (if applicable)
|
|
900
|
+
4. Proxy/relay nodes
|
|
901
|
+
5. Dead drop resolvers
|
|
902
|
+
|
|
903
|
+
[REPORT FORMAT]
|
|
904
|
+
===============
|
|
905
|
+
|
|
906
|
+
## 🌐 C2 Extraction Report
|
|
907
|
+
|
|
908
|
+
### C2 Servers Identified
|
|
909
|
+
| Type | Value | Port | Protocol | Confidence |
|
|
910
|
+
|------|-------|------|----------|------------|
|
|
911
|
+
| Primary | IP/Domain | Port | HTTP/TCP | HIGH/MED |
|
|
912
|
+
| Backup | IP/Domain | Port | ... | ... |
|
|
913
|
+
|
|
914
|
+
### Communication Protocol
|
|
915
|
+
- Transport: HTTP/HTTPS/TCP/UDP/DNS
|
|
916
|
+
- Format: JSON/Binary/Custom
|
|
917
|
+
- Encryption: [method if any]
|
|
918
|
+
- Beacon Interval: [time pattern]
|
|
919
|
+
|
|
920
|
+
### Command Structure
|
|
921
|
+
| Command ID | Purpose | Parameters |
|
|
922
|
+
|------------|---------|------------|
|
|
923
|
+
| 0x01 | ... | ... |
|
|
924
|
+
|
|
925
|
+
### DGA Analysis (if applicable)
|
|
926
|
+
- Seed: [value]
|
|
927
|
+
- Algorithm: [description]
|
|
928
|
+
- Generated Domains: [sample list]
|
|
929
|
+
|
|
930
|
+
### IOCs for Blocking
|
|
931
|
+
```
|
|
932
|
+
# Network IOCs
|
|
933
|
+
[list of IPs, domains, URLs]
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
Begin C2 extraction now.
|
|
937
|
+
"""
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
def ransomware_triage_mode(filename: str) -> str:
|
|
941
|
+
"""Specialized analysis for ransomware - encryption, keys, recovery potential."""
|
|
942
|
+
return f"""
|
|
943
|
+
You are a Ransomware Response Specialist.
|
|
944
|
+
Your mission: Analyze '{filename}' to assess encryption strength and recovery possibility.
|
|
945
|
+
|
|
946
|
+
{LANGUAGE_RULE}
|
|
947
|
+
|
|
948
|
+
{DOCKER_PATH_RULE}
|
|
949
|
+
|
|
950
|
+
⚠️ CRITICAL: This is time-sensitive incident response!
|
|
951
|
+
Focus on: Can victims recover their files WITHOUT paying?
|
|
952
|
+
|
|
953
|
+
[PHASE 1: RANSOMWARE IDENTIFICATION]
|
|
954
|
+
===================================
|
|
955
|
+
|
|
956
|
+
1. Initial Triage:
|
|
957
|
+
```
|
|
958
|
+
detect_packer("{filename}")
|
|
959
|
+
run_file("{filename}")
|
|
960
|
+
run_strings("{filename}", min_length=5)
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
2. Look for ransomware indicators:
|
|
964
|
+
- Ransom note text ("Your files are encrypted", "Bitcoin", "decrypt")
|
|
965
|
+
- File extension patterns (.encrypted, .locked, .cry)
|
|
966
|
+
- Known ransomware family signatures
|
|
967
|
+
|
|
968
|
+
3. Check YARA rules:
|
|
969
|
+
```
|
|
970
|
+
run_yara("{filename}", "ransomware_rules.yar")
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
[PHASE 2: ENCRYPTION ANALYSIS]
|
|
974
|
+
=============================
|
|
975
|
+
|
|
976
|
+
1. Identify crypto imports:
|
|
977
|
+
```
|
|
978
|
+
run_radare2("{filename}", "iij")
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
Key APIs:
|
|
982
|
+
| API | Implication |
|
|
983
|
+
|-----|-------------|
|
|
984
|
+
| CryptEncrypt | Windows Crypto API |
|
|
985
|
+
| CryptGenKey | Key generation |
|
|
986
|
+
| CryptAcquireContext | Crypto provider |
|
|
987
|
+
| BCryptEncrypt | Modern crypto |
|
|
988
|
+
| OpenSSL functions | OpenSSL crypto |
|
|
989
|
+
|
|
990
|
+
2. Look for crypto constants:
|
|
991
|
+
- AES S-boxes
|
|
992
|
+
- RSA public exponents (0x10001)
|
|
993
|
+
- ChaCha20 constants
|
|
994
|
+
- Salsa20 sigma
|
|
995
|
+
|
|
996
|
+
3. Analyze encryption routine:
|
|
997
|
+
```
|
|
998
|
+
smart_decompile("{filename}", "<crypto_function>")
|
|
999
|
+
```
|
|
1000
|
+
|
|
1001
|
+
[PHASE 3: KEY RECOVERY ASSESSMENT]
|
|
1002
|
+
=================================
|
|
1003
|
+
|
|
1004
|
+
**Recovery Possibility Checklist:**
|
|
1005
|
+
|
|
1006
|
+
✅ POSSIBLE RECOVERY if:
|
|
1007
|
+
- [ ] Key derived from predictable seed (time, hostname)
|
|
1008
|
+
- [ ] Key hardcoded in binary
|
|
1009
|
+
- [ ] Weak RNG used (CRT rand(), GetTickCount)
|
|
1010
|
+
- [ ] Key stored locally before C2 contact
|
|
1011
|
+
- [ ] Implementation bugs (ECB mode, key reuse)
|
|
1012
|
+
|
|
1013
|
+
❌ UNLIKELY RECOVERY if:
|
|
1014
|
+
- [ ] RSA + AES hybrid with online key
|
|
1015
|
+
- [ ] Keys sent to C2 before encryption
|
|
1016
|
+
- [ ] Strong RNG (CryptGenRandom, /dev/urandom)
|
|
1017
|
+
- [ ] Proper implementation (CBC/GCM, unique IVs)
|
|
1018
|
+
|
|
1019
|
+
1. Check for key material:
|
|
1020
|
+
```
|
|
1021
|
+
run_strings("{filename}", min_length=16)
|
|
1022
|
+
```
|
|
1023
|
+
Look for: Base64 keys, hex strings (32/64 chars)
|
|
1024
|
+
|
|
1025
|
+
2. Analyze key generation:
|
|
1026
|
+
```
|
|
1027
|
+
analyze_xrefs("{filename}", "CryptGenKey")
|
|
1028
|
+
smart_decompile("{filename}", "<keygen_function>")
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
[PHASE 4: FILE TARGETING ANALYSIS]
|
|
1032
|
+
=================================
|
|
1033
|
+
|
|
1034
|
+
1. What files are targeted?
|
|
1035
|
+
- File extensions (docs, images, databases)
|
|
1036
|
+
- Directory exclusions (Windows, Program Files)
|
|
1037
|
+
|
|
1038
|
+
2. Encryption scope:
|
|
1039
|
+
- Full file encryption
|
|
1040
|
+
- Partial (first N bytes)
|
|
1041
|
+
- Alternating blocks
|
|
1042
|
+
|
|
1043
|
+
[REPORT FORMAT]
|
|
1044
|
+
===============
|
|
1045
|
+
|
|
1046
|
+
## 🔐 Ransomware Triage Report
|
|
1047
|
+
|
|
1048
|
+
### Executive Summary
|
|
1049
|
+
| Attribute | Value |
|
|
1050
|
+
|-----------|-------|
|
|
1051
|
+
| Family | [known family or "Unknown"] |
|
|
1052
|
+
| Recovery Possible | ✅ YES / ⚠️ MAYBE / ❌ NO |
|
|
1053
|
+
| Encryption | [algorithm] |
|
|
1054
|
+
| Key Type | [symmetric/asymmetric/hybrid] |
|
|
1055
|
+
|
|
1056
|
+
### Encryption Details
|
|
1057
|
+
- Algorithm: AES-256-CBC / RSA-2048 / ChaCha20 / etc.
|
|
1058
|
+
- Mode: ECB / CBC / GCM / CTR
|
|
1059
|
+
- Key Generation: [method]
|
|
1060
|
+
- IV/Nonce: [handling]
|
|
1061
|
+
|
|
1062
|
+
### Recovery Assessment
|
|
1063
|
+
**Confidence: [HIGH/MEDIUM/LOW]**
|
|
1064
|
+
|
|
1065
|
+
Weaknesses Found:
|
|
1066
|
+
- [ ] [weakness 1 with evidence]
|
|
1067
|
+
- [ ] [weakness 2 with evidence]
|
|
1068
|
+
|
|
1069
|
+
Recovery Steps (if possible):
|
|
1070
|
+
1. [step 1]
|
|
1071
|
+
2. [step 2]
|
|
1072
|
+
|
|
1073
|
+
### IOCs
|
|
1074
|
+
- Ransom note: [filename]
|
|
1075
|
+
- Extension: [.xxx]
|
|
1076
|
+
- Mutex: [name]
|
|
1077
|
+
- Registry: [keys]
|
|
1078
|
+
|
|
1079
|
+
### Recommendations
|
|
1080
|
+
1. **Immediate**: [containment steps]
|
|
1081
|
+
2. **Recovery**: [decryption options]
|
|
1082
|
+
3. **Prevention**: [future protection]
|
|
1083
|
+
|
|
1084
|
+
Begin ransomware triage now. TIME IS CRITICAL!
|
|
1085
|
+
"""
|
|
1086
|
+
|
|
1087
|
+
|
|
1088
|
+
def code_similarity_mode(filename: str) -> str:
|
|
1089
|
+
"""Binary similarity analysis for variant detection and clustering."""
|
|
1090
|
+
return f"""
|
|
1091
|
+
You are a Binary Similarity Analyst specializing in malware variant identification.
|
|
1092
|
+
Your mission: Analyze '{filename}' to identify code similarities with known families.
|
|
1093
|
+
|
|
1094
|
+
{LANGUAGE_RULE}
|
|
1095
|
+
|
|
1096
|
+
{DOCKER_PATH_RULE}
|
|
1097
|
+
|
|
1098
|
+
[PHASE 1: SIGNATURE GENERATION]
|
|
1099
|
+
==============================
|
|
1100
|
+
|
|
1101
|
+
1. Generate unique signatures:
|
|
1102
|
+
```
|
|
1103
|
+
generate_signature("{filename}", "entry0")
|
|
1104
|
+
parse_binary_with_lief("{filename}")
|
|
1105
|
+
```
|
|
1106
|
+
|
|
1107
|
+
2. Extract identifying features:
|
|
1108
|
+
- Import hash (imphash)
|
|
1109
|
+
- Section hashes
|
|
1110
|
+
- Rich header hash
|
|
1111
|
+
- TLSH (Trend Micro Locality Sensitive Hash)
|
|
1112
|
+
|
|
1113
|
+
3. Get function-level hashes:
|
|
1114
|
+
```
|
|
1115
|
+
run_radare2("{filename}", "afl")
|
|
1116
|
+
```
|
|
1117
|
+
|
|
1118
|
+
[PHASE 2: LIBRARY IDENTIFICATION]
|
|
1119
|
+
================================
|
|
1120
|
+
|
|
1121
|
+
1. Match against known libraries:
|
|
1122
|
+
```
|
|
1123
|
+
match_libraries("{filename}")
|
|
1124
|
+
```
|
|
1125
|
+
|
|
1126
|
+
2. Calculate custom code percentage:
|
|
1127
|
+
- High custom % = likely unique malware
|
|
1128
|
+
- Low custom % = mostly standard code
|
|
1129
|
+
|
|
1130
|
+
[PHASE 3: VARIANT COMPARISON]
|
|
1131
|
+
============================
|
|
1132
|
+
|
|
1133
|
+
If comparing with another sample:
|
|
1134
|
+
```
|
|
1135
|
+
diff_binaries("{filename}", "<comparison_file>")
|
|
1136
|
+
analyze_variant_changes("{filename}", "<comparison_file>")
|
|
1137
|
+
```
|
|
1138
|
+
|
|
1139
|
+
Look for:
|
|
1140
|
+
- Function additions/removals
|
|
1141
|
+
- String changes (C2, versions)
|
|
1142
|
+
- Behavior modifications
|
|
1143
|
+
- Packer changes
|
|
1144
|
+
|
|
1145
|
+
[PHASE 4: FAMILY ATTRIBUTION]
|
|
1146
|
+
============================
|
|
1147
|
+
|
|
1148
|
+
Based on collected signatures:
|
|
1149
|
+
|
|
1150
|
+
1. Compare with known families:
|
|
1151
|
+
| Feature | This Sample | Known Family |
|
|
1152
|
+
|---------|-------------|--------------|
|
|
1153
|
+
| Imphash | xxx | yyy |
|
|
1154
|
+
| Strings | [list] | [list] |
|
|
1155
|
+
| APIs | [list] | [list] |
|
|
1156
|
+
|
|
1157
|
+
2. Similarity scoring:
|
|
1158
|
+
- > 90%: Same family/variant
|
|
1159
|
+
- 70-90%: Related/modified
|
|
1160
|
+
- 50-70%: Possible connection
|
|
1161
|
+
- < 50%: Unlikely related
|
|
1162
|
+
|
|
1163
|
+
[PHASE 5: CLUSTERING INDICATORS]
|
|
1164
|
+
===============================
|
|
1165
|
+
|
|
1166
|
+
Generate indicators for clustering:
|
|
1167
|
+
|
|
1168
|
+
1. Unique code patterns
|
|
1169
|
+
2. String constants (mutex, paths)
|
|
1170
|
+
3. Network patterns (domains, ports)
|
|
1171
|
+
4. Behavioral signatures
|
|
1172
|
+
|
|
1173
|
+
[REPORT FORMAT]
|
|
1174
|
+
===============
|
|
1175
|
+
|
|
1176
|
+
## 🔍 Code Similarity Analysis Report
|
|
1177
|
+
|
|
1178
|
+
### Sample Identification
|
|
1179
|
+
| Attribute | Value |
|
|
1180
|
+
|-----------|-------|
|
|
1181
|
+
| SHA256 | [hash] |
|
|
1182
|
+
| Imphash | [hash] |
|
|
1183
|
+
| SSDEEP | [hash] |
|
|
1184
|
+
| File Type | [type] |
|
|
1185
|
+
|
|
1186
|
+
### Signature Summary
|
|
1187
|
+
- Custom Code: [X]%
|
|
1188
|
+
- Library Code: [Y]%
|
|
1189
|
+
- Unique Functions: [count]
|
|
1190
|
+
|
|
1191
|
+
### Family Attribution
|
|
1192
|
+
| Family | Similarity | Confidence | Evidence |
|
|
1193
|
+
|--------|------------|------------|----------|
|
|
1194
|
+
| [name] | XX% | HIGH/MED | [evidence] |
|
|
1195
|
+
|
|
1196
|
+
### Variant Analysis (if applicable)
|
|
1197
|
+
Changes from baseline:
|
|
1198
|
+
- Added: [functions/strings]
|
|
1199
|
+
- Removed: [functions/strings]
|
|
1200
|
+
- Modified: [behaviors]
|
|
1201
|
+
|
|
1202
|
+
### Clustering Indicators
|
|
1203
|
+
```yara
|
|
1204
|
+
// YARA rule for clustering
|
|
1205
|
+
rule Similar_Family {{
|
|
1206
|
+
strings:
|
|
1207
|
+
$s1 = "[unique string]"
|
|
1208
|
+
condition:
|
|
1209
|
+
all of them
|
|
1210
|
+
}}
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
### Related Samples
|
|
1214
|
+
| Hash | Similarity | Notes |
|
|
1215
|
+
|------|------------|-------|
|
|
1216
|
+
| [hash] | XX% | [notes] |
|
|
1217
|
+
|
|
1218
|
+
Begin similarity analysis now.
|
|
1219
|
+
"""
|