1- import os
21import ctypes
32import dataclasses
4- import traceback
53
64import binaryninja
5+ from binaryninja import BinaryView
76from binaryninja ._binaryninjacore import BNFreeStringList , BNAllocString , BNFreeString
87
98from . import _sharedcachecore as sccore
109from .sharedcache_enums import *
1110
1211@dataclasses .dataclass
1312class CacheRegion :
14- regionType : SharedCacheRegionType
13+ region_type : SharedCacheRegionType
1514 name : str
1615 start : int
1716 size : int
18- imageStart : int
19- flags : binaryninja .enums .SegmentFlag
17+ image_start : int
18+ # TODO: Might want to make this use the BN segment flag enum?
19+ flags : sccore .SegmentFlagEnum
2020
2121 def __str__ (self ):
2222 return repr (self )
@@ -27,40 +27,73 @@ def __repr__(self):
2727@dataclasses .dataclass
2828class CacheImage :
2929 name : str
30- headerAddress : int
31- regionStarts : [int ]
30+ header_address : int
31+ region_starts : [int ]
3232
3333 def __str__ (self ):
3434 return repr (self )
3535
3636 def __repr__ (self ):
37- return f"<CacheImage '{ self .name } ': { self .headerAddress :x} >"
37+ return f"<CacheImage '{ self .name } ': { self .header_address :x} >"
3838
39- def region_from_api (region ) :
39+ def region_from_api (region : sccore . BNSharedCacheRegion ) -> CacheRegion :
4040 return CacheRegion (
41- SharedCacheRegionType (region .regionType ),
42- region .name . decode ( 'utf-8' ) ,
43- region .start ,
44- region .size ,
45- region .imageStart ,
46- binaryninja . enums . SegmentFlag ( region .flags )
41+ region_type = SharedCacheRegionType (region .regionType ),
42+ name = region .name ,
43+ start = region .vmAddress ,
44+ size = region .size ,
45+ image_start = region .imageStart ,
46+ flags = region .flags
4747 )
4848
49- def image_from_api (image ):
49+ def region_to_api (region : CacheRegion ) -> sccore .BNSharedCacheRegion :
50+ return sccore .BNSharedCacheRegion (
51+ regionType = region .region_type ,
52+ _name = BNAllocString (region .name ),
53+ vmAddress = region .start ,
54+ size = region .size ,
55+ imageStart = region .image_start ,
56+ flags = region .flags
57+ )
58+
59+ def image_from_api (image : sccore .BNSharedCacheImage ) -> CacheImage :
5060 return CacheImage (
51- image .name . decode ( 'utf-8' ) ,
61+ image .name ,
5262 image .headerAddress ,
5363 image .regionStarts
5464 )
5565
66+ def image_to_api (image : CacheImage ) -> sccore .BNSharedCacheImage :
67+ region_start_array = (ctypes .POINTER (ctypes .c_ulonglong ) * len (image .region_starts ))()
68+ for i , region_start in enumerate (image .region_starts ):
69+ region_start_array [i ] = ctypes .c_ulonglong (region_start )
70+ return sccore .BNSharedCacheImage (
71+ _name = BNAllocString (image .name ),
72+ headerAddress = image .header_address ,
73+ regionStartCount = len (region_start_array ),
74+ regionStarts = region_start_array
75+ )
76+
5677class SharedCacheController :
57- def __init__ (self , view ):
78+ def __init__ (self , view : BinaryView ):
5879 self .handle = sccore .BNGetSharedCacheController (view .handle )
5980
81+ def load_region (self , view : BinaryView , region : CacheRegion ) -> bool :
82+ api_region : sccore .BNSharedCacheRegion = region_to_api (region )
83+ result = sccore .BNSharedCacheControllerLoadRegion (self .handle , view .handle , api_region )
84+ sccore .BNSharedCacheFreeRegion (api_region )
85+ return result
86+
87+ def load_image (self , view : BinaryView , image : CacheImage ) -> bool :
88+ api_image : sccore .BNSharedCacheImage = image_to_api (image )
89+ result = sccore .BNSharedCacheControllerLoadImage (self .handle , view .handle , api_image )
90+ sccore .BNSharedCacheFreeImage (api_image )
91+ return result
92+
6093 @property
61- def regions (self ):
94+ def regions (self ) -> [ CacheRegion ] :
6295 count = ctypes .c_ulonglong ()
63- value = sccore .BNGetSharedCacheRegions (self .handle , count )
96+ value = sccore .BNSharedCacheControllerGetRegions (self .handle , count )
6497 if value is None :
6598 return []
6699 result = []
@@ -69,15 +102,16 @@ def regions(self):
69102 sccore .BNSharedCacheFreeRegionList (value , count )
70103 return result
71104
72-
73105 @property
74- def images (self ):
106+ def images (self ) -> [ CacheImage ] :
75107 count = ctypes .c_ulonglong ()
76- value = sccore .BNGetSharedCacheImages (self .handle , count )
108+ value = sccore .BNSharedCacheControllerGetImages (self .handle , count )
77109 if value is None :
78110 return []
79111 result = []
80112 for i in range (count .value ):
81113 result .append (image_from_api (value [i ]))
82114 sccore .BNSharedCacheFreeImageList (value , count )
83- return result
115+ return result
116+
117+
0 commit comments