summaryrefslogtreecommitdiff
path: root/view/sharedcache/core
AgeCommit message (Collapse)Author
2024-12-10[SharedCache] Fix padding issue with v5 slide infoWeiN76LQh
The issue this commit fixes was causing `SharedCache::ParseAndApplySlideInfoForFile` to completely fail to work with v5 slide info, which had a lot of knock on effects, i.e. lots of Objective-C analysis was failing due to invalid pointers which hadn't been fixed up. `dyld_cache_slide_info5` has 4 bytes of padding before `value_add`. Whilst `value_add` is not actually being read from, `SharedCache::ParseAndApplySlideInfoForFile` will read at a location in the file based on the size of the structure `dyld_cache_slide_info5`. This being off by 4 bytes basically broke v5 slide info fixups. With this fix many more Objective-C functions have names and a lot more `msgSend` calls are fixed up.
2024-12-10Fix a compilation error on Windowskat
2024-12-10[SharedCache] Use basic copy-on-write for viewStateCacheMark Rowe
Copying the state from the cache into a new `SharedCache` object is done with a global lock held and is so expensive that it results in much of the shared cache analysis running on a single thread, with others blocked waiting to acquire the lock. The cache now holds a `std::shared_ptr` to the state. New `SharedCache` objects take a reference to the cached state and only create their own copy of it the first time they perform an operation that would mutate it. The cached copy is never mutated, only replaced, so there is no danger of modifying the state out from under a `SharedCache` object. Since the copy happens at first mutation, it is performed without any global locks held. This avoids blocking other threads. This cuts the initial load time of a macOS shared cache from 3 minutes to 70 seconds, and cuts the time taken to load and analyze AppKit from multiple hours to around 14 minutes.
2024-12-10[SharedCache] Preserve flags when splitting a memory regionMark Rowe
The flags field was being left uninitialized which could result in the region being mishandled during later analysis.
2024-12-10[SharedCache] Have VM track ranges rather than pagesMark Rowe
There are typically only a few dozen mappings, while there can be millions of pages. This reduces the amount of time spent populating the mapping from region to file accessor along with the memory usage of the same.
2024-12-10[SharedCache] Switch to SAX-based writer API for JSON serializationAuthor: Mark Rowe
2024-12-10[SharedCache] Rework metadata serialization to reduce memory overheadMark Rowe
api/MetadataSerializable.hpp is removed in favor of including core/MetadataSerializable.hpp. Both headers defined types with the same name leading to One Definition Rule violations and surprising behavior. The serialization and deserialization context are now created on-demand during serialization rather than being a member of `MetadataSerializable`. This reduces the size of every serializable object by ~220 bytes. The context is passed explicitly as an argument to `Serialize` / `Deserialize`. As a result, `Serialize` / `Deserialize` can now be free functions rather than member functions. Since `MetadataSerializable` is not used for dynamic dispatch, the virtual methods are removed and the class is updated to be a class template using CRTP. This allows delegating to the derived class's `Load` and `Store` methods without the additional size overhead of the vtable pointer in every serializable object. These changes reduce the memory footprint of Binary Ninja after loading the macOS shared cache and loading a single dylib from it from 8.3GB to 4.6GB.
2024-11-13[SharedCache] Fix a bndb deserialization error caused by last commitkat
2024-11-13Append export and symbol info to correct arraysMark Rowe
This is both a correctness fix and avoids leaking a massive amount of memory.
2024-11-13Don't leak DataBuffersMark Rowe
`MMappedFileAccessor::ReadBuffer` was returning a heap-allocated `DataBuffer`, but no callers were ever deleting it. There does not appear to be any reason to heap allocate the `DataBuffer` as the type is effectively a smart pointer wrapper around `BNDataBuffer`. Switch to returning it by value instead. Additionally, `MMappedFileAccessor::ReadBuffer` was allocating a buffer, copying data into it, and then handing that allocation to the `DataBuffer` constructor. The constructor copies data into a new allocation it owns so this allocation is unnecessary and was being leaked.
2024-11-06normalize Shared Cache nameJordan Wiens
2024-11-06[SharedCache] Fix bndb save/load within projectskat
2024-11-05[SharedCache] Fix .bndb save/load outside of projectskat
2024-11-05[SharedCache] very Hotfix for 'SharedCache.load_image_with_install_name'kat
2024-11-05[SharedCache] Barebones sanity check on ivar list sizekat
2024-11-05[SharedCache] Hotfix flags on dyldData sectionskat
2024-11-05[SharedCache] Changes to the alpha popup/info tabkat
2024-11-05[SharedCache] Add load option to disable automatic loading of libsystem_ckat
2024-11-05[SharedCache] Fix for section names in caches opened within a projectkat
2024-11-05[SharedCache] Add project support for split dscJosh Ferrell
2024-11-05[SharedCache] Implement LoadedImage API, Fix serialized image names, more ↵kat
robust system for out-of-date databases
2024-11-05[SharedCache] Fix a crash whenever user uses DSC apis on non-dsc.kat
2024-10-28[SharedCache] Warnings Cleanupkat
2024-10-28[SharedCache] Fix UI causing BV leakskat
2024-10-23Initial commit of the alpha dyld_shared_cache view API Plugin.kat
This is an early release of our DSC processing plugin. We're still hard at work improving this feature. You should be able to just drop in a dyld_shared_cache and use the 'Shared Cache Triage' view to load and analyze images.