--- name: reverse-engineering-binary description: 'Use for binary reverse engineering: disassembly, decompilation, PE/ELF/Mach-O analysis, IDA Pro, Ghidra, radare2, binary patching, crackme solving, malware analysis, unpacking, signature analysis, and any task involving compiled binary inspection or modification.' version: 1.0.0 platforms: - linux - macos - windows depends_on: [] metadata: tags: - reverse - engineering - binary --- # Reverse Engineering — Binary Analysis ## Trigger Conditions - Disassembling or decompiling binaries (PE, ELF, Mach-O) - IDA Pro, Ghidra, radare2, Binary Ninja workflows - Analyzing compiled code without source - Binary patching, crackme/CTF challenges - Malware reverse engineering, IOC extraction - Function identification, control flow reconstruction - String extraction, crypto constant identification - Import/export table analysis, IAT reconstruction - Binary instrumentation (Frida, DynamoRIO, Pin) - Shellcode analysis, payload decoding - Firmware extraction, embedded binary RE - Comparing binary diffs, version analysis - Writing loaders, unpackers, decoders ## Core Methodology ### 1. Static Analysis Pipeline ``` file identification → entropy analysis → string extraction → import analysis → function identification → control flow graph → data flow analysis → decompilation → manual verification ``` **File identification:** - `file`, `binwalk`, `detect_it_easy` (DIE) - PE: `pefile`, `peview`, `CFF Explorer` - ELF: `readelf`, `objdump`, `elfutils` - Mach-O: `otool`, `MachOView` **Entropy analysis:** - High entropy regions → packed/encrypted sections - `binwalk -E`, `ent`, custom entropy scanner - Section boundaries vs entropy spikes **String extraction:** - `strings -n 4`, `floss` (FireEye), `rabin2 -z` - Unicode strings: `strings -e l`, `rabin2 -zz` - Encrypted strings: constant analysis, decryption routine location **Import analysis:** - PE: IAT parsing, delayed imports, forwarders - ELF: `.dynsym`, `.got.plt`, symbol versioning - Hidden imports: API hashing, GetProcAddress/LoadLibrary chains ### 2. Dynamic Analysis Pipeline ``` sandbox execution → API monitoring → memory dumping → network capture → behavior analysis → IOC extraction ``` **API monitoring:** - Windows: API Monitor, ProcMon, ETW tracing - Linux: `strace`, `ltrace`, `bpftrace` - Cross-platform: Frida, DynamoRIO **Memory analysis:** - Process dumping: `Process Hacker`, `dumpcap`, custom dumpers - Memory scanning: `Volatility`, `Rekall`, `LiME` - String reconstruction from memory, decrypted payload extraction ### 3. Decompilation & Manual RE **IDA Pro workflow:** ``` 1. Load binary → auto-analysis → review entry points 2. Identify strings → cross-reference → locate key functions 3. Rename functions/variables based on behavior 4. Create structs for data structures 5. Apply FLIRT signatures for known libraries 6. Graph view for complex control flow 7. Pseudocode (F5) → manual correction 8. Write IDC/IDAPython scripts for automation ``` **Ghidra workflow:** ``` 1. Import → auto-analyze (all analyzers) 2. Symbol tree → identify main/entry 3. Data type manager → create custom structs 4. Decompile → fix variable types 5. Script manager → Python/Java automation 6. Version tracking → binary diffing 7. Function graph → identify obfuscation patterns ``` **radare2 workflow:** ``` r2 binary aaa # analyze all afl # list functions pdf @ main # print disassembly function pdg @ main # decompile (if available) izz # strings ii # imports is # symbols axt @ # cross-references to axf @ # cross-references from ``` ### 4. Binary Patching **Common patch targets:** - License checks: `test eax, eax` → `xor eax, eax` (always true) - Conditional jumps: `je` → `jmp` or `jne` - Function skipping: `call func` → `nop` × 5 - Return value modification: `mov eax, 1` before `ret` - Anti-debug bypass: `IsDebuggerPresent` → return 0 **PE patching:** ```python import pefile pe = pefile.PE("target.exe") # Find target RVA for section in pe.sections: if section.Name.startswith(b'.text'): text_rva = section.VirtualAddress text_raw = section.PointerToRawData # Convert RVA to file offset def rva_to_offset(pe, rva): for s in pe.sections: if s.VirtualAddress <= rva < s.VirtualAddress + s.Misc_VirtualSize: return rva - s.VirtualAddress + s.PointerToRawData # Patch offset = rva_to_offset(pe, target_rva) pe.set_bytes_at_offset(offset, b'\x90' * 5) # NOP pe.write("target_patched.exe") ``` ### 5. Anti-Analysis Detection & Bypass **Anti-debug techniques:** - `IsDebuggerPresent`, `CheckRemoteDebuggerPresent` - `NtQueryInformationProcess(ProcessDebugPort)` - `GetTickCount` timing checks - `RDTSC` instruction timing - SEH-based debugger detection - Hardware breakpoint detection (`GetThreadContext`) **Bypass methods:** - Patch detection functions to return false - Frida script to hook and override return values - Hide debugger from process list - Use kernel debugger (WinDbg) for kernel-mode targets - Time manipulation for timing-based checks **Anti-VM techniques:** - MAC address checks (00:0C:29 = VMware) - Registry keys (HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0) - CPUID hypervisor bit - DMI/SMBIOS strings - Specific drivers (vmci, vmmouse, VBoxGuest) ### 6. Crypto Identification **Constant-based identification:** ``` MD5: 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476 SHA1: 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 SHA256: 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, ... AES: S-box lookup table (256 bytes starting 0x63, 0x7C, 0x77, ...) RC4: Key-scheduling algorithm pattern Base64: 64-char alphabet string ``` **Search patterns:** - `rabin2 -x 67452301EFCDAB89` (SHA1 constants) - IDA: Search → Immediate Value → hex constants - YARA rules for crypto implementations ### 7. Automation Scripts **IDAPython — find all API hash calls:** ```python from idaapi import * from idautils import * def find_api_hash_calls(hash_value): """Find calls to API hash resolver with specific hash.""" results = [] for func_ea in Functions(): for block in FuncItems(func_ea): for xref in XrefsTo(block, 0): if get_operand_value(xref.frm, 0) == hash_value: results.append(xref.frm) return results ``` **Frida — trace all imports:** ```javascript Interceptor.attach(Module.getExportByName(null, 'CreateFileW'), { onEnter: function(args) { console.log('CreateFileW(' + args[0].readUtf16String() + ')'); } }); ``` ## Implementation Standards - All RE artifacts are complete: full scripts, working patches, complete analysis - Provide both static and dynamic analysis approaches - Include automation scripts for repetitive tasks - Document findings in structured format - Cross-reference findings across multiple tools - No partial analysis — complete or nothing ## Output Format For binary RE tasks: 1. **Identification** — file type, architecture, compiler, packer 2. **Static Analysis** — strings, imports, key functions, control flow 3. **Dynamic Analysis** — behavior, API calls, network, file operations 4. **Key Findings** — algorithms, crypto, protocols, backdoors 5. **Artifacts** — patches, scripts, YARA rules, IOCs Всё, брат. ## Related - `skill reverse-engineering-full — полный RE` - `skill reverse-engineering-obfuscation — деобфускация` - `skill binary-exploitation — бинарные эксплойты` - `skill fuzzing — фазинг`