MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / ReadEntryInfo

Method ReadEntryInfo

view/sharedcache/core/SlideInfo.cpp:159–231  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

157}
158
159std::vector<SlideMappingInfo> SlideInfoProcessor::ReadEntryInfo(const MappedFileAccessor& accessor, const CacheEntry& entry) const
160{
161 const auto& baseHeader = entry.GetHeader();
162
163 // Handle legacy, single mapping slide info.
164 if (baseHeader.slideInfoOffsetUnused)
165 {
166 auto slideInfoAddress = baseHeader.slideInfoOffsetUnused;
167 auto slideInfoVersion = accessor.ReadUInt32(slideInfoAddress);
168 if (slideInfoVersion != 2 && slideInfoVersion != 3)
169 {
170 m_logger->LogError("Unsupported slide info version %d", slideInfoVersion);
171 return {};
172 }
173
174 SlideMappingInfo singleMapping = {};
175 singleMapping.address = slideInfoAddress;
176 singleMapping.slideInfoVersion = slideInfoVersion;
177
178 auto mappingAddress = baseHeader.mappingOffset + sizeof(dyld_cache_mapping_info);
179 accessor.Read(&singleMapping.mappingInfo, mappingAddress, sizeof(dyld_cache_mapping_info));
180 if (singleMapping.slideInfoVersion == 2)
181 accessor.Read(&singleMapping.slideInfoV2, slideInfoAddress, sizeof(dyld_cache_slide_info_v2));
182 else if (singleMapping.slideInfoVersion == 3)
183 accessor.Read(&singleMapping.slideInfoV3, slideInfoAddress, sizeof(dyld_cache_slide_info_v3));
184
185 return {singleMapping};
186 }
187
188 std::vector<SlideMappingInfo> mappings = {};
189 for (auto i = 0; i < baseHeader.mappingWithSlideCount; i++)
190 {
191 dyld_cache_mapping_and_slide_info mappingAndSlideInfo = {};
192 auto mappingAndSlideInfoAddress = baseHeader.mappingWithSlideOffset + (i * sizeof(dyld_cache_mapping_and_slide_info));
193 accessor.Read(&mappingAndSlideInfo, mappingAndSlideInfoAddress, sizeof(dyld_cache_mapping_and_slide_info));
194 if (mappingAndSlideInfo.size == 0 || mappingAndSlideInfo.slideInfoFileOffset == 0)
195 continue;
196
197 SlideMappingInfo map = {};
198 map.address = mappingAndSlideInfo.slideInfoFileOffset;
199 map.slideInfoVersion = accessor.ReadUInt32(map.address);
200 map.mappingInfo.address = mappingAndSlideInfo.address;
201 map.mappingInfo.size = mappingAndSlideInfo.size;
202 map.mappingInfo.fileOffset = mappingAndSlideInfo.fileOffset;
203 if (map.slideInfoVersion == 2)
204 {
205 accessor.Read(&map.slideInfoV2, map.address, sizeof(dyld_cache_slide_info_v2));
206 }
207 else if (map.slideInfoVersion == 3)
208 {
209 accessor.Read(&map.slideInfoV3, map.address, sizeof(dyld_cache_slide_info_v3));
210 map.slideInfoV3.auth_value_add = m_baseAddress;
211 }
212 else if (map.slideInfoVersion == 5)
213 {
214 accessor.Read(&map.slideInfoV5, map.address, sizeof(dyld_cache_slide_info_v5));
215 map.slideInfoV5.value_add = m_baseAddress;
216 }

Callers

nothing calls this directly

Calls 5

LogErrorMethod · 0.80
LogDebugMethod · 0.80
c_strMethod · 0.80
ReadUInt32Method · 0.45
ReadMethod · 0.45

Tested by

no test coverage detected