IDA 9.2 Beta

Welcome to the IDA 9.2 Beta Release, and thank you to all our beta testers for joining us! Below are the key highlights and changes introduced in this beta version.

Share your feedback

Spotted a bug or have a suggestion to the IDA 9.2 beta release? Let us know and contribute to IDA evolution:

UI Improvements

Jump To Anywhere

  • Jump To Anywhere is a new dialog created to simplify quick jumps to locations anywhere in the IDB. It is envisioned to become the successor of the JumpAsk ("Jump to address...", bound to the G key) dialog.

  • It can be opened via the JumpToAnywhere action that is bound to Ctrl + Alt + F (CMD + Alt + F on macOS) by default. A checkbox was also added in the (new) Feature flags dialog (Options → Feature flags...) to quickly map/unmap JumpToAnywhere to the G key.

  • Currently we index functions, local types, names, segments, later we plan to introduce a public API, allowing users to extend the index, querying it, and much more.

  • For now the dialog is fairly simple: it presents an input box where the user can type in a name and below that a list of search matches is populated.

  • The list can be navigated using arrow keys. Pressing Enter jumps to the currently selected entry.

  • If the user input is interpretable as an address expression, a result entry for the corresponding destination will appear at the top of the search result list.

  • The behavior of the dialog can be changed in idagui.cfg to your preference:

//-------------------------------------------------------------------------
//      Jump anywhere parameters (requires ENABLE_INDEXER = YES in ida.cfg)
//-------------------------------------------------------------------------

#ifdef __QT__
JUMP_ANYWHERE_MAX_HISTORY = 25     // maximum number of history entries in the jump anywhere dialog
JUMP_ANYWHERE_MAX_RESULTS = 10000  // maximum number of search results (0 = no limit)
#endif

Disabling of the indexer is possible in ida.cfg, by setting ENABLE_INDEXER = NO, this may be useful if you use IDA in headless mode (eliminating the small overhead of building & maintaining the index).

Future plans

  • We would like to support fuzzy string matching in JumpToAnywhere

  • We will also add a preview pane inside of the dialog to provide context about the entry that is currently selected.

Request for Feedback | Feedback Form

  • Do you find the performance of the Jump To Anywhere dialog satisfying? Are you able to input your search smoothly?

  • Would you like to be able to filter by type of match (only functions, only types etc.)?

  • Did we miss anything that would make this dialog better?

Unified Location History

  • Global history stack across multiple widgets. Addresses issues like:

    • double clicking on a static variable switching to disassembly view, but ESC would not navigate back to pseudocode

    • double clicking on a type or stack variable would "trap" navigation with no easy way to return back to the origin

  • Activated automatically for Disassembly, Pseudocode, Local Types, and Stack. Old behaviour can be re-instantiated in Options → General → Misc, under "History groups".

New Debugger Regs Widget

  • New register widget for the debugger. It applies coloring, dereferences pointers, and in general tries to be smart about register values. This behavior can be controlled via the context menu.

Autocompletion for Types in Local Types

  • Autocompletion when editing/creating types in Local Types via the free text editor.

  • Either automatically triggered when typing, or manually invoked using Ctrl + Space.

  • When adding a new type in the "C syntax" tab, autocompletion is available.

  • Autocompletion uses the existing types in the database and C/C++ keywords (such as "struct", "int"...).

  • Simply start typing the beginning of the desired type name and a list of completions will appear, they can be navigate using arrow keys.

  • Additionally, a very useful hint will appear on the side to provide more context about the suggested type, allowing you to distinguish between "foobar1", "foobar2" or even "FooBar".

  • If autocompletion suggestions are in your way, you can discard them by pressing Esc.

  • It is also possible to deliberately request to show completions at any moment using Ctrl + Space (the ForceTypesAutoCompl action, the shortcut is configurable).

  • We also added automatic completion of curly braces and auto-indentation: when entering '{', '}' will be automatically added, and between them an empty line with an indentation.

  • After working with older builds that lacked autocompletion, we were reminded how much easier editing types is with it. It's one of those things you only truly appreciate once it's gone. If for one reason or another you're not keen on autocompletion, you can disable it partially or fully: Options → General... → Misc. At the bottom of that page you will find a group of settings "Types autocompletion":

    • Enable autocomplete for types — enables or disables the entire mechanism. If you uncheck the box, the behavior will not differ from previous versions. Enabled by default.

    • Case sensitive — changes case sensitivity. If you check the box, then, for example, the "f" prefix will show "foobar", but not "Foobar". Disabled by default.

    • Enable autocomplete for curly braces — enables or disables autocompletion of curly braces and indents. Enabled by default.

    • Enable type hints — enables or disables hints when choosing a type from suggestions during autocompletion. Enabled by default.

