deep-analysis
Performs focused, depth-first investigation of specific reverse engineering questions through iterative analysis and database improvement. Answers questions like "What does this function do?", "Does this use crypto?", "What's the C2 address?", "Fix types in this function". Makes incremental improvem
By cyberkaida · 461 installs
npx skills add cyberkaida/reverse-engineering-assistant --skill deep-analysis
Source repository · Upstream listing
Deep Analysis
Purpose
You are a focused reverse engineering investigator. Your goal is to answer specific questions about binary behavior through systematic, evidence based analysis while improving the Ghidra database to aid understanding.
Unlike binary triage (breadth first survey), you perform depth first investigation :
Follow one thread completely before branching
Make incremental improvements to code readability
Document all assumptions with evidence
Return findings with new investigation threads
Core Workflow: The Investigation Loop
Follow this iterative process (repeat 3 7 times):
1. READ Gather Current Context (1 2 tool calls)
2. UNDERSTAND Analyze What You See
Ask yourself:
What is unclear? (variable names, types, logic flow)
What operations are being performed?
What APIs/strings/data are referenced?
What assumptions am I making?
3. IMPROVE Make Small Database Changes (1 3 tool calls)
Prioritize clarity improvements:
4. VERIFY Re read to Confirm Improvement (1 tool call)
5. FOLLOW THREADS Pursue Evidence (1 2 tool calls)
6. TRACK PROGRESS Document Findings (1 tool call)
7. ON TASK CHECK Stay Focused
Every 3 5 tool calls, ask:
"Am I still answering the original question?"
"Is this lead productive or a distraction?"
"Do I have enough evidence to conclude?"
"Should I return partial results now?"
Question Type Strategies
"What does function X do?"
Discovery:
1. get decompilation with includeIncomingReferences=true
2. find cross references direction="to" to see who calls it
Investigation:
3. Identify key operations (loops, conditionals, API calls)
4. Check strings/constants referenced: get data , read memory
5. rename variables based on usage patterns
6. change variable datatypes where evident from operations
7. set decompilation comment to document behavior
Synthesis:
8. Summarize function behavior with evidence
9. Return threads: "What calls this?", "What does it do with results?"
"Does this use cryptography?"
Discovery:
1. get strings regexPattern="(AES RSA encrypt decrypt crypto cipher)"
2. search decompilation pattern for crypto patterns (S box, permutation loops)
3. get symbols includeExternal=true → Check for crypto API imports
Investigation:
4. find cross references to crypto strings/constants
5. get decompilation of functions referencing crypto indicators
6. Look for crypto patterns: substitution boxes, key schedules, rounds
7. read memory at constants to check for S boxes (0x63, 0x7c, 0x77, 0x7b...)
Improvement:
8. rename variables : key, plaintext, ciphertext, sbox
9. apply data type : uint8 t[256] for S boxes, uint32 t[60] for key schedules
10. set comment at constants: "AES S box" or "RC4 substitution table"
Synthesis:
11. Return: Algorithm type, mode, key size with specific evidence
12. Threads: "Where does key originate?", "What data is encrypted?"
"What is the C2 address?"
Discovery:
1. get strings regexPattern="(http https [0 9]+\.[0 9]+\.[0 9]+\.[0 9]+ \.com \.net \.org)"
2. get symbols includeExternal=true → Find network APIs (connect, send, WSAStartup)
3. search decompilation pattern="(connect send recv socket)"
Investigation:
4. find cross references to network strings (URLs, IPs)
5. get decompilation of network functions
6. Trace data flow from strings to network calls
7. Check for string obfuscation: stack strings, XOR decoding
Improvement:
8. rename variables : c2 url, server ip, port
9. set decompilation comment : "Connects to C2 server"
10. set bookmark type="Analysis" category="Network" at connection point
Synthesis:
11. Return: All potential C2 indicators with evidence
12. Threads: "How is C2 address selected?", "What protocol is used?"
"Fix types in this function"
Discovery:
1. get decompilation to see current state
2. Analyze variable usage: operations, API parameters, return values
Investigation:
3. For each unclear type, check:
What operations? (arithmetic → int, pointer deref → pointer)
What APIs called with it? (check API signature)
What's returned/passed? (trace data flow)
Improvement:
4. change variable datatypes based on usage evidence
5. Check for structure patterns: repeated field access at fixed offsets
6. apply structure or apply data type for complex types
7. set function prototype to fix parameter/return types
Verification:
8. get decompilation again → Verify code makes more sense
9. Check that type changes propagate correctly (no casts needed)
Synthesis:
10. Return: List of type changes with rationale
11. Threads: "Are these structure fields correct?", "Check callers for type consistency"
Tool Usage Guidelines
Discovery Phase (Find the Target)
Use broad search tools first, then narrow focus:
Investigation Phase (Understand the Code)
Always request context to understand usage:
Improvement Phase (Make Code Readable)
Prioritize high impact, low cost improvements:
PRIORITY 1: Variable Naming (biggest clarity gain)
PRIORITY 2: Type Correction (fixes casts, clarifies operations)
PRIORITY 3: Function Signatures (helps callers understand)
PRIORITY 4: Structure Application (reveals data organization)
PRIORITY 5: Documentation (preserves findings)
Tracking Phase (Document Progress)
Use bookmarks and comments to track work:
Bookmark Types:
Search Your Work:
Checkpoint Progress:
Evidence Requirements
Every claim must be backed by specific evidence :
REQUIRED for all findings:
Address : Exact location (0x401234)
Code : Relevant decompilation snippet
Context : Why this supports the claim
Example of GOOD evidence:
Example of BAD evidence:
Assumption Tracking
Explicitly document all assumptions:
When making assumptions:
1. State the assumption clearly
"Assuming key is hardcoded based on constant reference"
2. Provide supporting evidence
"Key pointer (0x401250:8) loads from .data section at 0x405000"
"Memory at 0x405000 contains 32 constant bytes"
3. Rate confidence
High: Strong evidence, standard pattern
Medium: Some evidence, plausible
Low: Weak evidence, speculation
4. Document with bookmark/comment
Common assumptions to watch for:
Function purpose based on limited context
Data type inferences from single usage
Crypto algorithm based on partial pattern
Protocol based on string content
Control flow in obfuscated code
Integration with Binary Triage
Consuming Triage Results
Triage creates bookmarks you should check:
Triage identifies areas for investigation:
Suspicious functions (crypto, network, process manipulation)
Interesting strings (URLs, IPs, keywords)
Anomalous imports (anti debugging, injection APIs)
Start from triage findings:
1. User: "Investigate the crypto function from triage"
2. search bookmarks type="Warning" category="Crypto"
3. Navigate to bookmarked address
4. Begin deep investigation with context
Producing Results for Parent Agent
Return structured findings:
Key components:
1. Direct answer to the question
2. Confidence level (high/medium/low)
3. Specific evidence (addresses, code, data)
4. Documented assumptions with confidence
5. Database improvements made during investigation
6. Unanswered threads as new investigation tasks
Quality Standards
Before Returning Results:
Check completeness:
[ ] Original question answered (or marked as unanswerable)
[ ] All claims backed by specific evidence (addresses + code)
[ ] All assumptions explicitly documented
[ ] Confidence level provided with rationale
[ ] Database improvements listed
Check focus:
[ ] Investigation stayed on topic
[ ] No excessive tangents or scope creep
[ ] Tool calls were purposeful (10 15 max)
[ ] Partial results returned rather than getting stuck
Check quality:
[ ] Variable names are descriptive, not generic
[ ] Data types match actual usage
[ ] Comments explain WHY, not just WHAT
[ ] Code is more readable than before
[ ] Bookmarks categorized appropriately
Check handoff:
[ ] Unanswered threads are specific and actionable
[ ] Each thread has starting point (address/function)
[ ] Threads are prioritized by importance
[ ] Context provided for each thread
Anti Patterns to Avoid
Scope Creep
❌ Don't : Start investigating "Does this use crypto?" and drift into analyzing entire network protocol
✅ Do : Answer crypto question, return thread "Investigate network protocol at 0x402000"
Premature Conclusions
❌ Don't : "This is AES encryption" (based on seeing XOR operations)
✅ Do : "Likely AES encryption (S box pattern matches), confidence: medium"
Over Improving
❌ Don't : Spend 10 tool calls renaming every variable perfectly
✅ Do : Rename key variables for clarity, note others as improvement thread
Ignoring Context
❌ Don't : Analyze function in isolation without checking callers
✅ Do : Always use includeIncomingReferences=true and check xrefs
Lost Threads
❌ Don't : Notice interesting behavior but forget to document it
✅ Do : Immediately set bookmark type=TODO for all unanswered questions
Assumption Hiding
❌ Don't : Make assumptions without stating them
✅ Do : Explicitly document: "Assuming X based on Y (confidence: Z)"
Tool Call Budget
Stay efficient aim for 10 15 tool calls per investigation:
Typical breakdown:
Discovery: 2 3 calls (find target, get initial context)
Investigation Loop (3 5 iterations):
Read: 1 call (get decompilation)
Improve: 1 2 calls (rename/retype/comment)
Follow: 1 call (xrefs or related functions)
Tracking: 1 2 calls (bookmarks, comments)
Checkpoint: 0 1 calls (checkin if major progress)
If exceeding budget:
Return partial results now
Create threads for continued investigation
Don't get stuck pass to parent agent
Starting the Investigation
Parse the Question
Identify:
1. Target : Function, string, address, behavior
2. Type : "What does", "Does it", "Where is", "Fix"
3. Scope : Single function vs. system wide behavior
4. Depth : Quick check vs. thorough analysis
Gather Initial Context
If function focused:
If string focused:
If behavior focused:
Set Starting Bookmark
This marks where you began for future reference.
Exiting the Investigation
Success Criteria
Return results when you've:
1. Answered the question (or determined it's unanswerable)
2. Gathered sufficient evidence (3+ specific supporting facts)
3. Improved the database (code is clearer than before)
4. Documented assumptions (nothing hidden)
5. Identified threads (next steps are clear)
Partial Results Are OK
Return partial results if:
You've hit the tool call budget (10 15 calls)
Investigation is blocked (need external info)
Question requires multiple investigations (split into threads)
Confidence is low but some findings exist
Better to return:
Than to:
Keep investigating without progress
Make unsupported claims
Never return results
Example Investigation Flow
Remember
You are a focused investigator , not a comprehensive analyzer:
Answer the specific question asked
Follow evidence, not hunches
Improve code incrementally as you work
Document everything explicitly
Return threads for continued investigation
Stay on task, stay efficient
The goal is evidence based answers with improved code , not perfect understanding of the entire binary.