Skip to content

Latest commit

 

History

History
1187 lines (928 loc) · 21.5 KB

commands.md

File metadata and controls

1187 lines (928 loc) · 21.5 KB

FA Command List

Below is the list of available commands:

label

builtin interpreter command. mark a label

add

usage: add [-h] value

add an hard-coded value into resultset

EXAMPLE:
    results = []
    -> add 80
    result = [80]

positional arguments:
  value

options:
  -h, --help  show this help message and exit

add-offset-range

usage: add-offset-range [-h] start end step

adds a python-range to resultset

EXAMPLE:
    result = [0, 0x200]
    -> add-offset-range 0 4 8
    result = [0, 4, 8, 0x200, 0x204, 0x208]

positional arguments:
  start
  end
  step

options:
  -h, --help  show this help message and exit

align

usage: align [-h] value

align results to given base (round-up)

EXAMPLE:
    results = [0, 2, 4, 6, 8]
    -> align 4
    results = [0, 4, 4, 8, 8]

positional arguments:
  value

options:
  -h, --help  show this help message and exit

argument

usage: argument [-h] arg

get function's argument assignment address

EXAMPLE:
    0x00000000: ldr r0, =dest
    0x00000004: ldr r1, =src
    0x00000008: mov r2, #4
    0x0000000c: bl memcpy

    results = [0x0c]
    -> argument 2
    results = [8]  # address of 3rd argument

positional arguments:
  arg         argument number

options:
  -h, --help  show this help message and exit

b

usage: b [-h] label

branch unconditionally to label

EXAMPLE:
    results = []

    add 1
    -> b skip
    add 2
    label skip
    add 3

    results = [1, 3]

positional arguments:
  label       label to jump to

options:
  -h, --help  show this help message and exit

clear

usage: clear [-h]

clears the current result-set

EXAMPLE:
    results = [0, 4, 8]
    -> clear
    results = []

options:
  -h, --help  show this help message and exit

deref-data

usage: deref-data [-h] -l LEN

Dereference pointer as integer data type. Note that the data is assumed to be stored in little endian format. Example #1: 0x00000000: LDR R1, [SP, #0x34] results = [0] -> deref-data -l 4 results = [0xe5d1034] Example #2: 0x00000000: LDR R1, [SP, #0x34] results = [0]
-> deref-data -l 2 results = [0x1034]

options:
  -h, --help         show this help message and exit
  -l LEN, --len LEN  length of the data in bytes

find

usage: find [-h] name

find another symbol defined in other SIG files

positional arguments:
  name        symbol name

options:
  -h, --help  show this help message and exit

find-bytes

usage: find-bytes [-h] hex_str

expands the result-set with the occurrences of the given bytes

EXAMPLE:
    0x00000000: 01 02 03 04
    0x00000004: 05 06 07 08

    results = []
    -> find-bytes 01020304
    result = [0]

    -> find-bytes 05060708
    results = [0, 4]

positional arguments:
  hex_str

options:
  -h, --help  show this help message and exit

find-bytes-ida

usage: find-bytes-ida [-h] expression

expands the result-set with the occurrences of the given bytes
expression in "ida bytes syntax"

EXAMPLE:
    0x00000000: 01 02 03 04
    0x00000004: 05 06 07 08

    results = []
    -> find-bytes-ida '01 02 03 04'
    result = [0]

    -> find-bytes-ida '05 06 ?? 08'
    results = [0, 4]

positional arguments:
  expression

options:
  -h, --help  show this help message and exit

find-immediate

usage: find-immediate [-h] expression

expands the result-set with the occurrences of the given
immediate in "ida immediate syntax"

EXAMPLE:
    0x00000000: ldr r0, =0x1234
    0x00000004: add r0, #2 ; 0x1236

    results = []
    -> find-immediate 0x1236
    result = [4]

positional arguments:
  expression

options:
  -h, --help  show this help message and exit

find-str

usage: find-str [-h] [--null-terminated] hex_str

expands the result-set with the occurrences of the given
string

