Static binary analysis is the dark art of reverse engineering where you never actually run the code. You sit with a dead file, a hex view, and a disassembler, peeling back layers of logic without ever letting the CPU touch an instruction. For malware analysts, vulnerability researchers, and firmware hackers, this is the first line of defense—and the deepest well of insight. But the tools you choose shape everything: your speed, your accuracy, and your sanity.
This isn’t a listicle for beginners who just discovered strings. This is a breakdown of the instruments that serious reversers keep in their toolchains, the ones that handle obfuscated binaries, exotic architectures, and the kind of deep-dive analysis that reveals hardcoded keys, hidden command-and-control domains, and undocumented backdoors.
Disassemblers: The Core of the Craft
Disassembly is the foundation. Without it, you’re staring at a wall of hex hoping for patterns. A proper disassembler translates machine code into assembly language, reconstructing the program’s logic from raw bytes. The quality of that translation—how well it handles stripped binaries, how accurately it identifies function boundaries, how gracefully it deals with anti-disassembly tricks—defines the tool’s worth.
IDA Pro: The Industry Standard
IDA Pro remains the heavyweight champion of interactive disassemblers. Its recursive descent algorithm is unmatched for teasing out code paths in complex binaries. The FLIRT signature system automatically identifies known library functions, saving hours of manual labeling. For static work, IDA’s graph view turns control flow into a visual map that makes even heavily obfuscated routines navigable. The plugin ecosystem—Hex-Rays decompiler, IDAPython scripting, and community extensions—transforms it from a disassembler into a full reverse engineering platform. The freeware version handles x86/x64 adequately, but serious work on ARM, MIPS, or PowerPC demands the paid license.
Where IDA truly shines is in its handling of non-standard binaries. Stripped firmware images, bootloaders with mixed instruction sets, and malware that deliberately breaks disassembly heuristics—IDA’s interactive nature lets you manually define code regions, switch between ARM and Thumb mode mid-function, and annotate everything. The learning curve is steep, but the payoff is absolute control.

Ghidra: The NSA’s Open-Source Powerhouse
Ghidra changed the game when it dropped in 2019. A full-featured reverse engineering framework released by the NSA, it offers a decompiler that rivals Hex-Rays in quality—and it’s completely free. The collaborative features, where multiple analysts can work on the same binary in a shared repository, are something IDA still can’t match natively. Ghidra’s scripting capabilities in Java and Python let you automate repetitive analysis tasks, and its support for obscure architectures (like SuperH, Tricore, and 68K) makes it indispensable for embedded device work.
The decompiler is the star. It produces remarkably readable C-like output, even from heavily optimized code. The data type recovery system is aggressive and usually accurate, though it can stumble on custom structures. For static vulnerability hunting, Ghidra’s built-in search for dangerous functions and its ability to track data flow across function boundaries make it a powerful auditing tool. The interface feels clunky compared to IDA’s polish, but the price tag—zero—makes that easy to forgive.
Radare2 / Rizin: The Terminal Dweller’s Choice
Radare2 and its modern fork Rizin are for those who live in the command line. These tools are absurdly flexible, scriptable, and fast. They handle everything from raw hex editing to full disassembly with control flow graphs, and they do it without a GUI if you don’t want one. The learning curve is brutal—commands are terse, documentation is scattered—but once you internalize the syntax, you can rip through binaries at a speed that GUI tools can’t touch. For automated pipelines, batch analysis of hundreds of samples, or quick triage on a headless server, Radare2 is the scalpel you want.
Rizin, the community-driven fork that emerged from Radare2’s governance issues, has cleaned up the codebase and improved the decompiler integration. It’s worth watching closely. Both tools support an enormous range of architectures and file formats, including raw flash dumps and weird embedded container formats that commercial tools often reject.
Decompilers: From Assembly to Pseudocode
Disassembly gives you the truth, but decompilation gives you understanding. A good decompiler reconstructs high-level constructs—loops, conditionals, variable names—from the low-level assembly, producing something you can read like source code. This is where static analysis accelerates from tedious to surgical.
Hex-Rays Decompiler (IDA Plugin)
Hex-Rays is the gold standard, tightly integrated with IDA Pro. Its output is clean, its type reconstruction is excellent, and it handles compiler optimizations gracefully. The recent versions have added support for C++ constructs, including virtual function tables and exception handling, which were historically pain points. The microcode API lets advanced users modify the decompilation process itself, fixing errors or adding custom analysis passes. It’s expensive, but for professional vulnerability research on complex targets, nothing else comes close.
Ghidra’s Decompiler
As mentioned, Ghidra’s decompiler is shockingly good for a free tool. It often produces output that’s nearly indistinguishable from Hex-Rays, especially on x86/x64 code. It struggles more with ARM Thumb-2 and some DSP instruction sets, but it’s improving rapidly. The ability to retype variables and see the decompiler output update in real time is addictive. For static analysis on a budget, this is the obvious choice.