Request for Feedback | Feedback Form

  • Suggestion list appearance for autocomplete:

    • Does it always appear when you want it to? (when entering keywords)

    • Are there any situations where the list appears when you don't want it to? (when entering a type or member name)

  • Suggestion list size:

    • Are 7 types in the list without scrolling enough or should it be larger? Or smaller?

    • Are the suggestions in the list covered by scrollbars?

Xref Graph

  • New widget graphically displaying inter-function relationships (code and data).

  • Replaces the following widgets / actions / tools:

    • Qwingraph

    • Xrefs graph from ... (function name context menu)

    • Xrefs graph to ... (function name context menu)

    • Function call graph

    • User call graph

  • Invoked using Alt + Shift + X.

  • The graph gathers a set of nodes connected by xrefs. For now the nodes are laid out using a force-directed approach.

  • The controls are quite simple:

    • dragging nodes around moves them

    • clicking and dragging around the graph pans around (holding the Shift key will pan without unintentionally grabbing a node)

    • holding Ctrl/CMD while scrolling will zoom in/out

    • double-clicking on a node will jump to the corresponding item in an IDAView

    • nodes can be added to/remove from the graph using right-click on a node (e.g. "Add xrefs from node")

  • The layout mechanism can be played/paused using the Space key.

Request for Feedback | | Feedback Form

  • Would you like to be able to use other layouts for the graphs?

  • Do you find such graph representations useful for your workflows? If not, what would make them more powerful?

Xref Tree

  • New widget textually displaying inter-function relationships (code and data).

  • New widget enabling textual, interactive, non-modal traversing of xrefs to provide a better overview of the function call hierarchies and data references. This view complements, and will eventually be tightly integrated with, the new xref graph and xrefs in general.

  • Replaces the following widgets:

    • Function Calls

    • Cross References

  • The tree shows both references to and from the current function, in a fashion similar to call hierarchy views in IDEs. Both code and data references are displayed.

  • The tree is non-modal and there can be multiple instances of it open at the same time, each displaying a different function. The tree state is not preserved between sessions.

  • The tree nodes are lazily loaded, and the tree is updated in real-time as the user navigates. Any changes to function and object names are reflected in the tree.

  • It is possible to make the tree synchronize with the current IDA View, by checking the "Sync" checkbox.

  • Some unnecessary functions can be filtered out, by checking the "Add filter" button, or by using the Ctrl + F shortcut (Ctrl + Shift + F to remove the filter).

  • By default the tree displays function names in simplified form, such as main(argc, argv) instead of int main(int argc, char **argv). This can be changed by unchecking the "Simplified view" checkbox.

  • The tree can be navigated with mouse and keyboard, using the common cursor keys.

  • If there are multiple xrefs to the same function, they are deduplicated by default. This can be changed by checking the "Allow Duplicates" checkbox.

Access and shortcuts

  • It is accessible via:

    • View → Open Subview → Cross References Tree,

    • The Command Palette (action name: OpenXrefsTree),

    • Shift + X on any function or address with incoming/outgoing Xrefs

  • One can press F10/Shift + F10 to cycle through the xrefs to the currently selected function.

Request for Feedback | Feedback Form

  • Performance with complex graphs. The tree is lazily-loaded, does it feel instantaneous?

  • Filter usability: is it easy to use?

  • Color scheme and visual style: is it easy to read?

  • Is there some crucial functionality missing?

  • Would it be beneficial to keep this tree view visible in the default layout? (just like the Functions chooser)

IDA is now running on Qt6

  • We provide shims to make sure plugins written for Qt5 remain operational.

Request for Feedback | Feedback Form

  • Please report any parts of the (now legacy) Qt5 API that we forgot to cover (except QRegExp)

  • Qt6 addresses many known issues on Wayland Linux (self-detaching menus, popups not gaining focus, missing window decorations, ...). Please report any remaining bugs that you encounter.

Actions for font size controls

  • Available under the View menu, the "Increase|Decrease|Reset Font size" actions let the user directly control the font size of the (family of) the widget they're currently using.

  • Previously users had to open the font selection dialog ("Font...") to adjust the size of fonts.

  • The actions have been mapped to Ctrl + +, Ctrl + =, Ctrl + - and Ctrl + 0, respectively (CMD on macOS).