EXAMPLE:
    0x00000000: 01 02 03 04
    0x00000004: 05 06 07 08
    0x00000008: 30 31 32 33 -> ASCII '0123'

    results = []
    -> find-str '0123'

    result = [8]

positional arguments:
  hex_str

options:
  -h, --help         show this help message and exit
  --null-terminated

function-end

usage: function-end [-h]

goto function's end

EXAMPLE:
    0x00000000: push {r4-r7, lr} -> function's prolog
    ...
    0x000000f0: push {r4-r7, pc} -> function's epilog

    results = [0]
    -> function-end
    result = [0xf0]

options:
  -h, --help  show this help message and exit

function-lines

usage: function-lines [-h] [--after | --before]

get all function's lines

EXAMPLE:
    0x00000000: push {r4-r7, lr} -> function's prolog
    0x00000004: mov r1, r0
    ...
    0x000000c0: mov r0, r5
    ...
    0x000000f0: push {r4-r7, pc} -> function's epilog

    results = [0xc0]
    -> function-lines
    result = [0, 4, ..., 0xc0, ..., 0xf0]

options:
  -h, --help  show this help message and exit
  --after     include only function lines which occur after currentresultset
  --before    include only function lines which occur before current resultset

function-start

usage: function-start [-h] [cmd ...]

goto function's start

EXAMPLE:
    0x00000000: push {r4-r7, lr} -> function's prolog
    ...
    0x000000f0: pop {r4-r7, pc} -> function's epilog

    results = [0xf0]
    -> function-start
    result = [0]

positional arguments:
  cmd         command

options:
  -h, --help  show this help message and exit

goto-ref

usage: goto-ref [-h] [--code] [--data]

goto reference

EXAMPLE:
    0x00000000: ldr r0, =0x12345678

    results = [0]
    -> goto-ref --data
    results = [0x12345678]

options:
  -h, --help  show this help message and exit
  --code      include code references
  --data      include data references

if

usage: if [-h] cond label

perform an 'if' statement to create conditional branches
using an FA command

EXAMPLE:
    results = [0, 4, 8]

    -> if 'verify-single' a_is_single_label

    set-name a_isnt_single
    b end

    label a_is_single_label
    set-name a_is_single

    label end

positional arguments:
  cond        condition as an FA command
  label       label to jump to if condition is true

options:
  -h, --help  show this help message and exit

if-not

usage: if-not [-h] cond label

perform an 'if not' statement to create conditional branches
using an FA command

EXAMPLE:
    results = [0, 4, 8]

    -> if-not 'verify-single' a_is_single_label

    set-name a_is_single
    b end

    label a_is_not_single_label
    set-name a_is_not_single

    label end

positional arguments:
  cond        condition as an FA command
  label       label to jump to if condition is false

options:
  -h, --help  show this help message and exit

intersect

usage: intersect [-h] [--piped] variables [variables ...]

intersect two or more variables

EXAMPLE:
    results = [0, 4, 8]
    store a
    ...
    results = [0, 12, 20]
    store b

    -> intersect a b
    results = [0]

positional arguments:
  variables    variable names

options:
  -h, --help   show this help message and exit
  --piped, -p

keystone-find-opcodes

usage: keystone-find-opcodes [-h] [--bele] [--or] arch mode code

use keystone to search for the supplied opcodes

EXAMPLE:
    0x00000000: push {r4-r7, lr}
    0x00000004: mov r0, r1

    results = []
    -> keystone-find-opcodes --bele KS_ARCH_ARM KS_MODE_ARM 'mov r0, r1;'
    result = [4]

positional arguments:
  arch        keystone architecture const (evaled)
  mode        keystone mode const (evald)
  code        keystone architecture const (opcodes to compile)

options:
  -h, --help  show this help message and exit
  --bele      figure out the endianity from IDA instead of explicit mode
  --or        mandatory. expands search results

keystone-verify-opcodes

usage: keystone-verify-opcodes [-h] [--bele] [--until UNTIL] arch mode code

use keystone to verify the result-set matches the given
opcodes

