Hexrays Toolbox (HXTB) ist eine leistungsstarke Reihe von Idapython -Skripten, mit denen Codemuster in Binärdateien unabhängig von ihrer zugrunde liegenden Prozessorarchitektur gefunden und lokalisiert werden können.
Die Abfrage, die durch die folgende Animation veranschaulicht wurde, ist ein Beispiel dafür, wie eine Sicherheitsanfälligkeit, die WhatsApp für Android (CVE-2019-3568, libwhatsapp.so) beeinflusst hat, mithilfe von Hexrays Toolbox gefunden werden kann. Dies geschieht durch Formulierung eines gewünschten Codemusters, das unter Verwendung einer Idapython -Lambda -Funktion gefunden werden soll. Finden Sie das Beispielskript
.

Eine gültige IDA -Lizenz und eine gültige Hexrays Decompiler -Lizenz pro Zielarchitektur ist erforderlich.
Es gibt verschiedene Möglichkeiten, Hexrays Toolbox mit jeweils unterschiedlichem Grad an Flexibilität zu verwenden.
interactive.py , ein Skript, das Convenience -Funktionen hinzufügt, die mit der IDA -Befehlszeilenschnittstelle verwendet werden sollenautomation.py , ein Skript, das HXTB -Abfragen in einem bestimmten Satz von Dateien im Stapelmodus verarbeitet und ausführt Das Ausführen des enthaltenen Skripts hxtb_shell.py aus IDA öffnet ein GUI -Fenster, mit dem HXTB -Abfragen entwickelt, geladen und ausgeführt werden können. Der folgende Screenshot zeigt, wie eine mit HXTB-Shell geladene Abfrage aussehen kann.

HXTB-Shell akzeptiert auch Python-Ausdrücke, die vom Kontext-Viewer des Hrdevhelper-Plugins erstellt werden. Sie können daraus kopiert und direkt in die HXTB-Shell-GUI eingefügt werden.

Weitere Beispielabfragen, die mit HXTB-Shell geladen werden können, finden Sie im Unterordner hxtbshell_queries in der Hexrays-Toolbox enthalten.
Das Laden hxtb.py mit IDA (Alt-F7) stellt Funktionen wie find_expr() und find_item() sowohl für die Idapython CLI als auch für den Skript-Interpreter (SHIFT-F2) zur Verfügung. Unter anderem können diese Funktionen verwendet werden, um Abfragen in der aktuell geladenen IDA -Datenbank auszuführen. Bitte schauen Sie sich einige der unten angegebenen Beispiele an.
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 ))