Skip to content

Commit 08179e6

Browse files
committed
wip
1 parent 197c03f commit 08179e6

18 files changed

+765
-732
lines changed

view/sharedcache/api/sharedcache.cpp

Lines changed: 144 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -4,232 +4,205 @@
44

55
#include "sharedcacheapi.h"
66

7+
using namespace BinaryNinja;
78
using 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 &region)
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

Comments
 (0)