EXAMPLE:
    0x00000000: push {r4-r7, lr}
    0x00000004: mov r0, r1

    results = [0, 4]
    -> keystone-verify-opcodes --bele KS_ARCH_ARM KS_MODE_ARM 'mov r0, r1'
    result = [4]

positional arguments:
  arch           keystone architecture const (evaled)
  mode           keystone mode const (evald)
  code           keystone architecture const (opcodes to compile)

options:
  -h, --help     show this help message and exit
  --bele         figure out the endianity from IDA instead of explicit mode
  --until UNTIL  keep going onwards opcode-opcode until verified

load

usage: load [-h] name

go back to previous result-set saved by 'store' command.

EXAMPLE:
    results = [0, 4, 8]
    store foo

    find-bytes 12345678
    results = [0, 4, 8, 10, 20]

    -> load foo
    results = [0, 4, 8]

positional arguments:
  name        name of variable in history to go back to

options:
  -h, --help  show this help message and exit

locate

usage: locate [-h] name [name ...]

goto symbol by name

EXAMPLE:
    0x00000000: main:
    0x00000000:     mov r0, r1
    0x00000004: foo:
    0x00000004:     bx lr

    results = [0, 4]
    -> locate foo
    result = [4]

positional arguments:
  name

options:
  -h, --help  show this help message and exit

make-code

usage: make-code [-h]

convert into a code block

options:
  -h, --help  show this help message and exit

make-comment

usage: make-comment [-h] comment

add comment for given addresses

EXAMPLE:
    0x00000200: 01 02 03 04
    0x00000204: 30 31 32 33

    results = [0x200]
    -> make-comment 'bla bla'
    results = [0x200]

    0x00000200: 01 02 03 04 ; bla bla
    0x00000204: 30 31 32 33

positional arguments:
  comment     comment string

options:
  -h, --help  show this help message and exit

make-function

usage: make-function [-h]

convert into a function

options:
  -h, --help  show this help message and exit

make-literal

usage: make-literal [-h]

convert into a literal

options:
  -h, --help  show this help message and exit

make-unknown

usage: make-unknown [-h]

convert into an unknown block

options:
  -h, --help  show this help message and exit

max-xrefs

usage: max-xrefs [-h]

get the result with most xrefs pointing at it

options:
  -h, --help  show this help message and exit

min-xrefs

usage: min-xrefs [-h]

get the result with least xrefs pointing at it

options:
  -h, --help  show this help message and exit

most-common

usage: most-common [-h]

get the result appearing the most in the result-set

EXAMPLE:
    results = [0, 4, 4, 8, 12]
    -> most-common
    result = [4]

options:
  -h, --help  show this help message and exit

next-instruction

usage: next-instruction [-h] [--limit LIMIT] [--back] [--op0 OP0] [--op1 OP1] [--op2 OP2] [--op3 OP3] [--op4 OP4] [--op5 OP5] mnem [mnem ...]

Map the resultset to the next instruction of a given pattern. The instruction is searched for linearly.

Example #1:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}
    0x0000000c: mov r2, r3
    
    results = [0, 4, 8]
    -> next-instruction mov
    results = [0, 4, 12]

Example #2:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}
    0x0000000c: mov r2, r3
    
    results = [0, 4, 8]
    -> next-instruction mov --op 2
    results = [12, 12, 12]

positional arguments:
  mnem

options:
  -h, --help     show this help message and exit
  --limit LIMIT  Number of instructions to search per address
  --back         Search backwards instead of forwards
  --op0 OP0
  --op1 OP1
  --op2 OP2
  --op3 OP3
  --op4 OP4
  --op5 OP5

offset

usage: offset [-h] offset

advance the result-set by a given offset

EXAMPLE:
    results = [0, 4, 8, 12]
    -> offset 4
    result = [4, 8, 12, 16]

positional arguments:
  offset

options:
  -h, --help  show this help message and exit

operand

usage: operand [-h] op

get operand value from given instruction

EXAMPLE #1:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}

    results = [4]
    -> operand 1
    results = [2]  # because r2