Binary Parsing and Structure Analysis
Before you even disassemble, you need to understand what you’re looking at. Is this a raw ARM binary or an ELF with stripped sections? Is that blob actually a compressed filesystem? These tools parse binary formats and extract embedded assets, giving you a map before you start reversing.
Binwalk: Firmware Extraction and Analysis
Binwalk is the first tool any firmware analyst reaches for. It scans binary blobs for magic bytes—filesystem headers, compression signatures, kernel images—and can recursively extract them. The -e flag automates extraction, peeling back layers of a firmware image until you’re left with a root filesystem you can browse. It’s not perfect; custom or encrypted filesystems will stump it. But for 90% of consumer router and IoT firmware, Binwalk is the skeleton key.
Kaitai Struct: Declarative Binary Parsing
Kaitai Struct is a different beast. Instead of a tool that parses known formats, it’s a language for describing binary structures, with a compiler that generates parsers in multiple languages. If you’re reversing a proprietary file format or a custom network protocol, you write a .ksy specification and instantly get a parser in Python, C++, Java, or a dozen other targets. The web IDE lets you visualize the parsed structure against a hex dump, making it invaluable for documenting and sharing your reverse engineering findings.
Hex Editors with Analysis Features
Sometimes you need to get your hands dirty at the byte level. Modern hex editors are far more than viewers; they include structure definition, data inspection, and even disassembly.
010 Editor: Binary Templates and Scripting
010 Editor’s killer feature is Binary Templates—a C-like language for defining data structures that are then applied directly to the hex view, highlighting fields, showing parsed values, and making sense of raw bytes. For reversing file formats, it’s unmatched. The scripting engine lets you automate modifications, and the integrated disassembler handles quick lookups without launching a full reverse engineering suite. It’s commercial software, but the template repository alone is worth the price for anyone doing regular binary analysis.
ImHex: The Open-Source Contender
ImHex is a newer, open-source hex editor built with reverse engineering in mind. It features a pattern language similar to 010 Editor’s templates, a built-in disassembler, data visualization, and a modern dark-themed interface. It’s rapidly gaining features and community support. For those who prefer open-source tools or can’t justify a commercial license, ImHex is a serious alternative.
Static Analysis for Specific Targets
General-purpose tools are great, but some file types demand specialized static analyzers. These tools understand the semantics of particular formats and can catch issues that a generic disassembler would miss.
Checksec: ELF Hardening Checker
Checksec is a simple but essential script that examines ELF binaries for security hardening features: stack canaries, PIE, RELRO, NX, and Fortify Source. Before you even start reversing a Linux binary, Checksec tells you what mitigations are in place—and therefore what attack surfaces are likely viable. It’s part of the pwntools suite and should be run on every target as a first step.
APKTool and JADX: Android Static Analysis
For Android applications, APKTool decodes the APK container and disassembles the Dalvik bytecode to Smali, a human-readable assembly format. JADX goes further, decompiling DEX files directly to Java source. Together, they let you statically analyze an Android app’s logic, permissions, and embedded strings without ever installing it on a device. This is critical for spotting malicious behavior in APKs before they touch a sandbox.

