44
55#include " sharedcacheapi.h"
66
7+ using namespace BinaryNinja ;
78using namespace SharedCacheAPI ;
89
9- SharedCache::SharedCache (BinaryNinja::Ref<BinaryNinja::BinaryView> view) {
10- m_object = BNGetSharedCache (view->GetObject ());
10+ BNSharedCacheImage ImageToApi (CacheImage image)
11+ {
12+ BNSharedCacheImage apiImage;
13+ apiImage.name = BNAllocString (image.name .c_str ());
14+ apiImage.headerAddress = image.headerAddress ;
15+ apiImage.regionStartCount = image.regionStarts .size ();
16+ // TODO: If we alloc then core cannot delete
17+ uint64_t * regionStarts = new uint64_t [image.regionStarts .size ()];
18+ for (size_t i = 0 ; i < image.regionStarts .size (); i++)
19+ regionStarts[i] = image.regionStarts [i];
20+ apiImage.regionStarts = regionStarts;
21+ return apiImage;
1122}
1223
13- BNDSCViewLoadProgress SharedCache::GetLoadProgress (BinaryNinja::Ref<BinaryNinja::BinaryView> view )
24+ CacheImage ImageFromApi (BNSharedCacheImage image )
1425{
15- return BNDSCViewGetLoadProgress (view->GetFile ()->GetSessionId ());
26+ CacheImage apiImage;
27+ apiImage.name = image.name ;
28+ apiImage.headerAddress = image.headerAddress ;
29+ apiImage.regionStarts .reserve (image.regionStartCount );
30+ for (size_t i = 0 ; i < image.regionStartCount ; i++)
31+ apiImage.regionStarts .push_back (image.regionStarts [i]);
32+ return apiImage;
1633}
1734
18- uint64_t SharedCache::FastGetBackingCacheCount (BinaryNinja::Ref<BinaryNinja::BinaryView> view )
35+ BNSharedCacheRegion RegionToApi ( const CacheRegion& region )
1936{
20- return BNDSCViewFastGetBackingCacheCount (view->GetObject ());
37+ BNSharedCacheRegion apiRegion;
38+ apiRegion.vmAddress = region.start ;
39+ apiRegion.name = BNAllocString (region.name .c_str ());
40+ apiRegion.size = region.size ;
41+ apiRegion.flags = region.flags ;
42+ apiRegion.regionType = region.type ;
43+ // If not associated with image this will be zeroed.
44+ apiRegion.imageStart = region.imageStart .value_or (0 );
45+ return apiRegion;
2146}
2247
23- bool SharedCache::LoadImageWithInstallName (std::string installName, bool skipObjC )
48+ CacheRegion RegionFromApi (BNSharedCacheRegion apiRegion )
2449{
25- char * str = BNAllocString (installName.c_str ());
26- return BNDSCViewLoadImageWithInstallName (m_object, str, skipObjC);
50+ CacheRegion region;
51+ region.start = apiRegion.vmAddress ;
52+ region.name = apiRegion.name ;
53+ region.size = apiRegion.size ;
54+ region.flags = apiRegion.flags ;
55+ region.type = apiRegion.regionType ;
56+ return region;
2757}
2858
29- bool SharedCache::LoadSectionAtAddress ( uint64_t addr )
59+ BNSharedCacheMappingInfo MappingToApi ( const CacheMappingInfo& mapping )
3060{
31- return BNDSCViewLoadSectionAtAddress (m_object, addr);
61+ BNSharedCacheMappingInfo apiMapping;
62+ apiMapping.vmAddress = mapping.vmAddress ;
63+ apiMapping.size = mapping.size ;
64+ apiMapping.fileOffset = mapping.fileOffset ;
65+ return apiMapping;
3266}
3367
34- bool SharedCache::LoadImageContainingAddress ( uint64_t addr, bool skipObjC )
68+ CacheMappingInfo MappingFromApi (BNSharedCacheMappingInfo apiMapping )
3569{
36- return BNDSCViewLoadImageContainingAddress (m_object, addr, skipObjC);
70+ CacheMappingInfo mapping;
71+ mapping.vmAddress = apiMapping.vmAddress ;
72+ mapping.size = apiMapping.size ;
73+ mapping.fileOffset = apiMapping.fileOffset ;
74+ return mapping;
3775}
3876
39- std::vector<std::string> SharedCache::GetAvailableImages ( )
77+ BNSharedCacheEntry EntryToApi ( const CacheEntry& entry )
4078{
41- size_t count;
42- char ** value = BNDSCViewGetInstallNames (m_object, &count);
43- if (value == nullptr )
44- {
45- return {};
46- }
47-
48- std::vector<std::string> result;
49- for (size_t i = 0 ; i < count; i++)
50- {
51- result.push_back (value[i]);
52- }
53-
54- BNFreeStringList (value, count);
55- return result;
79+ BNSharedCacheEntry apiEntry;
80+ apiEntry.path = BNAllocString (entry.path .c_str ());
81+ apiEntry.entryType = entry.entryType ;
82+ const auto & mappings = entry.mappings ;
83+ apiEntry.mappingCount = mappings.size ();
84+ // TODO: If we alloc then the core cannot delete.
85+ apiEntry.mappings = new BNSharedCacheMappingInfo[mappings.size ()];
86+ for (size_t i = 0 ; i < mappings.size (); i++)
87+ apiEntry.mappings [i] = MappingToApi (mappings[i]);
88+ return apiEntry;
5689}
5790
58- void SharedCache::ProcessObjCSectionsForImageWithInstallName ( const std::string& installName )
91+ CacheEntry EntryFromApi (BNSharedCacheEntry apiEntry )
5992{
60- BNDSCViewProcessObjCSectionsForImageWithInstallName (m_object, installName.c_str ());
93+ CacheEntry entry;
94+ entry.path = apiEntry.path ;
95+ entry.entryType = apiEntry.entryType ;
96+ entry.mappings .reserve (apiEntry.mappingCount );
97+ for (size_t i = 0 ; i < apiEntry.mappingCount ; i++)
98+ entry.mappings .push_back (MappingFromApi (apiEntry.mappings [i]));
99+ return entry;
61100}
62101
63- void SharedCache::ProcessAllObjCSections ()
102+
103+ SharedCacheController::SharedCacheController (BNSharedCacheController *controller)
64104{
65- BNDSCViewProcessAllObjCSections ( m_object) ;
105+ m_object = controller ;
66106}
67107
68- std::vector<DSCMemoryRegion> SharedCache::GetLoadedMemoryRegions ( )
108+ DSCRef<SharedCacheController> SharedCacheController::GetController (Ref<BinaryView> view )
69109{
70- size_t count;
71- BNDSCMappedMemoryRegion* value = BNDSCViewGetLoadedRegions (m_object, &count);
72- if (value == nullptr )
73- {
74- return {};
75- }
110+ if (!view)
111+ return nullptr ;
76112
77- std::vector<DSCMemoryRegion> result;
78- for (size_t i = 0 ; i < count; i++)
79- {
80- DSCMemoryRegion region;
81- region.vmAddress = value[i].vmAddress ;
82- region.size = value[i].size ;
83- region.prettyName = value[i].name ;
84- result.push_back (region);
85- }
86-
87- BNDSCViewFreeLoadedRegions (value, count);
88- return result;
113+ BNSharedCacheController* controller = BNGetSharedCacheController (view->GetObject ());
114+ if (!controller)
115+ return nullptr ;
116+
117+ return new SharedCacheController (controller);
89118}
90- std::vector<BackingCache> SharedCache::GetBackingCaches ()
91- {
92- size_t count;
93- BNDSCBackingCache* value = BNDSCViewGetBackingCaches (m_object, &count);
94- if (value == nullptr )
95- {
96- return {};
97- }
98119
99- std::vector<BackingCache> result;
100- for (size_t i = 0 ; i < count; i++)
101- {
102- BackingCache cache;
103- cache.path = value[i].path ;
104- cache.cacheType = value[i].cacheType ;
105- for (size_t j = 0 ; j < value[i].mappingCount ; j++)
106- {
107- BackingCacheMapping mapping;
108- mapping.vmAddress = value[i].mappings [j].vmAddress ;
109- mapping.size = value[i].mappings [j].size ;
110- mapping.fileOffset = value[i].mappings [j].fileOffset ;
111- cache.mappings .push_back (mapping);
112- }
113- result.push_back (cache);
114- }
115-
116- BNDSCViewFreeBackingCaches (value, count);
120+ bool SharedCacheController::LoadRegion (BinaryView &view, const CacheRegion ®ion)
121+ {
122+ auto apiRegion = RegionToApi (region);
123+ bool result = BNSharedCacheControllerLoadRegion (m_object, view.GetObject (), &apiRegion);
124+ BNSharedCacheFreeRegion (apiRegion);
117125 return result;
118126}
119127
120- std::vector<DSCImage> SharedCache::GetImages ( )
128+ bool SharedCacheController::LoadImage (BinaryView &view, const CacheImage &image )
121129{
122- size_t count;
123- BNDSCImage* value = BNDSCViewGetAllImages (m_object, &count);
124- if (value == nullptr )
125- {
126- return {};
127- }
128-
129- std::vector<DSCImage> result;
130- for (size_t i = 0 ; i < count; i++)
131- {
132- DSCImage img;
133- img.name = value[i].name ;
134- img.headerAddress = value[i].headerAddress ;
135- for (size_t j = 0 ; j < value[i].mappingCount ; j++)
136- {
137- DSCImageMemoryMapping mapping;
138- mapping.filePath = value[i].mappings [j].filePath ;
139- mapping.name = value[i].mappings [j].name ;
140- mapping.vmAddress = value[i].mappings [j].vmAddress ;
141- mapping.rawViewOffset = value[i].mappings [j].rawViewOffset ;
142- mapping.size = value[i].mappings [j].size ;
143- mapping.loaded = value[i].mappings [j].loaded ;
144- img.mappings .push_back (mapping);
145- }
146- result.push_back (img);
147- }
148-
149- BNDSCViewFreeAllImages (value, count);
130+ auto apiImage = ImageToApi (image);
131+ bool result = BNSharedCacheControllerLoadImage (m_object, view.GetObject (), &apiImage);
132+ BNSharedCacheFreeImage (apiImage);
150133 return result;
151134}
152135
153- std::vector<DSCSymbol> SharedCache::LoadAllSymbolsAndWait ()
136+ std::optional<CacheRegion> SharedCacheController::GetRegionAt ( uint64_t address) const
154137{
155- size_t count;
156- BNDSCSymbolRep* value = BNDSCViewLoadAllSymbolsAndWait (m_object, &count);
157- if (value == nullptr )
158- {
159- return {};
160- }
161-
162- std::vector<DSCSymbol> result;
163- result.reserve (count);
164- for (size_t i = 0 ; i < count; i++)
165- {
166- DSCSymbol sym;
167- sym.address = value[i].address ;
168- sym.name = StringRef (BNDuplicateStringRef (value[i].name ));
169- sym.image = value[i].image ;
170- result.push_back (sym);
171- }
172-
173- BNDSCViewFreeSymbols (value, count);
174- return result;
138+ BNSharedCacheRegion apiRegion;
139+ if (!BNSharedCacheControllerGetRegionAt (m_object, address, &apiRegion))
140+ return std::nullopt ;
141+ CacheRegion region = RegionFromApi (apiRegion);
142+ BNSharedCacheFreeRegion (apiRegion);
143+ return region;
175144}
176145
177- std::string SharedCache::GetNameForAddress (uint64_t address)
146+ std::optional<CacheRegion> SharedCacheController::GetRegionContaining (uint64_t address) const
178147{
179- char * name = BNDSCViewGetNameForAddress (m_object, address) ;
180- if (name == nullptr )
181- return {} ;
182- std::string result = name ;
183- BNFreeString (name );
184- return result ;
148+ BNSharedCacheRegion apiRegion ;
149+ if (! BNSharedCacheControllerGetRegionContaining (m_object, address, &apiRegion) )
150+ return std:: nullopt ;
151+ CacheRegion region = RegionFromApi (apiRegion) ;
152+ BNSharedCacheFreeRegion (apiRegion );
153+ return region ;
185154}
186155
187- std::string SharedCache::GetImageNameForAddress (uint64_t address)
156+ std::optional<CacheImage> SharedCacheController::GetImageAt (uint64_t address) const
188157{
189- char * name = BNDSCViewGetImageNameForAddress (m_object, address) ;
190- if (name == nullptr )
191- return {} ;
192- std::string result = name ;
193- BNFreeString (name );
194- return result ;
158+ BNSharedCacheImage apiImage ;
159+ if (! BNSharedCacheControllerGetImageAt (m_object, address, &apiImage) )
160+ return std:: nullopt ;
161+ CacheImage image = ImageFromApi (apiImage) ;
162+ BNSharedCacheFreeImage (apiImage );
163+ return image ;
195164}
196165
197- std::optional<DSCMachOHeader> SharedCache::GetMachOHeaderForImage (std::string name)
166+ std::optional<CacheImage> SharedCacheController::GetImageContaining ( uint64_t address) const
198167{
199- // TODO: This lmfao
200- // char* str = BNAllocString(name.c_str());
201- // char* outputStr = BNDSCViewGetImageHeaderForName(m_object, str);
202- // if (outputStr == nullptr)
203- // return {};
204- // std::string output = outputStr;
205- // BNFreeString(outputStr);
206- // if (output.empty())
207- // return {};
208- //
209- // return SharedCacheMachOHeader::LoadFromString(output);
210- return std::nullopt ;
168+ BNSharedCacheImage apiImage;
169+ if (!BNSharedCacheControllerGetImageContaining (m_object, address, &apiImage))
170+ return std::nullopt ;
171+ CacheImage image = ImageFromApi (apiImage);
172+ BNSharedCacheFreeImage (apiImage);
173+ return image;
211174}
212175
213- std::optional<DSCMachOHeader> SharedCache::GetMachOHeaderForAddress ( uint64_t address)
176+ std::optional<CacheImage> SharedCacheController::GetImageWithName ( const std::string &name) const
214177{
215- // TODO: This lmfao
216- // char* outputStr = BNDSCViewGetImageHeaderForAddress(m_object, address);
217- // if (outputStr == nullptr)
218- // return {};
219- // std::string output = outputStr;
220- // BNFreeString(outputStr);
221- // if (output.empty())
222- // return {};
223- // return SharedCacheMachOHeader::LoadFromString(output);
224- return std::nullopt ;
178+ BNSharedCacheImage apiImage;
179+ if (!BNSharedCacheControllerGetImageWithName (m_object, name.c_str (), &apiImage))
180+ return std::nullopt ;
181+ CacheImage image = ImageFromApi (apiImage);
182+ BNSharedCacheFreeImage (apiImage);
183+ return image;
225184}
226185
227- BNDSCViewState SharedCache::GetState ()
186+ std::vector<CacheEntry> SharedCacheController::GetEntries () const
228187{
229- return BNDSCViewGetState (m_object);
188+ size_t count;
189+ BNSharedCacheEntry* entries = BNSharedCacheControllerGetEntries (m_object, &count);
190+ std::vector<CacheEntry> result;
191+ result.reserve (count);
192+ for (size_t i = 0 ; i < count; i++)
193+ result.emplace_back (EntryFromApi (entries[i]));
194+ BNSharedCacheFreeEntryList (entries, count);
195+ return result;
230196}
231197
232- void SharedCache::FindSymbolAtAddrAndApplyToAddr ( uint64_t symbolLocation, uint64_t targetLocation, bool triggerReanalysis ) const
198+ std::vector<CacheImage> SharedCacheController::GetImages ( ) const
233199{
234- BNDSCFindSymbolAtAddressAndApplyToAddress (m_object, symbolLocation, targetLocation, triggerReanalysis);
235- }
200+ size_t count;
201+ BNSharedCacheImage* images = BNSharedCacheControllerGetImages (m_object, &count);
202+ std::vector<CacheImage> result;
203+ result.reserve (count);
204+ for (size_t i = 0 ; i < count; i++)
205+ result.emplace_back (ImageFromApi (images[i]));
206+ BNSharedCacheFreeImageList (images, count);
207+ return result;
208+ }
0 commit comments