positional arguments:
  op          operand number

options:
  -h, --help  show this help message and exit

print

usage: print [-h] [phrase]

prints the current result-set (for debugging)

positional arguments:
  phrase      optional string

options:
  -h, --help  show this help message and exit

python-if

usage: python-if [-h] cond label

perform an 'if' statement to create conditional branches
using an eval'ed expression

EXAMPLE:
    results = [0, 4, 8]

    verify-single
    store a

    # jump to a_is_single_label since a == []
    -> python-if a a_is_single_label
    set-name a_isnt_single
    b end

    label a_is_single_label
    set-name a_is_single

    label end

positional arguments:
  cond        condition to evaluate (being eval'ed)
  label       label to jump to if condition is true

options:
  -h, --help  show this help message and exit

run

usage: run [-h] name

run another SIG file

positional arguments:
  name        SIG filename

options:
  -h, --help  show this help message and exit

set-const

usage: set-const [-h] name

define a const value

positional arguments:
  name

options:
  -h, --help  show this help message and exit

set-enum

usage: set-enum [-h] enum_name enum_key

define an enum value

positional arguments:
  enum_name
  enum_key

options:
  -h, --help  show this help message and exit

set-name

usage: set-name [-h] name

set symbol name

positional arguments:
  name

options:
  -h, --help  show this help message and exit

set-struct-member

usage: set-struct-member [-h] struct_name member_name member_type

add a struct member

positional arguments:
  struct_name
  member_name
  member_type

options:
  -h, --help   show this help message and exit

set-type

usage: set-type [-h] type_str

sets the type in the disassembler

positional arguments:
  type_str

options:
  -h, --help  show this help message and exit

single

usage: single [-h] index

peek a single result from the result-set (zero-based)

EXAMPLE:
    results = [0, 4, 8, 12]
    -> single 2
    result = [8]

positional arguments:
  index       result index

options:
  -h, --help  show this help message and exit

sort

usage: sort [-h]

performs a sort on the current result-set

EXAMPLE:
    results = [4, 12, 0, 8]
    -> sort
    result = [0, 4, 8 ,12]

options:
  -h, --help  show this help message and exit

stop-if-empty

usage: stop-if-empty [-h]

exit if current resultset is empty

EXAMPLE:
    results = []

    -> stop-if-empty
    add 1

    results = []

options:
  -h, --help  show this help message and exit

store

usage: store [-h] name

save current result-set in a variable.
You can later load the result-set using 'load'

EXAMPLE:
    results = [0, 4, 8]
    -> store foo

    find-bytes --or 12345678
    results = [0, 4, 8, 10, 20]

    load foo
    results = [0, 4, 8]

positional arguments:
  name        name of variable to use

options:
  -h, --help  show this help message and exit

symdiff

usage: symdiff [-h] variables [variables ...]

symmetric difference between two or more variables

EXAMPLE:
    results = [0, 4, 8]
    store a
    ...
    results = [0, 12, 20]
    store b

    -> symdiff a b
    results = [4, 8, 12, 20]

positional arguments:
  variables   variable names

options:
  -h, --help  show this help message and exit

trace

usage: trace [-h]

sets a pdb breakpoint

options:
  -h, --help  show this help message and exit

union

usage: union [-h] [--piped] variables [variables ...]

union two or more variables

EXAMPLE:
    results = [0, 4, 8]
    store a
    ...
    results = [0, 12, 20]
    store b

    -> union a b
    results = [0, 4, 8, 12, 20]

positional arguments:
  variables    variable names

options:
  -h, --help   show this help message and exit
  --piped, -p

unique

usage: unique [-h]

make the resultset unique

EXAMPLE:
    results = [0, 4, 8, 8, 12]
    -> unique
    result = [0, 4, 8, 12]

options:
  -h, --help  show this help message and exit

verify-aligned

usage: verify-aligned [-h] value

leave only results fitting required alignment

EXAMPLE:
    results = [0, 2, 4, 6, 8]
    -> verify-aligned 4
    results = [0, 4, 8]

positional arguments:
  value

options:
  -h, --help  show this help message and exit

verify-bytes

usage: verify-bytes [-h] hex_str

reduce the result-set to those matching the given bytes

EXAMPLE:
    0x00000000: 01 02 03 04
    0x00000004: 05 06 07 08

    results = [0, 2, 4, 6, 8]
    -> verify-bytes '05 06 07 08'
    results = [4]

positional arguments:
  hex_str

options:
  -h, --help  show this help message and exit

verify-name

usage: verify-name [-h] name

verifies the given name appears in result set

positional arguments:
  name

options:
  -h, --help  show this help message and exit

verify-opcode

usage: verify-opcode [-h] [--op0 OP0] [--op1 OP1] [--op2 OP2] [--op3 OP3] [--op4 OP4] [--op5 OP5] mnem [mnem ...]

reduce the result-set to those matching the given instruction

EXAMPLE #1:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}

    results = [0, 2, 4, 6, 8]
    -> verify-opcode mov
    results = [0, 4]

EXAMPLE #2:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}

    results = [0, 2, 4, 6, 8]
    -> verify-opcode mov --op1 r2
    results = [4]

positional arguments:
  mnem

options:
  -h, --help  show this help message and exit
  --op0 OP0
  --op1 OP1
  --op2 OP2
  --op3 OP3
  --op4 OP4
  --op5 OP5

verify-operand

usage: verify-operand [-h] [--op0 OP0] [--op1 OP1] [--op2 OP2] name

reduce the result-set to those matching the given instruction

EXAMPLE #1:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}

    results = [0, 2, 4, 6, 8]
    -> verify-operand mov
    results = [0, 4]

EXAMPLE #2:
    0x00000000: mov r0, r1
    0x00000004: mov r1, r2
    0x00000008: push {r4}

    results = [0, 2, 4, 6, 8]
    -> verify-operand mov --op1 2
    results = [4]

positional arguments:
  name

options:
  -h, --help  show this help message and exit
  --op0 OP0
  --op1 OP1
  --op2 OP2

verify-ref

usage: verify-ref [-h] [--code] [--data] [--name NAME]

verifies a given reference exists to current result set

options:
  -h, --help   show this help message and exit
  --code       include code references
  --data       include data references
  --name NAME  symbol name

verify-segment

usage: verify-segment [-h] [--regex] name

reduce the result-set to those in the given segment name

EXAMPLE:
    .text:0x00000000 01 02 03 04
    .text:0x00000004 30 31 32 33

    .data:0x00000200 01 02 03 04
    .data:0x00000204 30 31 32 33

    results = [0, 0x200]
    -> verify-segment .data
    results = [0x200]

positional arguments:
  name        segment name

options:
  -h, --help  show this help message and exit
  --regex     interpret name as a regex

verify-single

usage: verify-single [-h]

verifies the result-list contains a single value

EXAMPLE #1:
    results = [4, 12, 0, 8]
    -> verify-single
    result = []

EXAMPLE #2:
    results = [4]
    -> verify-single
    result = [4]

options:
  -h, --help  show this help message and exit

verify-str

usage: verify-str [-h] [--null-terminated] hex_str

reduce the result-set to those matching the given string

EXAMPLE:
    0x00000000: 01 02 03 04
    0x00000004: 30 31 32 33 -> ascii '0123'

    results = [0, 2, 4]
    -> verify-str '0123'
    results = [4]

positional arguments:
  hex_str

options:
  -h, --help         show this help message and exit
  --null-terminated

xref

usage: xref [-h]

goto xrefs pointing at current search results

options:
  -h, --help  show this help message and exit

xrefs-to

usage: xrefs-to [-h] [--function-start] [--or] [--and] [--name NAME] [--bytes BYTES]

search for xrefs pointing at given parameter

options:
  -h, --help        show this help message and exit
  --function-start  goto function prolog for each xref
  --or              expand the current result set
  --and             reduce the current result set
  --name NAME       parameter as label name
  --bytes BYTES     parameter as bytes