String and Metadata Extraction
Before diving into disassembly, smart analysts harvest every plaintext clue from a binary. Strings, debug symbols, compiler fingerprints—these can reveal functionality, authorship, and intent without executing a single instruction.
Strings and Floss: Beyond the Obvious
The classic Unix strings command is the starting point, but modern malware often obfuscates or encrypts its strings. FireEye’s FLOSS (FireEye Labs Obfuscated String Solver) goes further, using static analysis to decode stack-constructed strings and identify string decryption routines. It works on both x86 and x64 binaries and can automatically extract strings that strings would miss entirely.
Exeinfo PE and Detect It Easy: Packer Identification
Before you can analyze a binary, you need to know if it’s packed. Exeinfo PE and Detect It Easy (DIE) are signature-based tools that identify packers, cryptors, compilers, and protectors. DIE is particularly powerful, with a heuristic engine that can spot unknown packers and a disassembler view for manual verification. If a sample is packed, your static analysis starts with unpacking—skip this step and you’ll waste hours staring at obfuscated stubs.
Building a Static Analysis Workflow
No single tool does everything. A mature static analysis workflow chains multiple tools together, each handling a specific phase. Here’s a practical sequence for an unknown ELF binary:
1. Triage: Run file to identify the format, then checksec to assess hardening. Use DIE to detect packers. If packed, identify the packer and find an unpacker or dump the unpacked payload from memory later.
2. String Harvesting: Run strings with a minimum length of 6, then FLOSS for obfuscated strings. Grep for URLs, IPs, file paths, and error messages. These often reveal C2 infrastructure, targeted files, or debug output.
3. Disassembly and Decompilation: Load into Ghidra or IDA. Run initial auto-analysis. Identify the entry point and main function. Use the decompiler to get a high-level overview, then drill into suspicious functions in the disassembler.
4. Structure Recovery: If the binary parses a custom format, use Kaitai Struct or 010 Editor templates to document the format. This makes the reversing findings reusable and shareable.
5. Annotation and Reporting: As you identify functions, global variables, and code paths, rename them in your disassembler. Export your analysis as a database or script so others can reproduce your work. Ghidra’s collaborative server is excellent for team efforts.
FAQ
What’s the difference between static and dynamic analysis?
Static analysis examines a binary without executing it—reading instructions, parsing headers, and extracting strings. Dynamic analysis runs the code in a controlled environment (sandbox, debugger) to observe its behavior. Static analysis is safer for malware and reveals all code paths, but it can’t show runtime-decrypted data or environment-dependent behavior. The two are complementary; static analysis often guides where to set breakpoints in dynamic analysis.
Do I need to learn assembly language for static analysis?
Yes, but not all architectures at once. Start with x86-64, as it’s the most common in desktop malware and server binaries. ARM (both 32-bit and 64-bit) is essential for mobile and embedded work. Decompilers help, but they make mistakes—especially with hand-crafted assembly or obfuscated code. Being able to read the raw disassembly lets you verify decompiler output and spot anti-analysis tricks.
Can static analysis detect all vulnerabilities?
No. Static analysis excels at finding structural issues—hardcoded credentials, insecure API usage, missing mitigations, and logic flaws visible in the code. But it cannot detect runtime-dependent vulnerabilities like memory corruption that depends on specific input, race conditions, or side-channel leaks. For those, you need dynamic analysis or fuzzing. Static analysis narrows the search space dramatically, though.
Is Ghidra really a replacement for IDA Pro?
For many users, yes. Ghidra’s decompiler is excellent, its collaboration features are unique, and it’s free. IDA still has advantages: a more polished interface, better handling of certain obfuscation techniques, a larger plugin ecosystem, and Hex-Rays’ microcode API for advanced analysis. If you’re doing professional vulnerability research on heavily protected binaries, IDA may be worth the cost. For everyone else, Ghidra is more than sufficient.
How do I handle statically analyzing a packed binary?
First, identify the packer using DIE or Exeinfo PE. If it’s a known packer, search for an unpacker or use a tool like UPX (which can decompress its own format). If it’s custom, you’ll need to let the binary unpack itself in a debugger, then dump the unpacked process memory. That dumped payload becomes your static analysis target. Some analysts use emulation frameworks like Unicorn to run the unpacking stub without touching the real OS, keeping the analysis fully static.
Static binary analysis is a discipline that rewards patience and tool mastery. The binaries won’t give up their secrets easily, but with the right instruments and a methodical approach, you can reconstruct their logic completely—without ever letting them execute.