Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
You can execute any script file supported by the built-in scripting engine (IDC or Python), or a scripting language added by a plugin. The scripting language to use is selected by the file name extension of the script.
See also Immediate execution of script commands, Load... submenu commands.
In this submenu you can:
Load file Load file
Script command Execute a script command
Produce output file Generate output file
OS shell Execute OS commands
Save database Save database in packed form
Save database as... Save database in packed form in another file
Take database snapshot Take database snapshot
Abort Abort - do not save changes
Quit Quit to DOS - save changes
See also Menu Bar submenus.
Explore our in-depth guides, crafted to help you navigate through IDA features and master its advanced capabilities.
This command takes a database snapshot. The snapshot can be later restored from the database snapshot manager.
Note: snapshots work only with regular databases. Unpacked databases do not support them.
See also commands.
This command saves and packs the current database.
See also commands. command.
This command terminates the current IDA session. IDA will write all changes to the disk and will close all databases.
You can enable/disable database packing. When the database is packed, it consists of one file with IDB extension. When the database is not packed, it consists of several files on the disk. If packing is disabled, in the next session you cannot IDA. We do not recommend to leave the database in the unpacked form because you will not have a backup copy.
You can also perform garbage collection on the database before packing it. The garbage collection removes the unused database pages, making it smaller. However, IDA needs some free database pages when it works,therefore it will allocate them again when you reuse the database. Removing and adding free pages takes time and, what is most important, it changes the database control blocks.
Use garbage collection only when you do not intend to work with the database in the near future.
IDA will remember all information about the screen, cursor position, jump stack, etc. The following information will be lost: , the position To resume a disassembly session simply type: "ida file"
See also commands. command.
You can enter and execute a small script written in the built-in IDC language or any other registered extlang.
Here is the list of functions.
See also:
language overview
Execute command
commands
How to use .
This submenu allows you to load additional files into the database.
This command reloads the same input file into the database. IDA tries to retain as much information as possible in the database. All the names, comments, segmentation information and similar will be retained.
Only the values of individual bytes will be changed.
This command works for some input file types only: if the file was loaded into the database with special settings, this command may fail. In this case, use command and reload the file manually.
See also commands.
This command loads a binary file. The new file is added to the current database and all existing information is retained.
The file content will appear as unexplored bytes in the program.
This command only allows you to load binary files.
This command loads an IDS file.
An IDS file contains information about well-known functions (such as functions from MS Windows API), namely:
IDS files are automatically loaded if they are found in the IDS directory. This command allows you to load an IDS file from any directory, even after the main file has been loaded into the database.
This command loads a DBG file.
If the program being disassembled has a companion DBG file, then this command may be used to load information from a DBG file into the database. IDA loads DBG files automatically if it can find them in the directory with the input file.
The built-in debug information loader cannot load NB10 format files and PDB files. To load those files, please use a special plugin, PDB.DLL, which can be run manually using Edit->Plugins submenu. This plugin uses MS Windows DLLs to load the debug information and therefore has the following limitations:
This command loads a PDB file.
If the program being disassembled has a companion PDB file, then this command may be used to load information from the PDB file into the database.
By default IDA uses in-house code to parse and load PDB files. However, our code can not parse old v2.0 PDB files. For them, IDA can fall back to using Microsoft DLLs (the default is "do not fall back"). Please read more in cfg/pdb.cfg.
Command line switch '-Opdb:option1:option2' overrides for ida session the value in cfg/pdb.cfg.
Ida will not load PDB plugin for this session.
This command loads a TDS file.
If the program being disassembled has a companion TDS file, this command may be used to load information from the TDS file into the database.
The TDS file must be placed in the same directory together with the input file.
The LoadTdsFile command launches a special plugin TDS.DLL which can be run manually using Edit->Plugins submenu.
This command allows you to apply an additional signature file to the program.
A signature file contains patterns of standard runtime functions. With their help, IDA is able to recognize the standard functions and names them accordingly.
IDA attempts to detect the necessary signature files automatically but unfortunately, this is not always possible. This command adds the specified signature file into the planned signature files queue.
Signature files reside in the subdirectories of the SIG directory. Each processor has its own subdirectory. The name of the subdirectory is equivalent to the name of the processor module file (z80 for z80.w32, for example). Note: IBM PC signatures are located in the SIG directory itself. Note: the IDASGN environment variable can be used to specify the location of the signatures directory.
There is another way to load a signature file: you may insert/delete signature files in the following way:
This is a preferred way of applying signatures because useful information, such as the number of identified functions is displayed in the signature window.
FLIRT works only for the processors with normal byte size. The byte size must be equal to 8 (processors with wide bytes like AVR or DSP56K are not supported)
This command allows you to apply type declarations from a C header file to the program.
IDA reads and parses the specified header file as a C compiler does. In other words, it mimics the front-end of a C compiler with some restrictions:
In the case of an error in the input file, the error messages appear in the message window. In any case, the function declarations that are already parsed are not deleted from the database. IDA stops parsing the input file when 20 errors occur.
See also
To enable the IDAClang parser, go to Options>Compiler>Source parser, and select "clang". Then use 'File>Load file>Parse C header file' to invoke the parser on a given source file.
Since IDAClang is based on the third-party libclang parser, it can only parse standalone source files that contain valid C/C++/Objective-C syntax.
See also commands.
See also commands.
See also commands.
See also commands.
See also commands.
Don't forget to specify the compiler and memory model in the dialog box before loading a header file.
All type declarations found in the input file are stored in the current database in the form of a type library. These type declarations can be used to define new structure and enumeration definitions by pressing "Add standard structure" or "Add standard enum" buttons in the and dialog boxes.
IDA 7.7 introduced an based on libclang.
commands.
The IDAClang plugin is shipped with IDA, and it provides the ability to parse header files that contain arbitrarily complex C/C++/Objective-C source code using the action.
See also command.
See also commands.
Check the overview of the IDA interface with menu and windows views and their corresponding options
Analize your binary and learn how to manipulate the disassembly output
Discover strategies for optimizing pseudocode
Learn how to take advantage of all debugger features and dynamic analysis
Check how to identify known code functions and standard libraries
Improve your work with collections of predefined data types
Personalize IDA to meet your needs—change themes, fonts, shortcuts and more
Get advantage of collaborative engineering work
Get fast function recognition with Lumina server
Learn how to install plugins and write your own
Check all utilities ready to extend IDA functionality
This submenu allows the user to modify text representation and to patch the file. It also has the commands to control the analysis:
Operand types submenu
Comments submenu
Functions submenu
Structures submenu
Enums submenu
Segments submenu
Patch program submenu
Other submenu
Plugins submenu
See also Menu Bar submenus.
This command clears the undo history. After it the Undo and Redo commands become unavailable. However, once the user performs a new action, IDA will again start journaling all database modifications.
A side effect of this command is fast autoanalysis: since there is no user action to revert yet, IDA does not maintain undo buffers and this speeds up the analysis.
See also
By using this command, you can temporarily quit to the operating system.
This command is not available in the MS DOS version.
The database is left open when you use this command, so be careful.
See also other File... submenu commands.
This command terminates the current IDA session. The Abort command is not available if the database was not packed.
See also other File... submenu commands. Quit command.
This command reverts the previously issued Undo command. It is possible to use Redo multiple times.
This command also reverts all changes that were done to the database after the last Undo command, including the eventual useful modifications made by the autoanalysis. In other words, the entire database is modified to get to the exact state that it had before executing the last Undo command.
See also
This command converts the current unexplored bytes to data. If it is not possible, IDA will warn you.
Multiple using of this command will change the data type:
You may remove some items from this list using command.
If the does not support double words or another data type, it will be skipped. To create a structure variable, use command. To create an array, use command. To convert back, use command. See also submenu
This command converts the current unexplored bytes to a string.
The set of allowed characters is specified in the file, parameter StrlitChars. Character '\0' is not allowed in any case. If the current does not allow characters above 0x7F, characters with high bit set are not allowed.
If the has been dropped, IDA will take for the string all characters between the current cursor position and the anchor.
Use the if the string starts a disallowed character.
This command also generates a for the string. In the file, you can specify the characters allowed in names (NameChars).
You can change the literal string length using command.
The GUI version allows you to assign a special hotkey to create Unicode strings. To do so, change the value of the StringUnicode parameter in the IDAGUI.CFG file.
To create Pascal style strings (with first byte indicating string length) use command.
See also submenu
This command converts the current unexplored bytes to instruction(s). IDA will warn you if it is not possible.
If you have selected a range using the , all the bytes from this range will be converted to instructions.
If you apply this command to an instruction, it will be reanalyzed.
See also submenu
This submenu allows you to produce various output files. It also allows you to unload the database.
The text file-producing operations below will make use of
for output files.
Please enter a file name for the map. IDA will write the following information about this file:
You can use this map file for your information, and also for debugging (for example, Periscope from Periscope Company or Borland's Turbo Debugger can read this file).
Please enter a file name for the assembler text file. IDA will write the disassembled text to this file.
If some I/O problem (e.g. disk full) occurs during writing to the file, IDA will stop and a partial file will be created.
Please enter a file name for the assembler include file. IDA will write the information about the defined types (structures and enums) to this file.
If some I/O problem (e.g. disk full) occurs during writing to the file, IDA will stop and a partial file will be created.
Enter a file name for the assembler listing file. IDA will write the disassembled text to this file.
If some I/O problem (e.g. disk full) occurs during writing to the file, IDA will stop and a partial file will be created.
IDA produces executable files only for:
EXE files: Output files will have the same EXE-header and relocation table as the input file. IDA will fill unused ranges of the EXE file (e.g. between relocation table and loadable pages) with zeroes.
This command will prompt you for a filename and then will create a plain text difference file of the following format:
Please enter a file name for the HTML file. IDA will write the disassembled text to this file.
If some I/O problem (e.g. disk full) occurs during writing to the file, IDA will stop and a partial file will be created.
This command is available only in the graphical version of IDA.
This command creates a GDL (graph description file) with the flow chart of the current function.
If there is an active selection, its flow chart will be generated.
IDA will ask for the output file name. Regardless of the specified extension, the .GDL extension will be used.
This command creates a GDL (graph description file) with the graph of the function calls.
IDA will ask for the output file name. Regardless of the specified extension, the .GDL extension will be used.
This command saves current IDA database into a text file.
You can use it as a safety command:
This command is used when you want to switch to a new version of IDA. Usually each new version of IDA has its own database format. To create a new format database, you need:
Please note that this command does not save everything to text file. Any information about the local variables will be lost!
This command saves all definitions in the local types window into a C header file
Please note that that types created in the structures window will not be saved unless they are synchronized with the local types.
This command saves information about the user-defined types from the IDA database into a text file.
Information about enums, structure types and other user-defined types is saved in a text form as an IDC program.
You can use this command to migrate the type definitions from one database to another.
This command reverts the database to the state before executing the last user action. It is possible to apply Undo multiple times, in this case multiple user actions will be reverted.
Please note the entire database is reverted, including all modifications that were made to the database after executing the user action and including the ones that are not connected to the user action. For example, if a third party plugin modified the database during or after the user action, this modification will be reverted. In theory it is possible to go back in time to the very beginning and revert the database to the state state that was present immediately after performing the very first user action. However, in practice the undo buffers overflow because of the changes made by autoanalysis. generates copious amounts of undo data. Also please note that maintaining undo data during autoanalysis slows it down a bit. In practice it is not a big deal because the limit on the undo data is reached quite quickly (in a matter of minutes). Therefore, if during analysis the user does not perform any actions that modify the database, the undo feature will turn itself off temporarily.
However, if you prefer not to collect undo data at all during the initial autoanalysis, just turn off the UNDO_DURING_AA parameter in .
The configuration file has 2 more undo-related parameters:
Since there is a limit on the size of undo buffers, any action, even the tiniest, may become non-undoable after some time. This is true because the analysis or plugins may continue to modify the database and overflow the buffers. Some massive actions, like deleting a segment, may be non-undoable just because of the sheer amount of undo data they generate.
Please note that Undo does not affect the state of IDC or Python scripts. Script variables will not change their values because of Undo. Also nothing external to the database can be changed: created files will not be deleted, etc.
Some actions cannot be undone. For example, launching a debugger or resuming from a breakpoint cannot be undone.
See also
This command deletes the current instruction or data, converting it to 'unexplored' bytes. IDA will delete the subsequent instructions if there are no more references to them (functions are never deleted).
If you have selected a range using the , all the bytes in this range will be converted into 'unexplored' bytes. In this case, IDA will not delete any other instructions even if there are no references to them after the deletion.
See also submenu
This command allows you to create arrays and change their sizes.
The arrays are created in 2 simple steps:
Create the first element of array using the data definition commands (, , )
Apply the array command to the created data item. Enter array size in current array elements (not bytes). The suggested array size is the minimum of the following values:
For string literals, you can use this command to change the length of the string.
The dialog box contains the following fields:
Items on a line (meaningless for string literals):
Please note that the parameter affects the number of items on a line too.
Alignment (meaningless for string literals):
If applied to a variable-sized structure, this command is used to specify the overall size of the structure. You cannot create arrays of variable-sized structures.
See also:
This command converts the immediate operand of the current instruction/data to an offset from the current data segment (DS).
If current DS value is unknown (or equal 0xFFFF) IDA will warn you -- it will beep. In this case, you have to define DS register value for the current byte. The best way to do it is:
or you can of DS for the current segment.
If you want to delete offset definition, you can use this command again - it works as trigger.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
If a range is selected using the , IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to offsets. However, IDA will ask you first the lower and upper limits of immediate operand value. If the operand value is >= lower limit and <= upper limit then the operand will be converted to offset, otherwise it will be left unmodified.
To create offsets to structure members use command.
See also:
This command converts the immediate operand of the current instruction/data to an offset from the current segment (CS).
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
See also:
This command converts the immediate operand of the current instruction/data to an offset from any segment.
IDA will ask to choose a base segment for the offset.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
See also:
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
If the offset base is specified as 0xFFFFFFFF, then IDA will create "an automatic offset". Automatic offsets mean that the actual value of the base will be calculated by IDA.
The following offset attributes are available:
The offset base is dynamically calculated and is equal to the address of the current element:
for standalone items: their start address
for arrays: the start of the array element
See also:
The 'Hide sub structures without sub unions' option (checked by default) avoids to add unnecessary sub structures to the tree, to keep it as small as possible. If you uncheck this option, all sub structures will be added to the tree.
First of all, IDA will ask a so-called "struct offset delta". This value represents the difference between the structure start and the pointer value. For example, if you have an operand 4 and want to convert in into an expression like "mystruct.field_6-2", then you have to enter 2 as the delta. Usually the delta is zero, i.e. the pointer points to the start of the structure.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
See also:
This command gives name/renames/deletes for the current item.
To delete a name, simply give an empty name.
If the current item is referenced, you cannot delete its name. Even if you try, IDA will generate a name.
Local name
Include in name list
Here you can also include/remove the name from the
. If the name is hidden, you will not see it in
.
Public name
Autogenerated name
Weak name
Create name anyway
This submenu allows you to change the operand types to offsets, numbers, chars, etc. Use it to make disassembled text more understandable.
If IDA suspects that an operand can be represented as something different from a plain number, it will mark the operand as "suspicious" and show it in red. Use these commands to delete marks.
Some of these commands can be applied to a selected range. Click to learn about the rules applied to such operations.
See also submenu.
This command converts immediate operand(s) type of the current instruction/data to a number. That way, you can delete mark of the item.
The number is represented in the default radix for the current processor (usually hex, but octal for PDP-11, for example).
When you use this command, IDA deletes the entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command converts the immediate operand(s) type of the current instruction/data to decimal. Therefore, it becomes a 'number'.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current instruction or data operand type octal. IDA always uses 123o notation for octal numbers even if the current assembler does not support octal numbers.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current instruction or data operand type binary. IDA always uses 123b notation for binary numbers even if the current assembler does not support binary numbers.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current operand type floating point.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command displays or hides the leading zeroes of the current operand. Example: if the instruction looked like this:
then after applying the command it will look like this:
This command converts immediate operand(s) type of the current instruction/data to character.
When you use this command, IDA deletes the entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
See also submenu.
A complex offset expression looks like
It is specified by:
The relationship between these parameters is (the formula is given for full offsets):
You always have to specify the offset type and base. Usually, the delta is equal to zero. For the full offset type you may omit the offset target, which is recommended. In this case, IDA will calculate it automatically. However, if you specify the offset target, make sure that the relationship between the parameters still holds. For the half offset types, you have to specify the target because there is no way to calculate it.
The offset types:
You may disable the generation of the segmentation information. You may also enable or disable names in the output file.
If you have selected a range on the screen using command, IDA will write only the selected range (from the current address to the anchor).
If you've selected a range on the screen using command, IDA will write only the selected range (from the current address to the anchor).
Enter a file name for the new executable file. Usually this command is used after patching (see commands and ) to obtain a patched version of the file.
For other file formats please create a file.
Only commands affect the executable file contents, other commands (including ) will not affect the content of the disassembled file.
See also submenu.
See also submenu.
If you've selected a range on the screen using command, IDA will write only the selected range (from the current address to the anchor).
See also commands.
submenu
.
command.
If a range is selected using the , IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to offsets. However, IDA will ask you first the lower and upper limits of immediate operand value. If the operand value is >= lower limit and <= upper limit then the operand will be converted to offset, otherwise, it will be left unmodified.
If this command is applied to a structure member in the , then IDA will create an "automatic offset". An automatic offset is an offset with the base equal to 0xFFFFFFFF. This base value means that the actual value of the base will be calculated by IDA when a structure instance is created.
To create offsets to structure members, use command.
commands.
If a range is selected using the , IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to offsets. However, IDA will ask you first the lower and upper limits of immediate operand value. If the operand value is >= lower limit and <= upper limit then the operand will be converted to offset, otherwise it will be left unmodified.
To create offsets to structure members use command.
commands.
for structures: the start of the structure field The offset expression is displayed in the following concise form: offset target - $ where "$" denotes the start of the element (and is -dependent). To create offsets to structure members use command.
commands.
By default, IDA displays the structure member at offset 0. To change this behaviour, you can directly disable the 'Force zero offset field' in the 'Options' frame. Later zero offsets can be forced using menu item.
This command converts immediate operand(s) type of the current instruction/data to an offset within the specified structure. Before using this command, you have to a structure type.
If a range is selected using the , IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to offsets. However, IDA will ask you first the lower and upper limits of immediate operand value. If the an operand value is >= lower limit and <= upper limit then the operand will be converted to offset, otherwise it will be left unmodified.
When you use this command, IDA deletes the entered operand.
By default IDA doesn't display the structure member at offset 0. To change this behaviour, use command.
Moreover, if there are several possible representations (this can happen if unions are used), select the desired representation using the command.
command.
Related topics: submenu.
See also submenu. . .
This command converts immediate operand(s) type of the current instruction/data to hex number. So you can delete mark of the item.
When you use this command, IDA deletes the entered operand.
When you use this command, IDA deletes the entered operand.
When you use this command, IDA deletes the entered operand.
When you use this command, IDA deletes the entered operand.
When you use this command, IDA deletes the entered operand.
If you prefer to see leading zeroes in all cases, then open the and enter the following expression: (INF_GENFLAGS, get_inf_attr(INF_GENFLAGS) | INFFL_LZERO); This will toggle the default for the current database and all numbers without leading zeroes will become numbers with leading zeroes, and vice versa.
See also submenu.
See also
This command changes the sign of the current operand. Please note that not all operands can change their sign.
See also: Edit|Operand types submenu. Enter #th operand manually commands. Set operand type
If you have selected a range before applying an operand conversion command, IDA will display a dialog box.
You can choose a range of operands to perform an en masse operation:
The operation will be performed on all operands as a toggle. For example, if you ask to convert to a character, then all non-character operands will become characters, and all character operands will become non-chars.
The operation will be performed on the void operands which contain immediate numbers in the specified range.
This selection will convert all operands with the specified type to undefined operands. Example: all characters become non-characters.
This selection allows to convert all operands that do not have the specified type to the specified type. Example: all non-characters to characters.
This selection allows to convert all operands without any type to the specified type. Example: all operands with no type to characters.
IDA will check whether an operand can be represented with the specified type (as a character constant, for example), and perform type conversion only if the check is successful.
This command bit-wisely negates the current operand. Please note that not all types of operands can be negated. It is not possible to negate and change sign of an operand simultaneously.
This command works only if the current assembler supports the bitwise negation operation.
See also: Edit|Operand types submenu. Enter #th operand manually commands. Set operand type
This command converts the immediate operand(s) type of the current instruction/data to segment base. The segment bases are usually displayed like this:
When you use this command, IDA deletes the manually entered operand.
If IDA cannot find a segment whose base is equal to the operand value, it simply displays it as hex number.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
See also Edit|Operand types submenu.
This command converts immediate operand(s) type of the current instruction/data to an enum member. Before using this command, you have to define an enumeration type.
If the selected enum is a bitfield, IDA will try to build a bitfield expression to represent the constant. Please note that for bitfields having multiple constants with the same value some expressions won't be possible.
If a range is selected using the anchor, IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to symbolic constants. However, IDA will ask you first the lower and upper limits of immediate operand value. If the operand value is >= lower limit and <= upper limit then the operand will be converted to offset, otherwise it will be left unmodified.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise all other operands will be affected.
See also: Edit|Operand types submenu. Enter #th operand manually commands. Set operand type
This command converts immediate operand(s) type of the current instruction to an offset to stack variables, i.e. a local variable or function argument in the stack.
You need to define stack variables before using this command.
If the current operand is based on the value of the stack pointer ([ESP+xxx]) and the SP value is traced incorrectly, then you need to correct SP value using change stack pointer command.
If a range is selected using the anchor, IDA will perform 'en masse' conversion. It will convert immediate operands of all instructions in the selected range to stack variables. However, IDA will ask you first the lower and upper limits of immediate operand value. If the operand value is >= lower limit and <= upper limit then the operand will be converted to stack variable, otherwise it will be left unmodified.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise all other operands will be affected.
See also: Edit|Operand types submenu. Enter #th operand manually commands. Define stack variables...
This submenu allows you to manipulate different kinds of comments. Use them to make the disassembled text more understandable.
If you stand at the function start and your cursor is on a function name, IDA will ask you to enter a function comment.
If you stand at the segment start and your cursor is on a segment name, IDA will ask you to enter a segment comment.
If this command is issued in the structures window, it allows you to change the comment of a structure, or structure member. If the cursor is on the structure name, it will be changed, otherwise the member name will be changed. Otherwise, this command allows you to enter a normal indented comment for the current item.
You can show/hide all comments in Comments Dialog.
See also
How to use the notepad
Edit|Comments submenu, Repeatable comments
This command allows you to enter a repeatable comment. A repeatable comment will appear attached to the current item and all other items referencing it.
If you stand at the function start, IDA will ask you to enter a function comment.
If this command is issued in the structures window, it allows you to change the comment of a structure or structure member. If the cursor is on the structure name, the structure comment will be changed, otherwise the member comment will be changed.
Otherwise, this command allows you to enter a repeatable comment for the current item.
You cannot enter repeatable segment comments.
All items that refer to the current item will have this comment by default.
Note that if you have defined both comment types (regular and repeatable), the regular comment will be displayed for the current item and the repeatable comment will be displayed for all items that refer to the current item, if they do not have their own comments.
The repeatable comments may be used to describe subroutines, data items, etc., because all calls to the subroutine will have the repeatable comment.
You can show/hide all comments in the Comments Dialog.
You can show and hide repeatable comments in the Comments Dialog.
See also "How to use the notepad".
If you want to enter multi-line comments or additional instructions, you can use this feature of IDA.
There are two kinds of extra lines: the ones generated before the instruction line and the ones generated after the instruction line.
Do not forget that the maximal number of lines for an item is 500.
IDA does not insert a comment symbol at the beginning of the lines.
See also "How to use the notepad".
Related topics: Edit submenu.
This command allows you to specify the type of the operand under the cursor.
The operand type must be entered as a C declaration. Currently IDA itself does not use the operand type information. However, it can be used by the Hex-Rays decompiler plugin. Setting operand type is most useful in case of indirect calls: the decompiler will use the type information to determine the input parameters to the call instead of guessing, which can make the decompiled code better.
An example of a type declaration:
To delete a type declaration, enter an empty string.
For details on possible calling conventions, see Set function/item type... menu item description.
See also Set function/item type...
This submenu allows you to patch the image of the input file. More precisely, IDA never modifies the input file. The image of the input file which was loaded to the database will be modified.
You can modify the image of the input file:
IDA will display the original value, the current value and file offset. If the file offset is equal to 0xFFFFFFFF then the current byte comes from a compressed page (LX/LE/NE iterated pages, for example) and/or it is not possible to tell the file position.
You can create a file and use an external tool to apply the patches or you can apply the directly to the file using IDA.
The following commands are available:
See also:
submenu.
If this command is invoked when the debugger is active, then IDA will modify the memory and the database. If the database does not contain the patched bytes, then only the process memory will be modified.
Apply previously patched bytes back to the input file. If the "Restore" option is selected then the original bytes will be applied to the input file.
The sequence must be separated by a space or a comma.
An entered number will occupy the minimal number of bytes it fits in with the restriction that the number of bytes is a power of 2 (1, 2, or 4 bytes).
Two question marks without a space between them are the same as one question mark. One question mark corresponds to one CPU byte. One CPU byte may consist of multiple octets for a wide-byte CPU, like TMS320C28.
Example:
This command allows you to assemble instructions. Currently, only the IBM PC processors provide an assembler, nonetheless, plugin writers can extend or totally replace the built-in assembler by writing their own.
The assembler requires to enclose all memory references into square brackets. For example:
Also, the keyword 'offset' must not be used. Instead of
you must write
This submenu allows you to manipulate segments of the program:
See also:
submenu.
This command allows you to create a new segment.
You need to specify at least:
If another segment already exists at the specified address, the existing segment is truncated and the new segment lasts from the specified start address to the next segment (or specified end address, whichever is lower). If the old and the new segments have the same base address, instructions/data will not be discarded by IDA. Otherwise, IDA will discard all instructions/data of the new segment.
An additional segment may be created by IDA to cover the range after the end of the new segment.
nternally, IDA has 32-bit linear address space (IDA64 uses 64-bit address space). The internal addresses are called "linear addresses". The input program is loaded into this linear address space.
Please note that usually the linear addresses are not used in the program directly. During disassembling, we use so-called "virtual addresses", which are calculated by the following formula:
We see that the SegmentBase determines what addresses will be displayed on the screen. More than that, IDA allows to create several segments with the same virtual address in them. For this, you just need to create segments with correct segment base values.
There are some address restrictions in IDA.
There is a range of addresses that are used for internal housekeeping. This range can be specified by the configuration variable PRIVRANGE (start address and size). It is not recommended to use these addresses for other purposes.
There is also one address which must never be used in the disassembly. It is the 'all ones' address, or -1. Internally, it is used as a BADADDR (bad address). No address or address range can include BADADDR.
Related topics:
IBM PC case -----------
Suppose we need to create a segment occupying addresses F000:1000..F000:2000 Let's calculate linear addresses:
The segment base must be selected so that the first offset in our segment will be 0x1000. Let's find it using the following equation:
After solving this equation, we see that the segment base is equal to 0xF000. (you see, this is really a very simple case :) )
Now, we can create a segment entering:
Please note that the end address never belongs to the segment in IDA.
Suppose we need to create a segment occupying virtual addresses 8000-C000. Since we are free to place our segment anywhere in the linear address space, we choose the linear addresses at our convenience. Let's say we choose a linear address 0x20000:
The segment base must be selected so that the virtual address in our segment will be 0x8000. Let's find it using the following equation:
After solving this equation, we see that the segment base is equal to 0x1800.
Now we can create a segment entering:
Please note that the end address never belongs to the segment in IDA.
Suppose we need to create a segment occupying linear addresses 200000-200C00 and the virtual addresses must have be 0000..0C00. If we simply enter
Then IDA will notice that the segment base is too big and does not fit into 16bits. Because of this IDA will find a free selector (let's say it has found selector number 5), define it to point at paragraph 0x20000 and create a segment. After all this we will have:
The first virtual address in the segment will be 0:
Please note that the end address never belongs to the segment in IDA.
2. Create a segment. Specify the selector number as the segment base.
This command allows you to delete a segment.
IDA will ask your the permission to disable the addresses occupied by the segment. If you allow this operation, all information about the segment will be deleted. In other words, IDA will discard the information about instructions or data, comments etc.
If you check the "disable addresses" checkbox, IDA will mark the addresses occupied by the segment as "nonexistent" in the program. You will lose *ALL* information, including byte values.
It is impossible to disassemble the content of addresses not located in any segment, therefore you must create a new segment if you want to resume the disassembly of that part of the code.
IDA will ask your the permission to disable addresses occupied by the segment. If you give your permission, information about the segment will be deleted, otherwise IDA will discard information about instruction/data, comments etc, but retain byte values so that you will be able to create another segment afterwards.
Changing the segment class may change the segment type.
DISABLE ADDRESSES: if set, when a segment is shrunk, all information about bytes going out of the segment will be completely removed.. Otherwise, IDA will discard information about instructions/data, comments etc, but will retain byte values so that another segment can be created later and it will use the existing byte values.
If IDA creates 2 segments where only one segment must exist, you may try the following sequence:
Segments with the 'debugger' attribute are the segments whose memory contents are not saved in the database. Usually, these segments are created by the debugger to reflect the current memory state of the program.
However, the user can modify this attribute.
If it is cleared, then the segment will permanently stay in the database after closing the debugger session. The database will reflect the state of the segment which was at the time when the status is changed.
If it is set, then the segment will become a temporary segment and will be deleted at the end of the debugging session.
The "debugger segment" checbkox is available only during debugging sessions.
The 'loader' segments are the segment created by the file loader. The segment having this attribute are considered to be part of the input file.
A segment with the 'debugger' attribute set and the 'loader' attribute not set is considered to be an ephemeral segment. Such segments are not analyzed automatically by IDA.
"Segment permissions" group box can be used to modify Segment access permissions (Read/Write/Execute)
Enter a new name for the segment. A segment name is up to 8 characters long. IDA does check if the length is ok. Try to give mnemonic names for the segments.
The segment class name identifies the segment with a class name (such as CODE, FAR_DATA, or STACK). The linker places segments with the same class name into a contiguous range of memory in the runtime memory map.
Changing the segment class changes only the segment definition on the screen. There are the following predefined segment class names:
If you change segment class and the segment type is "Regular", then the segment type will be changed accordingly.
In order to set the segment type "Regular", you should change the segment class to "UNK".
Segment class names are never deleted. Once you define a segment class name, you cannot reuse it as a name of another object.
You can choose between 16-bit and 32-bit segment addressing.
IDA will delete all instructions and data in the segment if the segment address is changed.
Never do it if you are not sure. It may have irreversible consequences, all instructions/data will be converted to undefined bytes.
Alignment: select between abs,byte,word,dword,para,page
You can specify the segment alignment for the selected segment. By default, IDA assumes 'byte' alignment.
Changing the alignment changes only the segment definition on the screen. Nothing else will happen.
Combination
A field that describes how the linker can combine the segment with other segments. Under MS-DOS, segments with the same name and class can be combined in two ways: they can be concatenated to form one logical segment, or they can be overlapped. In the latter case, they have either the same start address or the same end address, and they describe a common range in memory. Values for the field are:
Changing segment combination changes only the segment definition on the screen. Nothing else will happen.
This command allows you to move segment(s) to another address. Use it if the segment(s) are loaded at a wrong address.
This command shifts (moves) the selected segments in the memory to the target address. There must be enough free space at the target address for the segments.
All information in the segment will be moved to the new address, but since the addresses change, the disassembly might be not valid anymore (especially if the program is moved to the wrong addresses and the relocation information is not available).
The whole program will be shifted by the specified amount of bytes in the memory. The following options are available (we strongly recommend to leave them turned on):
Please note rebasing the program might remove user-defined xrefs.
in the segment C obviously refers to the segment B while the instruction
refers to the segment A.
However, IDA does not try to link these references unless you tell it to do so: include the segments A and B into a translation list of the segment C. It means that you have to create a translation list
for the segment C.
Below is a more complicated example:
translations
allow you to emulate overlays (the first set is A B D, the second A C E)
See also
Relevant only for processors with the segment registers.
You can specify a default value of a segment register for the current segment. When you change the default value, IDA will reanalyze the segment, taking the default value when it cannot determine the actual value of the register. This takes time, so do not be surprised if references are not corrected immediately.
Relevant only for processors with the segment registers. Currently this command works for IBM PC, TMS320C2, Intel80196, and PowerPC processors.
For Alpha processors, the user must enter the difference between the real GP value and the start of the GOT (global offset table). For example:
If you want to specify that a register points to "label", you must calculate and enter the difference "label-.got" as the register value.
The ARM processor module has a virtual segment register T which reflects the state of the T bit of the processor state register (PSR). Therefore, the value of this register controls THUMB/ARM mode. If its value is not zero, then the disassembly will be in the thumb mode.
For PowerPC processors, the user must enter an offset from the beginning of the TOC to the TOC entry which contains the address of the target. An example:
If you want to specify that a register points to "datachunk", you must calculate and enter the difference "sometc-TOC" as the register value. You can change the TOC value in the processor specific options (which is accessible from the analysis options).
For Intel 80196NP/NU processors, the user must enter the value of WSR or WSR1 register. IDA will automatically take the new value into account.
See also:
IDA classifies the change points. In the list of the change points, you can see the following postfixes after the register values:
IDA can display a list of the program segments. Each segment is represented by a line in the list. Please note that the end address of the segment never belongs to the segment in IDA.
The following segment attributes are visible:
The rest of the columns display the default values of the segment registers for the segment.
By default, the cursor is located on the current segment.
You can use normal cursor movement keys and the mouse. You can also search for the segment by pressing Alt-T, or directly jump to the desired line by typing in its number.
Press <Enter> to select line, <Esc> to cancel the selection.
You may specify any string instead of an operand if IDA does not represent the operand in the desired form. In this case, IDA will simply display the specified string in the instruction instead of the default operand.
The current operand (under the cursor) will be affected.
You can use this command not only with instructions but with data items too.
IDA proposes the previous manual operand as the default value in the input form.
To delete the manual operand and revert back to the default text, specify an empty string.
IDA automatically deletes manually entered operands when you change operand representation using operand submenu.
NOTE: A text offset reference is generated if you use a label in the program as the operand string. In other cases no cross-references are generated.
See also submenu.
You can modify the executable file and eventually file.
If you patch bytes, then you may enter multiple bytes. Follow this to learn about format of the input string.
You can create a file too.
See also .
See also .
See also .
If you select a range using the , IDA will propose the start address and the end address of the selection as defaults for the segment bounds.
Click to learn about addressing model used in IDA.
If "sparse storage" is set, IDA will use special sparse storage method for the segment. This method is recommended for huge segments. Later, it is possible to change the storage method of any region using IDC function.
Normally a SegmentBase is a 16bit quantity. To create a segment with base >= 0x10000, you need to use . However, if you try to create a segment with a segment base >= 0x10000, IDA will automatically choose appropriately a free selector and setup for the new segment.
All SegmentBases are looked up in the table.
Click to see an example of segment creation (simple case - IBM PC)
Click to see an example of segment creation (simple case - Z80)
Click to see another example of segment creation (automatically chosen selector)
Click to see another example of segment creation (user-defined selector)
See also
If the example we saw how IDA allocates a selector automatically. You could make it yourself:
1. Create a selector. For this, open the and press Ins. Enter a selector number and its value.
You can also edit (see below) an adjacent segment to it to those addresses.
To disassemble the addresses occupied by the segment, you need to create a new segment again (i.e. you cannot disassemble bytes without a segment). You can also another adjacent segment to these addresses.
MOVE ADJACENT SEGMENTS: means that the previous and next segments will be shrunk or expanded to fill gaps between segments. Click for more information.
one segment. Choose one with bad segment base value. Do not disable addresses occupied by the segment being deleted.
change bounds of another segment. Note that the segment command changes the boundaries of the overlapping segment automatically.
IMPORTANT NOTE1: If you use the segment translations, make sure that all segments have unique segment bases. If two segments are placed in the linear address space so that they must have the same segment base, you may assign different with equal values to them.
IMPORTANT NOTE2: IDA supports only one translation list per segment. This translation is applied by default to all instruction in the segment. If the segment uses other mappings, then these individual mappings can be specified for each instruction separately by using the commands.
IMPORTANT NOTE3: Since only code references are affected by the segment translations, try to create the RAM segment at its usual place (i.e. its linear address in IDA corresponds to its address in the processor memory). This will make all data references to it to be correct without any segment translation. For the data references to other segments you'll need to use the command for each such reference.
To specify a value other than the default value of a segment register, you can use command.
See also
This command creates or updates a segment register .
See for more info.
When IDA encounters an instruction which changes a segment register, it creates a segment register change point. So, mostly change points are maintained by IDA itself. IDA assumes that the segment registers do not change their values between change points. If you find out that IDA failed to locate a segment register change, or if you want to change a register value, you can create a change point using command. You can change the value of a segment register using command too.
IDA generates the appropriate 'assume' instructions for the change points if it was not disabled by .
Commands of this submenu are available in the enums window:
All enum members names must be unique in the program. You cannot define more than 256 enum members (symbolic constants) with the same value.
Please note that you can create bitfield definitions here.
You can also add a comment for the enum and for each enum member. In order to specify an enum comment, you must stand at the enum name. Comments are set using regular commands:
See also Edit submenu.
These commands allow you to define and to edit an enum type. You need to specify:
Each enum has its ID and a serial number. The ID is a number used to refer to the enum, while a serial number is used to order enums during output. Changing the serial number moves the enum to another place.
The serial number of an enum is displayed at the lower left corner of the window.
You can specify any number as a serial number, IDA will move the enum to the specified place.
You also need to specify representation of enum constants. You may choose from various number bases (hex,dec,oct,bin) and character constants.
You may specify the element width or leave it zero. Zero means the element width is not specified. The allowed widths are the powers of 2 in the range of 1..64.
Please note that you can create bitfield definitions here by checking the "bitfield" checkbox.
These command is available when you open the enums window.
See also How to Enter a Number.
This command deletes the current enum. Beware, when you delete an enum all references to it will be destroyed. Even if you recreate it later, you'll have to specify again all references to it.
This command is available when you open the enums window.
This command allows you to define an enum member. An enum member is a symbolic constant. You have to specify its name and value. You cannot define more than 256 constants with the same value in an enum.
If the current enum is a bitfield, you need to specify the bitmask. To learn about bitmasks, read about bitfields.
This command allows you to rename an enum member. An enum member is a symbolic constant. Its name must be unique in the program.
To rename an enum type name, position the cursor over the name of the enum.
Please remember that deleting a member also deletes all the information about the member, including comments, member name etc.
There is a special kind of enums: bitfields. A bitfield is an enum divided into bit groups. When you define a new symbolic constant in a bitfield, you need to specify the group to which the constant will belong to. By default, IDA proposes groups containing one bit each. If a group is not defined yet, it is automatically created when the first constant in the group is defined. For example:
will define a constant named CONST1 with value 1 and will create a group containing only one bit. Another example. Let's consider the following definitions:
How do we describe this?
If a mask consists of more than one bit, it can have a name and a comment. A mask name can be set when a constant with the mask is being defined. IDA will display the mask names in a different color.
In order to use a bitfield in the program, just convert an instruction operand to enum. IDA will display the operand like this:
will be replaced by
See also Enum window and Bitfields tutorial
In this menu, you can select a command to jump to the specified location in the file. Jumps are very fast and your previous position is saved. This submenu contains the following items:
See also
Search menu for fast navigating.
Jumps Stack concept.
Menu Bar submenus
By pressing <Enter> you navigate in the program in the same way as in a hypertext (the way the web browsers and help screens use).
This is the easiest way to explore the program: just position the cursor at the desired name and press "@<JumpEnter>".
Your current address is saved in the jump stack.
The Jump back command (usually Esc) will return you back.
If the cursor is at a stack variable, a window with stack variables is opened and the definition of the stack variable is displayed.
See also
Empty Stack command.
This command brings you back to the previous position in the history. It takes positions from Jumps Stack.
See also
Undo "jump back" command
Empty Stack command.
This command cancels the last Jump back command.
See also
Empty navigation stack command.
This command clears the jump stack.
See also
Jump back command.
Each IDA Window has its own jump stack. This stack keeps the cursor locations. Many IDA commands use the jump stack, i.e. they save the old cursor position to the stack. For example, when you are at the address 3000:0100 and press the Ctrl-C key (find instruction), the 3000:0100 is saved into the jump stack and the search is started. Afterwards, you can return to the old position using Jump back command.
You can clear the jump stack using the Empty stack menu command.
This command jumps to the specified address in the program. IDA will ask you for the target address. You can enter a name or an address as a hexadecimal number with or without a segment. If you enter a valid address then:
the current address is saved in the jump stack.
the cursor is positioned to the specified address. The Jump back command (usually Esc) will return you back.
In the structure and enum views, the cursor will be moved to the corresponding offset in the current type.
See also
IDA will ask you for a target file offset. This command jumps to the address corresponding to this specified file offset. If this file offset corresponds to a valid address then:
the current address is saved in the jump stack.
the cursor is positioned to the corresponding address. The Jump back command (usually Esc) will return you back.
This command allows you to jump to a name definition by selecting it from the list of the names.
IDA will display the list of the names (sorted by addresses) and you can choose a name. Dummy names (generated by IDA) are not listed. Hidden names are not listed either. You can control which names are listed in the Names representation dialog box.
See also How to use the lister.
This command jumps to the start of the selected segment. IDA will ask you to select the target segment. After:
the current address is saved in the jump stack.
the cursor is positioned to the specified address. The Jump back command (usually Esc) will return you back.
See also:
This command jumps to the selected Segment Register Change Point. IDA will ask you to select a target change point. And after:
the current address is saved in the jump stack.
the cursor is positioned to the specified address. The Jump back command (usually Esc) will return you back.
This command allows you to jump to a problematic location. IDA will display the Problems List and will allow you to select a problem.
The Jump back command (usually Esc) will return you back.
You can mark certain locations of the file to be able to jump to them quickly. Text description of the location may help to find a desired location easily.
First select a slot for the mark, then enter a description for the location.
This command jumps to the selected position. IDA will ask you to select a target position. After:
the current address is saved in the jump stack.
the cursor is positioned to the specified address.
The Jump back command (usually Esc) will return you back.
You can mark the position using Mark Position command.
This command shows you a list of cross-references to the current location: you can jump to the selected one by pressing Enter.
Click here to see the description of the cross reference dialog box.
See also
The cross reference dialog displays a list of references to the various items. Each line has the following attributes:
Direction Up or Down. Meaningful for program address; denotes where the reference comes from, from the lower addresses than the reference target (down) or from higher addresses (up).
Type
Address
Text
This command shows you a list of cross-references from the current location: you can jump to the selected one by pressing Enter.
Click here to see the description of the cross reference dialog box.
See also
This command shows you a list of cross-references to the current operand: you can jump to the selected one by pressing Enter.
Click here to see the description of the cross reference dialog box.
See also
This command shows you a list of functions: you can jump to the selected one by pressing Enter.
See also
This command searches the start of the next function and jumps to the found address.
This command searches the start of the previous function and jumps to the found address.
This command shows you a list of entry points: you can jump to the selected one by pressing Enter.
The list of entry points is created at the database creation time. It is not modified after that (for example, renaming an exported function does not change the list of entry points).
This command gives name/renames/deletes name for the specified address. This is a more powerful variant of Rename command.
To delete a name, simply give an empty name.
If the specified address is referenced, you cannot delete its name. Even if you try it, IDA will generate a dummy name.
This command is available only from the name window.
For an explanation about the dialog box entries, please see the Rename current address command.
See also Edit|Other submenu. How to Enter an Identifier. Names representation.
See also Edit submenu.
This command allows you to create an alignment directive. The alignment directive will replace a number of useless bytes inserted by the linker to align code and data to paragraph boundary or any other address which is equal to a power of two.
You can select a range to be converted to an alignment directive. If you have selected a range, IDA will try to determine a correct alignment automatically.
There are at least two requirements for this command to work:
there must be enough unexplored bytes at the current address.
an alignment directive must always end at an address which is divisible by a power or two.
See also
This command allows you to specify the representation of an instruction or data in the program.
Use it if IDA cannot represent the current instruction as desired. If the instruction itself is ok and only one operand is misrepresented, then use Enter operand manually command.
To delete the manual representation, specify an empty string.
This command allows you to specify the background color for the current instruction or data item.
Only GUI version supports different background colors. Specifying a non-defined custom color will reset the instruction color.
This command allows you to hide a thin border which is like the one generated automatically by IDA between instructions and data. If the border was already hidden, then it is displayed again.
Note that you can hide all borders at once in the Comments Dialog.
The full syntax and semantics of the regular expressions that are supported by PCRE2 are described in the pcre2pattern documentation. This document contains a quick-reference summary of the syntax.
QUOTING
ESCAPED CHARACTERS
This table applies to ASCII and Unicode environments.
Note that \0dd is always an octal code. The treatment of backslash followed by a non-zero digit is complicated; for details see the section "Non-printing characters" in the pcre2pattern documentation, where details of escape processing in EBCDIC environments are also given.
When \x is not followed by {, from zero to two hexadecimal digits are read, but if PCRE2_ALT_BSUX is set, \x must be followed by two hexadecimal digits to be recognized as a hexadecimal escape; otherwise it matches a literal "x". Likewise, if \u (in ALT_BSUX mode) is not followed by four hexadecimal digits, it matches a literal "u".
CHARACTER TYPES
\C is dangerous because it may leave the current matching point in the middle of a UTF-8 or UTF-16 character. The application can lock out the use of \C by setting the PCRE2_NEVER_BACKSLASH_C option. It is also possible to build PCRE2 with the use of \C permanently disabled.
By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode or in the 16-bit and 32-bit libraries. However, if locale-specific matching is happening, \s and \w may also match characters with code points in the range 128-255. If the PCRE2_UCP option is set, the behaviour of these escape sequences is changed to use Unicode properties and they match many more characters.
GENERAL CATEGORY PROPERTIES FOR \p and \P
PCRE2 SPECIAL CATEGORY PROPERTIES FOR \p and \P
Perl and POSIX space are now the same. Perl added VT to its space character set at release 5.18.
SCRIPT NAMES FOR \p AND \P
Ahom, Anatolian_Hieroglyphs, Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Carian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cuneiform, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hieroglyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hatran, Hebrew, Hiragana, Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscriptional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Linear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Multani, Myanmar, Nabataean, New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Hungarian, Old_Italic, Old_North_Arabian, Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Shavian, Siddham, SignWriting, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, Yi.
CHARACTER CLASSES
In PCRE2, POSIX character set names recognize only ASCII characters by default, but some of them use Unicode properties if PCRE2_UCP is set. You can use \Q...\E inside a character class.
QUANTIFIERS
ANCHORS AND SIMPLE ASSERTIONS
MATCH POINT RESET
\K is honoured in positive assertions, but ignored in negative ones.
ALTERNATION
CAPTURING
ATOMIC GROUPS
COMMENT
OPTION SETTING
The following are recognized only at the very start of a pattern or after one of the newline or \R options with similar syntax. More than one of them may appear. (*LIMIT_MATCH=d) set the match limit to d (decimal number)
Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the limits set by the caller of pcre2_match(), not increase them. The application can lock out the use of (*UTF) and (*UCP) by setting the PCRE2_NEVER_UTF or PCRE2_NEVER_UCP options, respectively, at compile time.
NEWLINE CONVENTION
These are recognized only at the very start of the pattern or after option settings with a similar syntax.
WHAT \R MATCHES
These are recognized only at the very start of the pattern or after option setting with a similar syntax.
LOOKAHEAD AND LOOKBEHIND ASSERTIONS
Each top-level branch of a look behind must be of a fixed length.
BACKREFERENCES
SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
CONDITIONAL PATTERNS
BACKTRACKING CONTROL
The following act immediately they are reached:
The following act only when a subsequent match failure causes a backtrack to reach them. They all force a match failure, but they differ in what happens afterwards. Those that advance the start-of-match point do so only if the pattern is not anchored. (*COMMIT) overall failure, no advance of starting point
CALLOUTS
The allowed string delimiters are ` ' " ^ % # $ (which are the same for the start and the end), and the starting delimiter { matched with the ending delimiter }. To encode the ending delimiter within the string, double it.
In this menu, you can select a command to search for something in the disassembly. Searches are relatively slow and your previous position is saved in the jump stack.
You can search for:
suspicious operands (instructions that need your attention)
pictures (i.e., raster images) in both - directions (up and down).
See also
Suspicious operands are the operands that need your attention because they contain an immediate value that could be a number or an offset. IDA does not know about it, so it marks these instructions as 'suspicious'. You can change the suspiciousness of the operands using set lower limit of suspicious operands and set upper limit of suspicious operands commands.
Data arrays are considered to be suspicious if the first element of the data array is within the lower and upper suspicious limits. Values of other elements are not examined.
You can disable the display of the 'suspicious' marks in the Comments Dialog.
NOTE: We strongly recommend that before producing an ASM file you go through all 'suspicious' marks and get rid of them. After this you have a certain level of confidence that the file has been disassembled correctly.
This command searches for the first instruction in the current direction.
This command searches for the first defined data item in the current direction.
This command searches for the first unexplored byte in the current direction.
This command searches for the first defined byte (instruction or data in the current direction.
This command searches for the first instruction or data byte that contains the specified immediate value. The command is relatively slow (but much faster than the text search), because it disassembles each instruction to find the operand values.
If the immediate value in an instruction has been logically or bitwise negated, then this command will check against the modified value. Example:
will be found if the user searches for the immediate value 2 but not when he searches for 0xFE.
If the checkbox "any untyped value" is checked, then the "value" field is ignored. IDA will look for all immediate values without type in this case.
This command repeats search for immediate command.
This command searches for the specified substring in the text representation of the disassembly. This command is a slow command, because it disassembles each instruction to get the text representation. IDA will show its progress on the indicator. You can interrupt this command pressing Ctrl-Break.
You may search for regular expressions too.
If a range is selected using anchor, IDA will search for the specified substring in the range.
Note that this command searches the same as what you see on your screen (and not in binary image).
For binary search, look at Search for substring in the file
This command repeats search for text command.
This command searches for the specified substring in the file being disassembled. This command can be used for fast lookups of text strings in the executable file or even to find references to a data. You can interrupt it pressing Ctrl-Break.
If a range is selected using anchor, IDA will search for the specified substring in the range.
The substring is specified like this:
i.e. in the double-quotes. Also you can specify individual byte values as numbers:
Follow this link to learn more about the format of the input string.
For example, if you want to find a reference to the following string:
you could search for number 106A in the file.
See also
search for text command.
This command repeats search for text in core command.
This command searches for the first byte not belonging to any function in the current direction.
The current direction for searches is displayed in the right upper corner of the screen. Using this command, you can toggle the display.
See also Options submenu.
This command searches for all suspicious operands and presents a list of them. You may use this list to examine the operands and modify them as needed.
See also
This commands searches for the 'error' operands. Usually, these operands are displayed with a red color.
Below is the list of probable causes of error operands:
This command searches for all strings containing any error and presents a list of them. You may use this list to examine errors and correct them as needed.
See also
Commands of this submenu are available in the structures window. Only Declare struct var... is available in the disassembly window.
Use regular commands to specify struct and union members, their types, comments, etc.
A union is a special kind of structure. Use structure definition commands to manipulate unions.
See also Edit submenu.
This command defines a new structure or a new union. The new structure is created with zero length. You will have to add structure members using structure manipulation commands.
If the entered structure name denotes a standard structure type from a loaded type library, then its definition will be automatically used. In this case, the value of the 'create union' checkbox will be ignored.
This command is available when you open a structures window.
You can add new members to the structure using the following commands: command hotkey ------- ------ make data D make strlit A make array * rename N You may also insert/delete undefined bytes into the middle of the structure by using expand and shrink commands.
"Create before current structure" means that the new structure will be placed immediately before the current structure type. Otherwise, the new structure is placed after the current structure.
"Don't include in the list" means that the structure will not be included in the list of the structures which appears when the user applies the structure definition, for example, when he creates a variable of this structure type. We recommend to mark this checkbox when you have defined all variables of this structure type and want to reduce the number of choices in the list.
See also How to Enter an Identifier.
This command makes a copy of the current structure type. The new structure type will have the same members as the current one but its name will be autogenerated (something like struc_333)
By default the new structure type will be placed after the current structure type.
This command deletes the current structure. Beware, when you delete a structure, all references to it will be destroyed as well. Even if you recreate it later, you'll have to specify again all references to it.
You may use this command to delete unions also.
This command is available when you open a structures window.
This command expands the current structure by inserting undefined bytes at the cursor location. The cursor must not be at the end of the structure. To define a member at the end of the structure, just use normal data definition commands.
This command is available when you open a structure window.
This command shrinks the current structure by deleting undefined bytes at the cursor location. The cursor must be at an undefined byte. IDA will ask the user the number of bytes to remove.
This command is available when you open a structure window.
This command allows the user to change the structure alignment
Structure alignment is used to calculate the number of padding bytes at the end of the structure. For example, if alignment is 4 and the last field is a byte at offset 11h, IDA will add 3 bytes of padding so that the struct size is 14h (multiple of 4).
The alignment must be a power of 2.
This command is available in the Structures window.
See also How to Enter a Number.
This command declares a variable of the specified structure type.
IDA will ask you to choose a structure type. You must have some structure types defined in order to use this command.
If the target assembler supports it, IDA will display the structure in terse form (using just one line). To uncollapse a terse structure variable use the Unhide command.
You can also use this command to declare a structure field in another structure (i.e. nested structures are supported too).
This command forces IDA to display a full structure member name even if the offset of the member is equal to zero.
If used twice, the command cancels itself.
Example: Suppose we have the following structure:
This command tells IDA how to display references to a union from the current cursor location.
Example: Suppose we have the following union:
This command defines a new structure from data already defined. The new structure is created with adequate data types, and each member uses the current data name if it is available.
This command is available only in the graphical version of IDA.
This command scans the current struct variable and renames the locations pointed by offset expressions unless they already have a non-dummy name.
It also copies the type info from the struct members to pointed locations.
The following problems may occur:
NOOFFSET Cannot find offset base
NONAME Cannot find name
NOCMT Cannot find comment
NOREF Cannot find references
INDIRJMP Indirect execution flow
NODISASM Cannot disassemble
ALREADY Already data or code
OVERFLOW Too many lines
See also Jump submenu.
What to do: Mark the operand again as an offset. Use one of the following commands:
Description: Two reasons can cause this problem: 1.Reference to an illegal address is made in the program being disassembled; 2.IDA couldn't find a name for the address but it must exist. What to do:
If this problem is caused by a reference to an illegal address
Otherwise, the database is corrupt.
What to do: Enter the operand manually again. Use one of the following commands: User-defined operand
What to do: Database is corrupt, the best thing to do is to reload the database.
Possible reason(s):
The specified bytes do not form an instruction.
The current processor type is incorrect. What to do: If you are sure that the specified bytes contain an instruction, you can try to change processor type and mark these bytes as an instruction using the following command: Convert to instruction
Description: IDA cannot convert this byte(s) to an instruction or data because it would overlap another instruction. What to do: Make the following overlapping instruction or data 'unexplored' using undefine command.
Description: IDA encountered a jump or call instruction to an illegal address. Namely:
jump/call beyond program segments
near jump/call beyond the current segment What to do:
Enter the operand manually
or Create a new segment making the illegal address legal
or Change the current segment bounds using one of the following:
What to do:
If the current item is an array or String literal, try to divide it. or
Delete Additional comment lines or
Disable cross-references display or 4. Increase the limit in IDA.CFG, the parameter name is MAX_ITEM_LINES.
What to do:
Examine the value of stack pointer at various locations of the function and try to find out why the stack tracing has failed. Usually, it fails because some called function changed the stack pointer (by purging the input parameters, for example)
If you have found the offending function, change its attributes (namely, number of bytes purged upon return).
Another way is to specify manually how the stack pointer is modified. See Change stack pointer command
Here are commands to draw various graphs:
IDA uses an external program to display graphs. The program name is wingraph32.exe and it is located in the current directory.
The user can change the name of this program using the GRAPH_VISUALIZER parameter in the file.
The user can zoom the graph and move it around the window.
See also submenu.
This command displays the flow chart of the current function.
The colored edges of the flow chart represent the outcome of conditional jump instructions. Green means that the condition is satisfied, red means not satisfied.
This command displays the graph of all function calls in the program.
The functions are represented as nodes. The calls are represented as edges between nodes. Instructions outside functions are ignored.
This command displays the graph of code and data xrefs to current address/range of selected addresses in the program.
The addresses are represented as nodes. The xrefs are represented as edges between nodes.
This command displays the graph of code xrefs from the current address/range of selected addresses in the program.
In this direction, data xrefs aren't analyzed to avoid overloaded graphs.
The addresses are represented as nodes. The xrefs are represented as edges between nodes.
This command displays a user-defined graph of xrefs from/to the current address/range of selected addresses in the program.
The direction of the xrefs to analyze can be chosen. If the Recursive flag is checked, all found xrefs are themselves analyzed to find new xrefs. You can choose to search for xrefs to new referenced addresses only in the current direction. Only External, data xrefs, xrefs from library functions and to library functions can possibly be ignored.
A recursion depth can be specified. If 'Print recursion dots' is checked, and a function has others xrefs outside of the range defined by the 'recursion depth' setting, small nodes containing dots are printed.
The 'Print comments' flag causes the generated function node to also contain the function comment.
The addresses are represented as nodes. The xrefs are represented as edges between nodes. The used colors are the same as in IDA.
Here are commands to open various windows, display information etc.
The "WindowOpen" command opens a new window with the disassembly. IDA automatically opens one disassembly window at the start.
A double click of the mouse is equivalent to the <Enter> key.
This command opens the exports window.
This command opens the imports window.
Listed for each function are:
The last column of this window has the following format:
If a function has its color set, its line is colored using the specified color. Otherwise library and lumina functions are colored with the corresponding color. Otherwise the line is not colored.
A bold font is used for functions that have definite (user-specified) prototype. Also some plugins too may set this flag. Such prototypes are taken as is by the decompiler, while other prototypes are considered only as a starting point during decompilation.
It is possible to automatically synchronize the function list with the active disassembler, pseudocode, or hex view. For that right click on the function list and select "Turn on synchronization".
The GUI version displays a small icon for each name:
This command opens the signatures window.
For each signature, the following is displayed:
You can modify the planned signatures list here: add/delete library modules to be used during the disassembling.
You cannot delete an applied signature from the list.
To add a signature to the list for the application press <Ins>. You will see a list of signatures that can be applied to the program being disassembled.
Text version: Not all signature files will be displayed (for example, 32 bit signatures will not be shown for a 16 bit program). If you want to see the full list of signatures, select the first line of the list saying SWITCH TO FULL LIST OF SIGNATURES.
Signature files reside in the subdirectories of the SIG directory. Each processor has its own subdirectory. The name of the subdirectory is equal to the name of the processor module file (z80 for z80.w32, for example). Note: IBM PC signatures are located in the SIG directory itself. Note: the IDASGN environment variable can be used to specify the location of the signatures directory.
Depending on the current processor type, you will see DS,ES,SS with or without FS,GS.
This command opens the cross-references window. This window contains all references to the current location.
You can add and delete cross references here too by pressing Ins or Del. Right clicking on the mouse will work too.
Add a cross reference: the from and to address, as well as the xref type should be specified.
Del a cross reference: if the 'undefine if no more xrefs' is check, then the instruction at the target address will be undefined upon the deletion of the last xref. IDA undefines instructions only if they do not start a function.
This command opens the structure definitions window.
You can modify structure definitions here: add/rename/delete structures, add/delete/define structure members.
In the structure header IDA displays the following info:
This command opens the enum definitions window.
You can also add a comment for the enum and for each enum member. In order to specify an enum comment, you have to stand at the enum name. Comments are set using regular commands:
This command opens the local types window. The user can manipulate local types here:
Please note that Ins can be used to add many types at once. For that the user just needs to enter multiple declarations, one after another in the dialog box.
However, Ctrl-E permits for editing of one type at a time. This may cause problems with complex structure types with nested types. Nested types will not be saved by Ctrl-E.
If the edited type corresponds to an idb type (struct or enum), then the corresponding type will be automatically synchronized. If the user modifies an idb type in the struct/enum windows, the corresponding local type will be updated too. So the type synchronization works both ways.
Each type in the local type library has an ordinal number and may have a name.
Be careful when deleting existing types because if there are references to them, they will be invalidated.
A local type can be mapped to another type. Such an operation deletes the existing type and redirects all its references to the destination type. Circular dependencies are forbidden. In the case of a user mistake, a mapped type can be deleted and recreated with the correct information.
See also
You can jump to a problem by pressing Enter. The selected problem will be deleted from the list.
This command opens the type libraries window. Here the user can load and unload standard type libraries.
The standard type libraries contain type definitions from the standard C header supplied with compilers. Usually, IDA tries to determine the target compiler and its type libraries automatically but if it fails, this window allows you to load the appropriate type library.
This command opens the string window.
The string window contains all strings in the program. However, if a range of addresses was selected before opening the window, only the selected range will be examined for strings.
You can setup the list parameters by right-clicking (or pressing Ctrl-U in the text version) on the list.
The list always contains strings defined in the program regardless of the settings in this dialog box, but the user can ask IDA to display strings not yet explicitly defined as strings.
The following parameters are available:
Minimal string length
This command opens the function calls window.
All functions who call the current function are displayed at the top of the window.
All functions called from the current function are displayed at the bottom of the window.
The list is automatically refreshed when the cursor is moved to another function.
Opens a notepad window for the general notes about the current database. The entered notes will be saved in the current database.
Alt-T hotkey can be used to search for a text and Ctrl-T to repeat the last search.
The notepad is available only in the GUI version.
This command opens a window with the undo history. It is available from the Views, Open subviews submenu.
Double clicking on a line reverts the database to the state before the corresponding action.
It is possible to truncate the undo history by using the corresponding context menu command. The undo information for the selected action will be removed together with the information about all preceding actions.
The redoable user actions are displayed in italics. The current position in the undo buffers is displayed in bold, it usually denotes the first redoable user action.
See also
This command centers the cursor.
IDA opens a special non-closable window at the start. This window is called "message window". In this window you see various IDA messages.
If the message window is hidden behind other windows, you will not see the IDA messages.
You can duplicate all messages appearing in this window to a file. For this, you have to define an environment variable:
In the graphical version, there is a small window with arrows on the left of the disassembly. These arrows represent the execution flow, namely the branch and jump instructions. The arrow color can be:
The arrow thickness can be:
Finally, the arrows can be solid or dotted. The dotted arrows represent conditional branches when the solid arrows represent unconditional branches.
You can resize the arrows window using a vertical splitter or even fully hide it. If it is hidden, the arrows window will not be visible on the screen but you can reveal it by dragging the splitter to the right. IDA remembers the current arrow window size in the registry when you close the disassembly window.
Some windows allow you to manipulate the window contents by using the viewer commands.
See also submenu.
If the current location is an instruction belonging to a function, then the is available. You can toggle between the text and graph view using the Space key. You can also switch to proximity view by zooming out to the callgraph using the '-' key.
Use the disassembly commands to improve the listing.
Use Shift-<arrows> or Alt-L to drop . If you have a mouse, you can drop the anchor with it too.
To the left of disassembly, there is an (GUI version). Also the GUI version the current identifier.
You can use commands in this window.
You can use commands in this window.
A list of all functions in the program is displayed. You can , , functions using viewer commands.
This command opens the window.
You can use commands in this window.
This command opens the segments window. The format of this window is explained .
You can use commands in this window.
In order to change the selector values, use window.
This command opens the segment registers window. The window will contain segment register list.
You can use commands in this window.
See also submenu.
This command opens the selector window. Here you can change the "selector to base" mapping. The selector table is used to look up the selector values when the addresses that are visible in the disassembly listing.
You can use commands in this window:
You can use commands in this window.
Each structure must have a unique name. A field name must be unique in the structure. In order to create or delete a field, use data definitions commands (, , , , ). You may also define or comments.
In order to modify member types, use commands from the submenu. For example, to convert a structure member to an offset, use one of the following commands:
Some struct types in this window are created automatically by IDA. They are copies of some local types. Such structs are displayed in gray. They are considered as C-level types. As soon as the user edits such a type, it becomes an ASM-level type. Read .
You can modify enum definitions here: // enums, // enum members (i.e. user-defined symbolic constants)
Please note that you can create definitions here.
Each database has a local type library embedded into it. This type library (til) is used to store types that are local to the current database. They are usually created by a header file.
Some types in this list are created automatically by IDA. They are copies of the types defined in the or views. Such types are displayed using in gray, as if they are disabled.
Types displayed in black are considered as C level types. Read .
This command opens the problems window. The problem window contains the of all problems encountered by IDA during disassembling the program.
Furthermore, don't forget to specify the compiler and memory model in the dialog box.
Display only defined strings If checked, IDA will display only strings explicitly marked as string items (using the command). In this case, the other checkboxes are ignored. Ignore instructions/data definitions
Strict ASCII (7-bit) strings If checked, only strings containing exclusively 7-bit characters (8th bit must be zero) will be added to the list. Please note that the user can specify which characters are accepted in the strings by modifying the StrlitChars parameter in the file. This setting is ignored if 'only defined strings' is on. Allowed string types
In order to provide intuitive yet powerful interface to types IDA introduces two kinds of types:
Assembler level types are the ones defined by the user using the Struct or Enum views.
Since the user has to specify manually the member offset and other attributes, IDA considers the member offsets to be fixed for them and never shifts members of such types. If a member of struct becomes too big and does not fit the struct anymore, IDA will delete it.
The types defined in the Local types window are considered as C level types. For them IDA automatically calculates the member offsets and if necessary may shift members and change the total struct size.
The user may change the type level by simply editing the type from the appropriate window. For example, if a C level type is edited from the Struct view, IDA will consider such a type as an Assembler level type in the future.
This command shows the database snapshot manager. In this dialog, it is possible to restore previously saved snapshots, rename or delete them.
Note: snapshots work only with regular databases. Unpacked databases do not support them.
See also Take database snapshot commands.
This options tab allows for modification of Lumina credentials and use settings.
Use the public server
Use a private server
Automatically use Lumina server for analysis
Command line switch '-Olumina' overrides for ida session the primary server and '-Osecondary_lumina' the secondary one.
Use the public lumina as secondary server for this ida session
This submenu allows you to manipulate functions in the disassembly:
This command defines a new function in the disassembly text.
You can specify function boundaries using the anchor. If you don't specify any, IDA will try to find the boundaries automatically:
A function cannot contain references to undefined instructions. If a function has already been defined at the specified addresses, IDA will jump to its start address, showing you a warning message.
A function must start with an instruction.
Here you can change function bounds, its name and flags. In order to change only the function end address, you can use FunctionEnd command.
If the current address does not belong to any function, IDA beeps.
This command allows you to change the function frame parameters too. You can change sizes of some parts of frame structure.
IDA considers the stack as the following structure:
For some processors or functions, BP may be equal to SP. In other words, it can point to the bottom of the stack frame.
You may specify the number of bytes in each part of the stack frame. The size of the return address is calculated by IDA (possibly depending on the far function flag).
"Purged bytes" specifies the number of bytes added to SP upon function return. This value will be used to calculate the SP changes at call sites (used in some calling conventions, such as __stdcall in Windows 32-bit programs.)
"BP based frame" allows IDA to automatically convert [BP+xxx] operands to stack variables.
"BP equal to SP" means that the frame pointer points to the bottom of the stack. It is usually used for the processors which set up the stack frame with EBP and ESP both pointing to the bottom of the frame (for example MC6816, M32R).
If you press <Enter> even without changing any parameter,IDA will reanalyze the function.
Sometimes, EBP points to the middle of the stack frame. FPD (frame pointer delta) is used to handle such situations. FPD is the value substracted from the EBP before accessing variables. An example:
In our example, the saved registers area is empty (since EBP has been initialized before saving EBX and ESI). The difference between the 'typical BP' and 'actual BP' is 0x78 and this is the value of FPD.
After specifying FPD=0x78 the last instruction of the example becomes
where var_4 = -4
Most of the time, IDA calculates the FPD value automatically. If it fails, the user can specify the value manually.
If the value of the stack pointer is modified in an unpredictable way, (e.g. "and esp, -16"), then IDA marks the function as "fuzzy-sp".
If this command is invoked for an imported function, then a simplified dialog box will appear on the screen.
The following flags can be set in function properties:
Does not return
The function does not return to caller (for example, calls a process exit function or has an infinite loop). If no-return analysis is enabled in Kernel Options, IDA will not analyze bytes following the calls to this function.
Far function
On processors which distinguish near and far functions (e.g. PC x86), mark the function as 'far'. This may affect the size of the special stack frame field reserved for the return address, as well as analysis of calls to this function.
Library func
Mark the function as part of compiler runtime library code. This flag is usually set when applying FLIRT signatures
Static func
Mark the function as static. Currently this flag is not used by IDA and is simply informational.
BP based frame
Inform IDA that the function uses a frame pointer (BP/EBP/RBP on PC) to access local variables. The operands of the form [BP+xxx] will be automatically converted to stack variables.
BP equal to SP
Frame pointer points to the bottom of the stack instead of at the beginning of the local variables area as is typical.
Fuzzy SP
Function changes SP by an unknown value, for example: and esp, 0FFFFFFF0h
Outlined code
The function is not a real function but a fragment of multiple functions' common instruction sequence extracted by the compiler as a code size optimization (sometimes called "code factoring"). During decompilation, body of the function will be expanded at the call site.
This command appends an arbitrary range of the program to a function definition. A range must be selected before applying this command. This range must not intersect with other function chunks (however, an existing tail can be added to multiple functions).
IDA will ask to select the parent function for the selection and will append the range to the function definition.
This command removes the function tail at the cursor from a function definition.
If there are several parent functions for the current function tail range, IDA will ask to select the parent function(s) to remove the tail from.
After the confirmation, the current function tail range will be removed from the selected function definition.
If the parent was the only owner of the current tail, then the tail will be destroyed. Otherwise it will still be present in the database. If the removed parent was the owner of the tail, then another function will be selected as the owner.
Deleting a function deletes only information about a function, such as information about stack variables, comments, function type, etc.
The instructions composing the function will remain intact.
This command changes the current or previous function bounds so that its end will be set at the cursor. If it is not possible, IDA beeps.
Allow to edit argument or return value location.
This command opens the stack variables window for the current function.
The stack variables are internally represented as a structure. This structure consists of two parts: local variables and function arguments.
You can modify stack variable definitions here: add/delete/define stack variables, enter comments for them.
There may be two special fields in this window: " r" and " s". They represent the size of the function return address and of the saved registers in bytes. You cannot modify them directly. To change them, use edit function command.
Offsets at the line prefixes represent offsets from the frame pointer register (BP). The window indicator at the lower left corner of the window displays offsets from the stack pointer.
In order to create or delete a stack variable, use data definitions commands (data, strlit, array, undefine, Rename). Also you may define regular or repeatable comments.
The defined stack variables may be used in the program by converting operands to stack variables.
Esc closes this window.
See also Convert to stack variable.
This command allows you to specify how the stack pointer (SP) is modified by the current instruction.
You cannot use this command if the current instruction does not belong to any function.
You will need to use this command only if IDA was not able to trace the value of the SP register. Usually IDA can handle it but in some special cases it fails. An example of such a situation is an indirect call of a function that purges its parameters from the stack. In this case, IDA has no information about the function and cannot properly trace the value of SP.
Please note that you need to specify the difference between the old and new values of SP.
The value of SP is used if the current function accesses local variables by [ESP+xxx] notation.
See also Convert to stack variable.
This command allows you to rename a processor general register to some meaningful name. While this is not used very often on IBM PCs, it is especially useful on RISC processors with lots of registers.
For example, a general register R9 is not very meaningful and a name like 'CurrentTime' is much better.
This command can be used to define a new register name as well as to remove it. Just move the cursor on the register name and press enter. If you enter the new register name as an empty string, then the definition will be deleted.
If you have selected a range before using this command, then the definition will be restricted to the selected range. But in any case, the definition cannot cross the function boundaries.
You cannot use this command if the current instruction does not belong to any function.
This command allows you to specify the type of the current item.
If the cursor is located on a name, the type of the named item will be edited. Otherwise, the current function type (if there is a function) or the current item type (if it has a name) will be edited.
The function type must be entered as a C declaration. Hidden arguments (like 'this' pointer in C++) should be specified explicitly. IDA will use the type information to comment the disassembly with the information about function arguments. It can also be used by the Hex-Rays decompiler plugin for better decompilation.
Here is an example of a function declaration:
To delete a type declaration, please enter an empty string.
IDA supports the user-defined calling convention. In this calling convention, the user can explicitly specify the locations of arguments and the return value. For example:
denotes a function with 2 arguments: the first argument is passed on the stack (IDA automatically calculates its offset) and the second argument is passed in the ESI register and the return value is stored in the EBX register. Stack locations can be specified explicitly:
There is a restriction for a __usercall function type: all stack locations should be specified explicitly or all are automatically calculated by IDA. General rules for the user defined prototypes are:
- for really complicated cases this syntax can be used. IDA also understands the "__userpurge" calling convention. It is the same thing as __usercall, the only difference is that the callee cleans the stack.
The name used in the declaration is ignored by IDA.
If the default calling convention is __golang then explicit specification of stack offsets is permitted. For example:
This declaration means that myprnt is a print-like function; the format string is the second argument and the variadic argument list starts at the third argument.
Below is the full list of attributes that can be handled by IDA. Please look up the details in the corresponding compiler help pages.
For data declarations, the following custom __attribute((annotate(X))) keywords have been added. The control the representation of numbers in the output:
__bin
unsigned binary number
__oct
unsigned octal number
__hex
unsigned hexadecimal number
__dec
signed decimal number
__sbin
signed binary number
__soct
signed octal number
__shex
signed hexadecimal number
__udec
unsigned decimal number
__float
floating point
__char
character
__segm
segment name
__enum()
enumeration member (symbolic constant)
__off
offset expression (a simpler version of __offset)
__offset()
offset expression
__strlit()
string __stroff() structure offset
__custom()
custom data type and format
__invsign
inverted sign
__invbits
inverted bitwise
__lzero
add leading zeroes
__tabform()
tabular form
The following additional keywords can be used in type declarations:
_BOOL1
a boolean type with explicit size specification (1 byte)
_BOOL2
a boolean type with explicit size specification (2 bytes)
_BOOL4
a boolean type with explicit size specification (4 bytes)
__int8
a integer with explicit size specification (1 byte)
__int16
a integer with explicit size specification (2 bytes)
__int32
a integer with explicit size specification (4 bytes)
__int64
a integer with explicit size specification (8 bytes)
__int128
a integer with explicit size specification (16 bytes)
_BYTE
an unknown type; the only known info is its size: 1 byte
_WORD
an unknown type; the only known info is its size: 2 bytes
_DWORD
an unknown type; the only known info is its size: 4 bytes
_QWORD
an unknown type; the only known info is its size: 8 bytes
_OWORD
an unknown type; the only known info is its size: 16 bytes
_TBYTE
10-byte floating point value
_UNKNOWN
no info is available
__pure
pure function: always returns the same value and does not modify memory in a visible way
__noreturn
function does not return
__usercall
user-defined calling convention; see above
__userpurge
user-defined calling convention; see above
__golang
golang calling convention
__swiftcall
swift calling convention
__spoils
explicit spoiled-reg specification; see above
__hidden
hidden function argument; this argument was hidden in the source code (e.g. 'this' argument in c++ methods is hidden)
__return_ptr
pointer to return value; implies hidden
__struct_ptr
was initially a structure value
__array_ptr
was initially an array
__unused
unused function argument __cppobj a c++ style struct; the struct layout depends on this keyword
__ptr32
explicit pointer size specification (32 bits)
__ptr64
explicit pointer size specification (64 bits)
__shifted
shifted pointer declaration
__high
high level prototype (does not explicitly specify hidden arguments like 'this', for example) this keyword may not be specified by the user but IDA may use it to describe high level prototypes
__bitmask
a bitmask enum, a collection of bit groups
Sometimes in binary code we can encounter a pointer to the middle of a structure. Such pointers usually do not exist in the source code but an optimizing compiler may introduce them to make the code shorter or faster.
Such pointers can be described using shifted pointers. A shifted pointer is a regular pointer with additional information about the name of the parent structure and the offset from its beginning. For example:
The above declaration means that myptr is a pointer to 'int' and if we decrement it by 20 bytes, we will end up at the beginning of 'mystruct'.
Please note that IDA does not limit parents of shifted pointers to structures. A shifted pointer after the adjustment may point to any type except 'void'.
Also, negative offsets are supported too. They mean that the pointer points to the memory before the structure.
When a shifted pointer is used with an adjustment, it will be displayed with the 'ADJ' helper function. For example, if we refer to the memory 4 bytes further, it can be represented like this:
Shifted pointers are an improvement compared to the CONTAINING_RECORD macro because expressions with them are shorter and easier to read.
See also Set type command.
If we have this function prototype:
the 64bit GNU compiler will pass the structure like this:
Since compilers can use such complex calling conventions, IDA needs some mechanism to describe them. Scattered argument locations are used for that. The above calling convention can be described like this:
It reads:
In other words, the following syntax is used:
where
The regoff and size fields can be omitted if there is no ambiguity.
If the register is not specified, the expression describes a stack location:
where
Please note that while IDA checks the argument location specifiers for soundness, it cannot perform all checks and some wrong locations may be accepted. In particular, IDA in general does not know the register sizes and accepts any offsets within them and any sizes.
See also Set type command.
Syntax:
Instead of a plain number, a symbolic constant from the specified enum will be used. The enum can be a regular enum or a bitmask enum. For bitmask enums, a bitwise combination of symbolic constants will be printed. If the value to print cannot be represented using the specified enum, it will be displayed in red.
Example:
Another example:
This annotation is useful if the enum size is not equal to the variable size. Otherwise using the enum type for the declaration is better:
where
type is one of:
The type can also be the name of a custom refinfo.
It can be combined with the following keywords:
The base, target delta, and the target can be omitted. If the base is BADADDR, it can be omitted by combining the type with AUTO:
Zero based offsets without any additional attributes and having the size that corresponds the current application target (e.g. REF_OFF32 for a 32-bit bit application), the shoft __off form can be used.
Examples:
This annotation is useful the type of the pointed object is unknown or the variable size is different from the usual pointer size. Otherwise it is better to use a pointer:
Syntax:
where strtype is one of:
It may be followed by two optional string termination characters (only for C). Finally, the string encoding may be specified, as the encoding name or "no_conversion" if the string encoding was not explicitly specified.
Example:
Syntax:
Instead of a plain number, the name of a struct or union member will be used. If delta is present, it will be subtracted from the value before converting it into a struct/union member name.
Example:
Another example:
Syntax:
where dtid is the name of a custom data type and fid is the name of a custom data format. The custom type and format must be registered by a plugin beforehand, at the database opening time. Otherwise, custom data type and format ids will be displayed instead of names.
Syntax:
This keyword is used to format arrays. The following flags are accepted:
It is possible to combine NODUPS with the index radix: NODUPS|HEX
The `lineitems` and `alignment` attributes have the meaning described for the create array command.
Example:
Without this annotation, the `dup` keyword is permitted, number of items on a line and the alignment are not defined.
See also Edit submenu.
IDA can parse and handle simple C++ class declarations. It cannot parse templates and other complex constructs but simple standard cases can be parsed.
If a C++ class contains virtual functions, IDA will try to rebuild the virtual function table (VFT) for the class. The VFT will be linked to the class by the name: if the class is called "A", the VFT type will be "A_vtbl".
Let us consider the following class hierarchy:
IDA will create the following structures:
Please note that the VFT pointer in the class A has a special name: "__vftable". This name allows IDA to recognize the pointer as a VFT pointer and treat it accordingly.
Another example of more complex class hierarchy:
Compiling in 32-bit Visual Studio mode yields the following layout:
IDA will generate the following types:
The 'derived' class will use 2 VFTs:
IDA and Decompiler can use both VFTs and produce nice code for virtual calls.
Please note that the VFT layout will be different in g++ mode and IDA can handle it too. Therefore it is important to have the target compiler set correctly.
It is possible to build the class hierarchy manually. Just abide by the following rules:
C++ classes are marked with "__cppobj" keyword, it influences the class layout. However, this keyword is not required for VFT types.
In the case of a multiple inheritance it is possible to override a virtual table for a secondary base class by declaring a type with the following name: "CLASSNAME_XXXX_vtbl" where XXXX is the offset to the virtual table inside the derived (CLASSNAME) class.
Example: if in the above example we add one more function
then we need one more virtual table. Its name must be "derived_0008_vtbl". Please note that our parser does not create such vtables, you have to do it manually. See also Local types window.
This command allows you to hide a part of disassembly. You can hide a function, a segment, or create a special hidden range.
If a range is specified, a special hidden range is created on this range.
If the cursor is on the segment name at the start of the segment, the segment will be hidden. IDA will display only the header of the hidden segment.
If the cursor is on a structure variable and if the target assembler has the 'can display terse structures or the INFFL_ALLASM' bit on, then the structure will be collapsed into one line and displayed in the terse form.
Otherwise, the current function will be hidden. IDA will display only the header of the hidden function.
If there is no current function then IDA will beep.
If you want to see hidden items on the screen, you may use unhide command or enable the display of the hidden items. If you want to delete a previously created hidden range, you may use del hidden range command.
See also Edit|View submenu
This command converts immediate operand(s) type of the current instruction/data to a number. That way, you can delete suspicious mark of the item.
The number is represented in the default radix for the current processor (usually hex, but octal for PDP-11, for example).
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command converts immediate operand(s) type of the current instruction/data to hex number. So you can delete suspicious mark of the item.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command converts the immediate operand(s) type of the current instruction/data to decimal. Therefore, it becomes a 'number'.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current instruction or data operand type octal. IDA always uses 123o notation for octal numbers even if the current assembler does not support octal numbers.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current instruction or data operand type binary. IDA always uses 123b notation for binary numbers even if the current assembler does not support binary numbers.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command makes the current operand type floating point.
When you use this command, IDA deletes the manually entered operand.
If the cursor is on the first operand (the cursor is before ',') then the first operand will be affected; otherwise, all other operands will be affected.
This command displays or hides the leading zeroes of the current operand. Example: if the instruction looked like this:
then after applying the command it will look like this:
If you prefer to see leading zeroes in all cases, then open the calculator and enter the following expression: set_inf_attr(INF_GENFLAGS, get_inf_attr(INF_GENFLAGS) | INFFL_LZERO); This will toggle the default for the current database and all numbers without leading zeroes will become numbers with leading zeroes, and vice versa.
See also Edit|Operand types submenu.
In the graphical version, IDA highlights the identifier under the cursor. For example, if the cursor is on the "EAX" register, then all occurrences of "EAX" will be displayed with the yellow background. This feature is meant to make the program analysis easier by highlighting the interesting parts of the disassembly. For example, if the user wants to see all references to "EAX", he just clicks on any "EAX" on the screen and all of them will be highlighted.
The selection is made by pressing the Up, Down, Left, Right keys or by simply clicking on the identifier.
The selection is not changed by pressing the PageUp, PageDown, Home, End keys, using the scrollbar, or pressing the Alt-Up, Alt-Down, Ctrl-Up, Ctrl-Down keys.
The Alt-Up and Alt-Down keys perform a search of the currently selected identifier backward or forward respectively.
The Ctrl-Up and Ctrl-Down keys scroll the disassembly text.
IDA does not highlight the segment names at the line prefix because it is not very useful.
It is possible to turn off the highlight. The appropriate checkbox is in the Options, General, Browser tab.
This command displays the internal flag values for the current item. The information appears in the message window.
See also View submenu.
This tab of IDA Options dialog allows for editing of hint and identifier highlight related settings. There are two groups of settings.
The first group is for hints that are displayed when the mouse is hovered over some text.
The second group is for highlighting.
Number of lines for identifier hints
Delay for identifier hints
Mouse wheel resizes hint window
No hints if debugger is active
Auto highlight the current identifier
Unhide collapsed items automatically when jumping to them (gui only)
Lazy jumps (gui only)
Number of items in navigation stack drop-down menus
Number of lines for auto scroll
Caret blinking interval
This command opens the bookmarks window. This window lets the user jump to a specific place in the listing.
This command allows you to hide:
IDA will display only the header of the hidden items.
If you want to see hidden items on the screen, you may use unhide command or enable the display of the hidden items.
See also Unhide all command.
See also Edit|View submenu
Here are the debugger commands:
See also
Opens the debugger window.
In this window, you can view the register values for the selected thread. The debugger always selects the thread where the latest debugging event occurred.
For most registers, we have two different boxes:
For a segment register, we only have one box indicating the current value.
For the flags register, we have one box indicating the current value, and small boxes indicating the status of the most important flags.
A popup menu is accessible everywhere in the window, which allows the user to show or hide different parts of the window: toolbar, thread list and available register classes.
See also Debugger submenu.
This command starts the process in the debugger. If the process was suspended, it will continue its execution. See also
This dialog box allows to specify different settings related to the process being debugged.
Application
Input file
Directory
Parameters
Hostname If entered, denotes the name of the remote host with the application to debug. In this case, a remote IDA server on this host must be launched. Click here to see the list of remote servers. Port
Password
The hostname, port, and password are not available for debuggers connected locally to the computer. See also
This command displays segment register contents in the message window.
You may use this command to refresh the disassembly window too.
See also Edit|Segments submenu. View submenu.
This command executes one assembler instruction at a time, stepping over procedures while executing them as a single unit.
Internally, in the case of a function call, IDA setups a temporary breakpoint on the instruction following this function call. See also
This command executes instructions until the instruction under the cursor is reached.
Internally, IDA setups a temporary breakpoint on the instruction under the cursor. See also Debugger submenu.
This command allows you to unhide a hidden part of disassembly.
If the cursor is on the hidden function name, the function will be unhidden.
If the cursor is on the terse structure variable, the structure will be uncollapsed and displayed in the regular form.
If the cursor is on the hidden range, the hidden range will be unhidden.
If the cursor is on the hidden segment name, the segment will be unhidden.
See also command and command.
See also submenu
This command executes assembler instructions and stops on the instruction immediately following the instruction that called the current function.
Internally, IDA executes each instruction in the current function until a 'return from function' instruction is reached.
See also
.
This command detaches the debugger from the debugged process. Note: this command is only available on Windows XP or Windows 2003 Server !
See also
.
This command terminates the debugged process. See also
.
This command displays the application screen.
It is useful for the text mode debugger.
When the debugged application runs in the same window as IDA itself, the application output is hidden by IDA windows. This command allows to see the application screen in this case.
To return to IDA display, press any key.
This command is available when the application is suspended or finished. See also .
This command executes one assembler instruction at a time, stepping into functions. See also
.
This command displays running processes corresponding to the disassembled file in the database and allows the user to choose a process to attach to.
See also
.
Here are the commands to use the debugger watches (assembler level).
See also
Opens the assembler level watch list window.
In this window you can view memorized watches. A watch allows the user to continuously see the value of a defined item.
This command adds a watch at the current address. The watch is visible in the .
This command deletes an existing watch.
Here are the commands to use the tracing features of the debugger.
See also .
Recorded traces can be managed from the . Traces are saved in a directory specified in the dialog.
Saved binary trace files can be loaded, saved and replayed with the new replayer debugger module, diffed against other traces (to spot differences between executions) or displayed in a proximity view (displaying the execution call graph).
Opens the 'Tracing' window.
During the execution, the list of traced events is disabled, as it couldn't be continuously synchronized with the execution without rendering the whole tracing very slow.
If a '=' character is displayed in the 'Thread' and 'Address' columns, it indicates that the trace event occurred in the same thread and at the same address as the previous trace event.
Load a binary trace file in the 'Tracing' window.
Show a dialog with additional options for managing trace files.
This command displays a window with all the available commands to manage trace files.
Show the description of a binary trace file.
This command displays a window with the description of a selected binary trace file and allows to edit it.
Diff the currently loaded trace against a recorded trace.
This command displays a window to select a trace file to diff against the currently loaded trace, displayed in the 'Tracing' window.
Delete a binary trace file from disk.
This command displays a window to select a recorded trace file to delete from disk.
Import a binary trace file from a different IDB.
This command allows to import binary trace files recorded for an IDB with a different MD5. For example, it can be used to load recorded traces from a malware sample which is practically the same, but differs in a few bytes.
Export to a binary trace file all events displayed in the 'Tracing' window.
Export to a text file all events displayed in the 'Tracing' window
Show the callgraph of the loaded trace in a proximity view.
This command displays the callgraph of the currently loaded trace in a proximity view.
This command starts instruction tracing. You can then use all the debugger commands as usual: the debugger will save all the modified register values for each instruction.
Internally, the debugger runs the current thread step by step to properly obtain all the required register values. This explains why instruction tracing is slower than a normal execution.
This command starts function tracing. You can then use all debugger commands as usual: the debugger will save all addresses where a call to a function or a return from a function occurred.
Internally, the debugger runs the current thread step by step to properly detect all function calls and returns. This explains why functions tracing is slower than a normal execution.
This command starts basic block tracing. You can then use all debugger commands as usual: the debugger will save all addresses where a temporary basic block breakpoint was reached.
Internally, the debugger runs the current thread normally, setting temporary breakpoints in the last instruction of every basic block of every function referenced from the current function and also at any call instruction in the middle of the traced basic blocks.
Basic block tracing is slower than normal execution but faster than instruction or function tracing.
This command adds a write trace to the current address.
In fact, write traces are nothing more than breakpoints with special properties: they don't stop and they simply add a trace event when the breakpoints are reached.
This command adds a read/write trace to the current address.
In fact, read/write traces are nothing more than breakpoints with special properties: they don't stop and they simply add a trace event when the breakpoints are reached.
This command adds an execution trace to the current address.
In fact, execution traces are nothing more than breakpoints with special properties: they don't stop and they simply add a trace event when the breakpoints are reached.
Internally, the debugger will add a breakpoint instruction at the given address.
Opens the stack trace window.
This window displays the function calls that brought the current instruction.
The top of the Stack Trace window lists the last function called by the program. Below this is the listing for the previously called functions. Each line indicates the name of the function which called the function represented by the previous line.
Double clicking on a line jumps to the exact address of the instruction realizing this call.
Currently, IDA uses the EBP frame pointer values to gather the stack trace information. It will fail for functions using other methods for the frame.
This dialog box allows you to specify different settings related to the tracing features.
Trace buffer size
Trace file
Trace directory
memorize the return address associated with the last executed call instruction in database segments (the previously saved one is overwritten).
setup a temporary breakpoint on this address once the IP is in a debugger segment or library function, disable step by step, and run the thread.
reenable step by step once this temporary breakpoint is reached.
Highlight
Instruction tracing
Function tracing
Basic block tracing
This command sets the instruction pointer of the current suspended thread to the current cursor location.
It is accessible only when the debugger is active and the process is suspended. See also .
This command pauses a running process. Please note that it is not always possible to pause a process executing the system code. See also
.
Here are the commands to use the debugger breakpoints.
Related topics:
See also .
Opens the breakpoints window.
In this window, you can view information related to existing breakpoints. Breakpoints are saved in the database, and restored as soon as possible (once the memory becomes writeable).
The 'Pass count' column indicates how many times the program needs to hit the breakpoint before being suspended (0 means "always suspend").
This command opens a dialog box to edit an existing breakpoint.
Location
Settings
Actions
Please note that hardware breakpoints occur AFTER the instruction execution while software breakpoints occur BEFORE the instruction.
Usually, it is easier to use software breakpoints, except if:
See also
This command deletes an existing breakpoint at the current address.
Page breakpoints are memory access breakpoints that can be set to detect when the application reads, writes, or executes code/data in a specific memory range. Page breakpoints are very similar to hardware breakpoints but there is no limitation on the number of page breakpoints that can be set or their size, in contrast with normal hardware breakpoints.
Memory access breakpoints are implemented by removing page permissions according to the specified type of the page breakpoint to be added (for example, for a write page breakpoint, the write permission will be removed from the page). When the access violation exception occurs because the application tries to access the specific memory region, IDA reports a breakpoint hit.
As page breakpoints can be set for a small part of a memory page but the permissions of the whole page must be changed, page breakpoints can slow down the debugger because many access violation exceptions may be generated. If the application accesses memory outside of the desired range but on the same page, the generated exception must be silently handled and the application resumed. Specifically, page breakpoints in the code segment can slow down the debugger very much.
Memory access breakpoints are supported since IDA version 6.3 for the following debuggers:
Win32
WinDbg
Bochs
Open the breakpoints window if needed, then find current breakpoint in it.
Expressions
Statements
See also
Low level breakpoint conditions can be used to speed up the debugger. They are evaluated like this:
In both cases, there is a significant speed up. This improvement imposes some limitations on the breakpoint condition:
only functions marked as 'thread-safe' may be called
only entire registers can be accessed (e.g. EAX is ok but AL is not) Essentially this means that the only available functions are:
Low level breakpoint conditions are available only for Win32, Linux, Mac, and Android debuggers.
In this window, you can view some information related to all traced events. The tracing events are the information saved during the execution of a program. Different type of trace events are available: , and , or .
This command displays all the saved trace files that correspond to the MD5 of the current IDB and allows the user to load one of them. The traces can be replayed with the , inspected manually in the disassembly view or displayed as a callgraph in a proximity view.
If highlight options are enabled in , instructions from the currently loaded trace will be displayed with the background "main color" and instructions from the diff trace file will be displayed with the "diff color". Common instructions will be highlighted with an average of the two.
This command exports to a binary trace file the current trace being displayed in the . The trace can be loaded later, removed or diffed against other trace files.
This command exports the current trace being displayed in the to a text file.
This command removes all trace events from the . It also removes any loaded trace file used for against the currently loaded trace.
When you click on an instruction trace event in the 'Tracing' window, IDA displays the corresponding register values preceding the execution of this instruction. In the 'Result' column of the , you can also see which registers were modified by this instruction. By using this information, you can for example quickly determine which instruction modified a specific register, or you can even backtrace the execution flow. Note that the IP register is never printed in the 'Result' column, although it is usually modified by almost any instruction (except perhaps some prefixed instructions like REP MOVSB, ...).
Each time the given address will be accessed in write mode, the debugger will add a trace event to the .
Internally, the debugger will add a hardware breakpoint on the given address, so all the restrictions for are also valid for write traces.
Each time the given address will be accessed in read or write mode, the debugger will add a trace event to the .
Internally, the debugger will add a hardware breakpoint on the given address, so all the restrictions for are also valid for read/write traces.
Each time the instruction at the given address will be run, the debugger will add a trace event to the .
Stop condition This expression will be evaluated before the execution of each instruction. If the expression returns true, the debugger will suspend the execution. Please note that you can use register names in the condition. Tracing
Enabling these options will speed up the execution, as many instructions (from debugger segments and/or library functions) will not be traced. Disabling these options can quickly fill the , as all instructions in DLLs and system functions will be executed step by step. Notice that both options influence the way instruction and function tracings will work. Internally, the debugger proceeds like this:
This command adds a breakpoint at the current address. If an instruction exists at this address, an instruction breakpoint is created. Otherwise, IDA offers to create a hardware breakpoint and allows the user to . Hardware breakpoints can be either real hardware breakpoints or .
Condition This expression will be evaluated each time the breakpoint is reached. If the expression returns true (non-zero), the debugger will execute the selected actions. Please note that you can use the register names in the IDC scripts when the debugger is active. Tests like this are allowed, for example: EAX == EBX+5 or get_wide_dword(ESP+0x10) == 34 You can also use the "..." button to enter a multiline condition, or specify another scripting language to use. See for more info.
Low level condition: Evaluate the condition on the remote computer. Such conditions are faster, especially during remote debugging, because there is no network traffic between IDA and the remote computer on each breakpoint hit.
Refresh debugger memory: By default IDA does not refresh the memory config before evaluating a breakpoint condition. This option enables the refresh. To refresh it manually, call
Tracing type: , and level tracing types can be selected for breakpoints where enable/disable tracing have been selected. Hardware breakpoint size Number of bytes to watch: 1, 2 or 4 bytes for normal hardware breakpoints. Any size for . Hardware breakpoint mode
In the case of Intel hardware breakpoints, some limitations are enforced (in contrast with ). It is impossible to create more than 4 hardware breakpoints. The address of the breakpoint must be aligned appropriately:
You can use the "Condition" field of the breakpoint properties to enter an expression which is evaluated when the breakpoint is hit. It can be either an actual condition or just any valid code in or another supported scripting language syntax. By using the "..." button, you can open a multi-line editor for the condition and switch the scripting language used for evaluating it.
only expressions can be used for low level conditions
In this window the user can view values of selected variables.
Global variables (data item names) as well as variables that are local to the current function can be added by pressing Ins.
Expressions can be added to the view as well, they will be considered as IDC expressions.
Expressions may have a type cast at the beginning. For example
(int)0x12345678
means that the contents of the memory at the address 0x12345678 should be displayed as an integer. Note: to display strings use "char[]" as the typo.
See also Source code view
This command copies the contents of the process memory to the database. It is available during a debugging session.
The memory contents will be copied to the database. The user may specify that only the segments with the 'loader' attribute will be saved in the database.
The segments with the loader attribute are created by the input file loader and usually contain information from the input file. However, in some cases (like attaching to an existing process), there will not be any loader segments because the input file was not loaded by IDA.
To be able to make a partial snapshot in this case and other similar cases, the user can set or clear the 'loader' attribute of the desired segments using the edit segment command.
After applying this command, the user can terminate the debugging process and continue to analyze the program in the database.
Please note that it is possible to save the database without taking a memory snapshot. Such a database might be used to keep global information about the program like the breakpoint information, notes, etc. However, we recommend to take a memory snapshot of at least the 'loader' segments because it will allow to save also information about the program functions, names, comments, etc.
See also Debugger submenu.
This command open a window with manual memory regions. In this window the user can manipulate memory region definitions: add or delete them.
Some debugger backends (e.g. the gdb backend) do not provide memory layout information. IDA needs this information in order to show the memory contents. When this information is not available, the user must specify it.
The defined memory regions will be accessible when the debugger is active. The user will be able to see the memory contents in the disassembly windows.
If no memory information is provided by the user nor by the debugger backend, IDA will assume that entire memory space is accessible. However, it is better to specify memory layout more precisely.
See also Debugger submenu.
Opens the modules window.
This window lists all the modules loaded by the debugged process. Double click on a module to see the list of its exported names.
The right click menu allows for loading debug information for the current module. For that, select the "Load debug symbols" command from the popup menu. If IDA manages to find and load the corresponding debug information file, it will import all symbols from it into the database. Currently, only PDB files are supported. The operation result is displayed in the message window. See also Debugger submenu. Load PDB files command.
This window shows the contents of a source code file. IDA automatically opens source views provided that proper mapping of the source code paths is specified in "Options, Source paths".
This window may also display a decompilation result because it is considered as a source code. This can be useful if the source files are not available.
In this window the user can view values of selected variables.
Global variables (data item names) as well as variables that are local to the current function can be added by pressing Ins.
Expressions can be added to the view as well, they will be considered as IDC expressions.
Expressions may have a type cast at the beginning. For example
(int)0x12345678
means that the contents of the memory at the address 0x12345678 should be displayed as an integer. Note: to display strings use "char[]" as the typo.
This window displays the values of the variables that are local to the current functions (register and stack based).
Opens the threads window.
In this window, you can view all the threads of the debugged process. Double clicking on a thread jumps to its current instruction (available only if the process has been suspended). Double clicking also changes the current thread for the hlpHelpDebugger[CPU] window.
The right click brings a popup menu, where you can suspend or resume threads. The following thread states are possible:
See also Debugger submenu.
This command refreshes the segments and memory contents in IDA. It is available only during a debugging session. NOTE: this command is currently hidden from the user interface because IDA does synchronize with the process memory automatically.
Please note that IDA itself tries to keep the program segments in sync with the debugged process. However, in order to accelerate the debugger, the synchronization is done only at major events, for example when dynamic library gets loaded or unloaded or a thread is created or deleted. If the memory configuration is changed because of a simple system call (think of VirtualAlloc), IDA might miss it. Use the "refresh memory" command in these cases.
Note2: when IDA detects a discrepancy in the segments, it will automatically synchronize with the process.
See also Debugger submenu.