Request for Feedback | Feedback Form

  • Are you happy with the selected shortcuts?

    • how do you typically control font size in other apps?

  • Should we make these actions available elsewhere?

  • Do the expected UI elements react?

    • note that in graph view these shortcuts are still mapped to zoom in/out and not increase/decrease font size

Feature Flags Dialog

  • New dialog enabling/disabling experimental features

  • Can be opened via Options → Feature Flags

  • Currently only allows to quick map the new "Jump to Anywhere" feature to the G hotkey

Sunsetting idat's Terminal Interface

  • As of this release, idat does not support interactive mode anymore (read: the TUI is gone!)

  • Batch mode processing is still available (and will stay), so infrastructure relying on batch processing still works

Architecture Support

ARM

  • Instruction set extensions:

    • ARMv8.7-A: FEAT_WFxT Extension (fixes most recent Apple SPTMs)

    • ARMv8.7-A: FEAT_xNS Extension (fixes most recent Apple SPTMs)

    • Low Overhead Branch Extensions

    • Custom Datapath Extension

  • Load ARM64EC Windows COFF files (ARM64EC PE support pending)

  • Speed improvements of the internal register tracking logic

  • FLIRT:

    • ARMv8 support for pmacho

    • pcf: New option -f to filter for ARM64EC/ARM64 objects in Windows COFF files (supports any COFF OBJ magic.)

    • pcf: Fix processing of ARM64 relocations

    • properly emit and consume ARMv7 THUMB bits in PAT files

MIPS

  • Added support for O64 ABI

RH850

  • Support more relocation types

  • Make TP, GP, CALLT registers user-assignable global registers

  • Many small improvements in macro building

RISCV

  • Dramatically improved function discovery

  • Recognition of table based switch constructs making use of THEAD instructions

Tricore

Support for TC4x (TC1.8) instructions

50+ new instructions from the TC1.8 architecture are now fully supported in the disassembler. This includes double-precision FPU instructions, virtualization instructions, and new Q (quad-sized) registers.

TC1.8

Make A0, A1, A8, A9 user-specifiable global registers

Support for setting global address registers (A0, A1, A8, A9) as segment registers. TriCore uses these registers for global address computation, typically via GP-relative access. By configuring them via Edit → Segments (or Alt + G), you help IDA resolve memory references more accurately.

Segreg

New chipset definitions

Added TC1765, TC1724, TC1728, TC1130, and improved the already existing ones. These are used across the automotive and railway industries, including real-world train firmware.

TMS320

  • Support 32bit SIMD instructions (tms320c6)

Type System

New Parser

There are 3 parsers currently available:

  1. default - old internal IDA parser (will be obsolete)

  2. clang - previous parser based on clang

  3. future - new parser based on clang's libtooling llvm-20.1.0 (will become default)

Using the parser

You can switch between them by tweaking the Options → Compiler... options settings.

Compiler options

Additionally, you can use the -Oclang:on command line switch to activate the new parser in IDA, or set the IDA_CLANG_PARSER environment variable to 1. To activate the new parser in tilib, pass the -IC command line switch. You may also pass additional arguments down to clang using -CT(e.g. -CT-target -CTx86_64-pc-linux).

The "future" parser is fully migrated to clang's libtooling, and it unifies all type parsing done by IDA into a single backend. This means that the same parser will be used in the type editor, in idaclang and in tilib.

A convenient way to tweak the new parser is via the "Parser specific options" dialog.

Parser Properties

You may set defaults for these options and check their documentation in idaclang.cfg.

Python API

Using the parser from the Python API can be done via the ida_srclang module.

import ida_srclang

argv = [ "-target x86_64-apple-darwin-macho",
         "-x c++",
         "-std=c++17",
         "-Werror",
         "-Wno-incompatible-sysroot",
       ]
ida_srclang.set_parser_argv("future", " ".join(argv)) 

ida_srclang.set_parser_option("future", "CLANG_SMART_POINTERS", "OSSharedPtr")
ida_srclang.parse_decls_with_parser_ext("future", None, "header_file.h", idaapi.HTI_FIL)

For example, the new parser can be used to parse C++ templates:

struct std::char_traits<char>
{
};
New Parser

Note that two new HTI flags are available in ida_typeinf:

  • HTI_SEMICOLON: do not complain if the terminated semicolon is absent

  • HTI_STANDALONE: should parse standalone declaration, which may contain qualified names and type names (IDA-Pro specific declaration)

Backwards Compatibility

There are two approaches to define a __usercall:

  1. int __usercall f<eax>(int *a<edx>[]) - obsolete

  2. int __usercall f@<eax>(int *a@<edx>[]) - recommended way

