HexRays Toolbox (HXTB) adalah set yang kuat dari skrip Idapython yang dapat digunakan untuk menemukan dan menemukan pola kode di biner, terlepas dari arsitektur prosesor yang mendasarinya.
Kueri yang diilustrasikan oleh animasi di bawah ini adalah contoh bagaimana kerentanan yang mempengaruhi WhatsApp untuk Android (CVE-2019-3568, libwhatsapp.so) dapat ditempatkan menggunakan hexrays toolbox. Ini dilakukan dengan merumuskan pola kode yang diinginkan yang akan ditempatkan menggunakan fungsi Idapython Lambda. Temukan contoh skrip
.

Lisensi IDA yang valid dan lisensi dekompiler hexrays yang valid per arsitektur target diperlukan.
Ada beberapa cara menggunakan hexrays Toolbox, masing -masing dengan tingkat fleksibilitas yang bervariasi.
interactive.py , skrip yang menambahkan fungsi kenyamanan untuk digunakan dengan antarmuka baris perintah IDAautomation.py , skrip yang memproses dan menjalankan kueri HXTB pada set file yang diberikan dalam mode batch Mengeksekusi skrip hxtb_shell.py yang disertakan dari dalam IDA membuka jendela GUI yang dapat digunakan untuk mengembangkan, memuat, dan menjalankan kueri HXTB. Tangkapan layar di bawah ini menunjukkan seperti apa kueri yang dimuat dengan hxtb-shell.

HXTB-Shell juga menerima ekspresi Python yang dibuat oleh penampil konteks plugin HRDevHelper. Mereka dapat disalin darinya dan secara langsung ditempelkan ke GUI HXTB-Shell.

Contoh kueri lebih lanjut yang dapat dimuat dengan hxtb-shell dapat ditemukan di sub-folder hxtbshell_queries yang disertakan dengan hexrays toolbox.
Memuat hxtb.py dengan IDA (ALT-F7) membuat fungsi seperti find_expr() dan find_item() tersedia untuk Idapython CLI dan interpreter skrip (shift-f2). Antara lain, fungsi -fungsi ini dapat digunakan untuk menjalankan kueri pada database IDA yang saat ini dimuat. Silakan periksa beberapa contoh yang ditunjukkan di bawah ini.
find_item(ea, q)
find_expr(ea, q)
Positional arguments:
ea: address of a valid function within
the current database
q: lambda function
custom lambda function with the following arguments:
1. cfunc: cfunc_t
2. i/e: cinsn_t/cexpr_t
Returns:
list of query_result_t objects
Example:
find_expr(here(), lambda cf, e: e.op is cot_call)
-> finds and returns all function calls within a current function.
The returned data is a list of query_result_t objects (see hxtb.py).
The returned list can be passed to an instance of the ic_t class,
which causes the data to be displayed by a chooser as follows:
from idaapi import *
import hxtb
hxtb.ic_t(find_expr(here(), lambda cf,e:e.op is cot_call))
Please find the cfunc_t, citem_t, cinsn_t and cexpr_t structures
within hexrays.hpp for further help and details.
cot_eq
/
x / y
(anything) cot_num --- n.numval() == 0
from idaapi import *
from hxtb import find_expr
query = lambda cfunc , e : e . op is cot_eq and e . y . op is cot_num and e . y . numval () == 0
r = find_expr ( here (), query )
for e in r :
print ( e ) cot_call
/
x /
cot_obj
from idaapi import *
from hxtb import find_expr
query = lambda cfunc , e : e . op is cot_call and e . x . op is cot_obj
r = find_expr ( here (), query )
for e in r :
print ( e )
cot_call --- arg1 is cot_var
/ arg1 is on stack
x /
cot_obj --- name(obj_ea) == 'memcpy'
from idaapi import *
from hxtb import find_expr
r = []
query = lambda cfunc , e : ( e . op is cot_call and
e . x . op is cot_obj and
get_name ( e . x . obj_ea ) == 'memcpy' and
len ( e . a ) == 3 and
e . a [ 0 ]. op is cot_var and
cfunc . lvars [ e . a [ 0 ]. v . idx ]. is_stk_var ())
for ea in Functions ():
r += find_expr ( ea , query )
for e in r :
print ( e ) cot_call --- arg2 ('fmt') contains '%s'
/
x /
cot_obj --- name(obj_ea) == 'sprintf'
from idaapi import *
from hxtb import find_expr
r = []
query = lambda cfunc , e : ( e . op is cot_call and
e . x . op is cot_obj and
get_name ( e . x . obj_ea ) == 'sprintf' and
len ( e . a ) >= 2 and
e . a [ 1 ]. op is cot_obj and
is_strlit ( get_flags ( get_item_head ( e . a [ 1 ]. obj_ea ))) and
b'%s' in get_strlit_contents ( e . a [ 1 ]. obj_ea , - 1 , 0 , STRCONV_ESCAPE ))
for ea in Functions ():
r += find_expr ( ea , query )
for e in r :
print ( e ) from idaapi import *
from hxtb import ic_t
query = lambda cfunc , e : ( e . op in
[ cot_asgsshr , cot_asgsdiv ,
cot_asgsmod , cot_sge ,
cot_sle , cot_sgt ,
cot_slt , cot_sshr ,
cot_sdiv , cot_smod ])
ic_t ( query )
from idaapi import *
from hxtb import ic_t
ic_t ( lambda cf , i : i . op is cit_if )
from idaapi import *
from hxtb import ic_t , query_db
ic_t ( query_db ( lambda cf , i : is_loop ( i . op )))
from hxtb import ic_t , query_db , find_child_expr
from ida_hexrays import *
find_copy_query = lambda cfunc , i : ( i . op is cot_asg and
i . x . op is cot_ptr and
i . y . op is cot_ptr )
find_loop_query = lambda cfunc , i : ( is_loop ( i . op ) and
find_child_expr ( cfunc , i , find_copy_query ))
ic_t ( query_db ( find_loop_query ))