1- from qiling import Qiling
21from .r2 import R2
3- from .mem import R2Mem
4- from .deflat import R2Deflator
5-
6- from unicorn .unicorn_const import UC_PROT_READ , UC_PROT_WRITE , UC_PROT_EXEC
7-
8-
9- class R2Qiling (Qiling ):
10- def __init__ (self , * args , ** kwargs ):
11- super ().__init__ (* args , ** kwargs )
12- self ._mem = R2Mem (self .mem )
13- self .r2 = R2 (self )
14-
15-
16- def uc2perm (ps : int ) -> str :
17- perms_d = {
18- UC_PROT_READ : 'r' ,
19- UC_PROT_WRITE : 'w' ,
20- UC_PROT_EXEC : 'x'
21- }
22-
23- return '' .join (val if idx & ps else '-' for idx , val in perms_d .items ())
24-
25- def assert_mem_equal (ql : 'R2Qiling' ):
26- map_info = ql .mem .map_info
27- mem_regions = list (ql .uc .mem_regions ())
28- assert len (map_info ) == len (mem_regions ), f'len: map_info={ len (map_info )} != mem_regions={ len (mem_regions )} '
29- for i , mem_region in enumerate (mem_regions ):
30- s , e , p , _ , _ , data = map_info [i ]
31- if (s , e - 1 , p ) != mem_region :
32- ql .log .error ('map_info:' )
33- print ('\n ' .join (ql .mem .get_formatted_mapinfo ()))
34- ql .log .error ('uc.mem_regions:' )
35- print ('\n ' .join (f'{ s :010x} - { e :010x} { uc2perm (p )} ' for (s , e , p ) in mem_regions ))
36- raise AssertionError (f'(start, end, perm): map_info={ (s , e - 1 , p )} != mem_region={ mem_region } ' )
37- uc_mem = ql .mem .read (mem_region [0 ], mem_region [1 ] - mem_region [0 ] + 1 )
38- assert len (data ) == len (uc_mem ), f'len of { i } mem: map_info={ len (data )} != mem_region={ len (uc_mem )} '
39- assert data == uc_mem , f'Memory region { i } { mem_region [0 ]:#x} - { mem_region [1 ]:#x} not equal to map_info[{ i } ]'
2+ from .r2q import R2Qiling
0 commit comments