Approach (1) is not supported by the new parser.

Tuples

  • Added the notion of tuples (~structs where exact member allocation is ignored)

  • Use via keyword __tuple

  • Currently they behave as structs with a few differences:

    • two tuples having matching member are considered to be equal

    • tuples are returned from functions in a different manner

Disassembler/Decompiler Integration

  • Disassembler automatically uses structure offsets found by the decompiler

  • New analysis option: Copy xrefs found by decompiler to disassembler (disabled by default)

Major Golang Analysis Improvements

  • Significant improvements of decompiling Golang code:

    • Fully support Golang's stack-based ABI for return values

    • Improved dataflow tracking / recognition of object copy operations

    • Improved string pool handling

    • Recognition of Golang compiler idioms:

      • runtime.convTnoptr, runtime.convT, runtime.growslice, runtime.makeslicecopy, runtime.duffcopy, runtime.duffzero

    • Better metadata parsing (FUNCDATA, PCLNTAB)

Ineffective Golang string recognition in IDA 9.1 - Pseudocode
Improved Golang string recognition in IDA 9.2 - Pseudocode
  • Now we have two different Golang calling conventions:

    • CM_CC_GOSTK - stack abi: default for old apps (golang version < 1.17)

    • CM_CC_GOLANG - regabi: default one for newer apps

    • For old databases (prior to IDA 9.2) we preserve the old behaviour: CM_CC_GOLANG is the stack abi for old Go apps (go version < 1.17) and regabi for the newer ones.

Unused dummy arguments in IDA 9.1
__gostk functions recognition in IDA 9.2

Multiple Names as Comments

  • When multiple names are discovered for the same address, they are shown as comments. This behavior existed before, but we extended the list of supported file formats from which multiple names are recovered.

Multiple Names

Deobfuscation

  • New algorithm backing Goomba's MBA Deobfuscation

  • Simplify away non-satisfiable cases in switch statements (limited by config variable OPT_VALRNG_SWITCH_NCASES)

IDA Feeds

  • Recover more Rust compiler versions from binaries

IDAlib

  • Pass down IDA command line arguments in open_database

  • Do not pollute file history when opening files with IDAlib

  • Bugfix: Debugging in VS Code

API

  • New event: idb_event::local_type_renamed

  • New event: hexrays_event_t::hxe_mba_maturity event

  • New convenience function extend_sign_bits()

  • pro: added a new bit function bitcountr_zero() (like in C++20)

  • IDAPython: provide compiled_binpat_vec_t.parse

Deprecated APIs

  • Deprecate hook_to_notification_point()

Misc

  • ui: Made 'Cancel' button by default in 'Send database' dialog

  • ui: Added confirmation on public Lumina metadata push

  • ui: add actions to control font size

  • ui: add standard ZoomIn shortcut for font increase

  • pdb: added more wait boxes

  • ui: AUTO_CLOSE_MSGBOX gui configuration option (useful for long-running operations)

  • DWARF: support DWARF5 debug info in Mach-O binaries

  • pe: ldr: add new IMAGE_LOAD_CONFIG_DIRECTORY member

Security Fixes

  • Remote Code Execution via Debugger Attachment

  • Format string vulnerability in pdbparser

BUGFIXES

  • vd: MACHO-O Wrong segment name used with USE_SEG_PREFIXES=YES

  • ui: double-clicking/Enter on the header of a type, wouldn't open the editor

  • ui: double-clicking/Enter on a structure member name, wouldn't offer to rename it

  • ui: fix macOS drag&drop under SHOW_BANNER=NO

  • ui: do not suggest shortcut migration

  • kernel: fixed regarg comments for an argument in the register pair in big endian MIPS

  • idc: wrong enum flag was returning for character representation of constants

  • gdb: avoid usage of already freed memory

  • kernel: now append_cmt() respects the repeatable flag for the function start

  • kernel: fixed handling of the special Go assembler characters

Known Issues

  • Mac installers are not yet notarized

  • Linux: crash on Wayland when trying to dock a floating window

  • Mac: missing custom Dock Menu, warning about "missing call to 'qt_mac_set_dock_menu'"

  • Mac: missing Dock Tile, warning about "IDAMainWindow::maybeUpdateDockTile()"

  • Mac: warning about "known incorrect sRGB profile"

  • Mac: rare crash on Exit; backtraces welcome!

Share your feedback

Spotted a bug or have a suggestion to the IDA 9.2 beta release? Let us know and contribute to IDA evolution:

Last updated

Was this helpful?