reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
---
|
||||
name: writing-yara-rules-from-reversed-code
|
||||
description: 'Turns reverse-engineering findings into durable YARA detections: selecting stable
|
||||
code constructs and constants over volatile strings, extracting opcode/byte patterns with
|
||||
wildcards, and validating rules for low false positives. Activates for requests to write a
|
||||
YARA rule from reversed code, create a detection signature, or convert RE findings into
|
||||
hunting rules.'
|
||||
domain: cybersecurity
|
||||
subdomain: reverse-engineering
|
||||
tags:
|
||||
- reverse-engineering
|
||||
- yara
|
||||
- detection
|
||||
- signatures
|
||||
- threat-hunting
|
||||
version: 1.0.0
|
||||
author: analyst-ai-pack
|
||||
license: Apache-2.0
|
||||
mitre_attack:
|
||||
- T1027.001
|
||||
- T1587.001
|
||||
d3fend:
|
||||
- D3-FCR
|
||||
- D3-FA
|
||||
references:
|
||||
- 'YARA documentation — https://yara.readthedocs.io/'
|
||||
- 'YARA writing-better-rules guidance — https://github.com/Neo23x0/YARA-Style-Guide'
|
||||
---
|
||||
|
||||
# Writing YARA Rules from Reversed Code
|
||||
|
||||
## When to Use
|
||||
|
||||
- You finished reversing a sample/family and want a detection that survives recompilation and
|
||||
cosmetic changes.
|
||||
- You need byte-pattern signatures from decryptors, API-hash constants, or unique algorithms
|
||||
rather than fragile strings.
|
||||
- You are converting RE notes into hunting/scanning rules for a corpus.
|
||||
|
||||
**Do not use** volatile artifacts (file paths, mutex names that change per build, packer stubs
|
||||
shared across unrelated families) as your primary anchor — they cause drift and false hits.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- The `yara` engine (and ideally `yara-python`) for testing.
|
||||
- A small corpus: target samples (true positives) and clean/unrelated files (false-positive
|
||||
control).
|
||||
|
||||
## Workflow
|
||||
|
||||
### Step 1: Choose stable anchors
|
||||
|
||||
Prefer, in order: a unique algorithm's opcode sequence (decryptor, hashing loop), embedded
|
||||
magic constants (API hashes, XOR keys, S-box), then distinctive strings only if intrinsic.
|
||||
|
||||
### Step 2: Extract byte patterns with wildcards
|
||||
|
||||
Pull the relevant opcodes and wildcard volatile operands (addresses, immediates) so the rule
|
||||
survives relocation/recompilation:
|
||||
|
||||
```text
|
||||
$dec = { 8A 04 ?? 34 ?? 88 04 ?? 41 3B ?? 7? ?? } ; xor-decrypt loop, regs/disp wildcarded
|
||||
```
|
||||
|
||||
### Step 3: Assemble the rule
|
||||
|
||||
Combine 2–3 independent anchors with a `condition` requiring enough of them, plus a cheap
|
||||
prefilter (file size, PE magic) to keep scanning fast:
|
||||
|
||||
```bash
|
||||
python scripts/analyst.py scaffold --name family_xyz --hash 0xABCDEF12
|
||||
```
|
||||
|
||||
### Step 4: Validate against the corpus
|
||||
|
||||
Run the rule across true positives and the clean control set; require all TPs match and zero
|
||||
FPs on the control.
|
||||
|
||||
```bash
|
||||
yara -r rules/family_xyz.yar ./corpus
|
||||
```
|
||||
|
||||
### Step 5: Tune and document
|
||||
|
||||
Adjust thresholds, add `meta` (author, date, reference, hash), and record which construct each
|
||||
string anchors so future analysts can maintain it.
|
||||
|
||||
## Validation
|
||||
|
||||
- Rule matches all intended samples and produces zero hits on the clean control set.
|
||||
- Anchors map to intrinsic code/constants, not build-specific noise.
|
||||
- `meta` documents source samples and the reasoning for each pattern.
|
||||
|
||||
## Pitfalls
|
||||
|
||||
- Wildcarding too little (brittle) or too much (false positives); wildcard only volatile bytes.
|
||||
- Anchoring on shared library/packer code present in unrelated binaries.
|
||||
- Skipping the clean-corpus test, shipping a noisy rule.
|
||||
|
||||
## References
|
||||
|
||||
- See [`references/api-reference.md`](references/api-reference.md) for the rule scaffolder.
|
||||
- YARA documentation and style guide (linked in frontmatter).
|
||||
Reference in New Issue
Block a user