diff options
| author | Brian Potchik <brian@vector35.com> | 2019-06-13 03:55:00 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2019-06-13 03:55:00 -0400 |
| commit | 977a0caa78e9a8ddb958baf535df881bbaaf05b4 (patch) | |
| tree | e2d34525ef120ef9868d5e136b8423527c0c5bbd | |
| parent | 2dab57d29589fcc9e3896102ba222c7d1d4671cb (diff) | |
Initial rebase on file load support.
| -rw-r--r-- | binaryninjaapi.h | 9 | ||||
| -rw-r--r-- | binaryninjacore.h | 11 | ||||
| -rw-r--r-- | binaryview.cpp | 20 | ||||
| -rw-r--r-- | binaryviewtype.cpp | 18 | ||||
| -rw-r--r-- | examples/triage/files.cpp | 1 | ||||
| -rw-r--r-- | python/binaryview.py | 29 | ||||
| -rw-r--r-- | python/examples/triage/files.py | 1 | ||||
| -rw-r--r-- | python/settings.py | 9 | ||||
| -rw-r--r-- | settings.cpp | 10 | ||||
| -rw-r--r-- | ui/filecontext.h | 13 |
10 files changed, 100 insertions, 21 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 21dd0b6c..53cacfa8 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1550,6 +1550,9 @@ namespace BinaryNinja std::vector<uint8_t> GetRawMetadata(const std::string& key); uint64_t GetUIntMetadata(const std::string& key); + std::string GetLoadSettings(std::string typeName); + void SetLoadSettings(std::string typeName, std::string loadSettings); + BNAnalysisParameters GetParametersForAnalysis(); void SetParametersForAnalysis(BNAnalysisParameters params); uint64_t GetMaxFunctionSizeForAnalysis(); @@ -1596,6 +1599,7 @@ namespace BinaryNinja static BNBinaryView* CreateCallback(void* ctxt, BNBinaryView* data); static bool IsValidCallback(void* ctxt, BNBinaryView* data); + static char* GetSettingsCallback(void* ctxt, BNBinaryView* data); BinaryViewType(BNBinaryViewType* type); @@ -1623,6 +1627,7 @@ namespace BinaryNinja virtual BinaryView* Create(BinaryView* data) = 0; virtual bool IsTypeValidForData(BinaryView* data) = 0; + virtual std::string GetLoadSettingsForData(BinaryView* data) = 0; }; class CoreBinaryViewType: public BinaryViewType @@ -1631,6 +1636,7 @@ namespace BinaryNinja CoreBinaryViewType(BNBinaryViewType* type); virtual BinaryView* Create(BinaryView* data) override; virtual bool IsTypeValidForData(BinaryView* data) override; + virtual std::string GetLoadSettingsForData(BinaryView* data) override; }; class ReadException: public std::exception @@ -4334,7 +4340,8 @@ namespace BinaryNinja bool UpdateProperty(const std::string& id, const std::string& property, const std::string& value); bool UpdateProperty(const std::string& id, const std::string& property, const std::vector<std::string>& value); - std::string GetSchema(); + bool DeserializeSchema(const std::string& schema); + std::string SerializeSchema(); bool DeserializeSettings(const std::string& contents, Ref<BinaryView> view = nullptr, BNSettingsScope scope = SettingsAutoScope); std::string SerializeSettings(Ref<BinaryView> view = nullptr, BNSettingsScope scope = SettingsAutoScope); diff --git a/binaryninjacore.h b/binaryninjacore.h index 95c70b4e..b24e675e 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1111,6 +1111,7 @@ extern "C" void* context; BNBinaryView* (*create)(void* ctxt, BNBinaryView* data); bool (*isValidForData)(void* ctxt, BNBinaryView* data); + char* (*getLoadSettingsForData)(void* ctxt, BNBinaryView* data); }; struct BNTransformParameterInfo @@ -2276,8 +2277,7 @@ extern "C" BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryDataViewFromFile(BNFileMetadata* file, BNFileAccessor* accessor); // Creation of new types of binary views - BINARYNINJACOREAPI BNBinaryView* BNCreateCustomBinaryView(const char* name, BNFileMetadata* file, - BNBinaryView* parent, BNCustomBinaryView* view); + BINARYNINJACOREAPI BNBinaryView* BNCreateCustomBinaryView(const char* name, BNFileMetadata* file, BNBinaryView* parent, BNCustomBinaryView* view); BINARYNINJACOREAPI BNBinaryViewType* BNGetBinaryViewTypeByName(const char* name); BINARYNINJACOREAPI BNBinaryViewType** BNGetBinaryViewTypes(size_t* count); @@ -2287,6 +2287,8 @@ extern "C" BINARYNINJACOREAPI char* BNGetBinaryViewTypeLongName(BNBinaryViewType* type); BINARYNINJACOREAPI BNBinaryView* BNCreateBinaryViewOfType(BNBinaryViewType* type, BNBinaryView* data); BINARYNINJACOREAPI bool BNIsBinaryViewTypeValidForData(BNBinaryViewType* type, BNBinaryView* data); + BINARYNINJACOREAPI char* BNGetBinaryViewDefaultLoadSettingsForData(BNBinaryViewType* type, BNBinaryView* data); + BINARYNINJACOREAPI char* BNGetBinaryViewLoadSettingsForData(BNBinaryViewType* type, BNBinaryView* data); BINARYNINJACOREAPI BNBinaryViewType* BNRegisterBinaryViewType(const char* name, const char* longName, BNCustomBinaryViewType* type); @@ -3802,7 +3804,8 @@ extern "C" BINARYNINJACOREAPI bool BNSettingsUpdateStringProperty(const char* registry, const char* id, const char* property, const char* value); BINARYNINJACOREAPI bool BNSettingsUpdateStringListProperty(const char* registry, const char* id, const char* property, const char** value, size_t size); - BINARYNINJACOREAPI char* BNSettingsGetSchema(const char* registry); + BINARYNINJACOREAPI bool BNSettingsDeserializeSchema(const char* registry, const char* schema); + BINARYNINJACOREAPI char* BNSettingsSerializeSchema(const char* registry); BINARYNINJACOREAPI bool BNDeserializeSettings(const char* registry, const char* contents, BNBinaryView* view, BNSettingsScope scope); BINARYNINJACOREAPI char* BNSerializeSettings(const char* registry, BNBinaryView* view, BNSettingsScope scope); @@ -3878,6 +3881,8 @@ extern "C" BINARYNINJACOREAPI BNMetadata* BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key); BINARYNINJACOREAPI void BNBinaryViewRemoveMetadata(BNBinaryView* view, const char* key); + BINARYNINJACOREAPI char* BNBinaryViewGetLoadSettings(BNBinaryView* view, const char* typeName); + BINARYNINJACOREAPI void BNBinaryViewSetLoadSettings(BNBinaryView* view, const char* typeName, const char* loadSettings); // Relocation object methods BINARYNINJACOREAPI BNRelocation* BNNewRelocationReference(BNRelocation* reloc); diff --git a/binaryview.cpp b/binaryview.cpp index 01640dcb..5811b953 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -2352,6 +2352,7 @@ void BinaryView::StoreMetadata(const std::string& key, Ref<Metadata> inValue) BNBinaryViewStoreMetadata(m_object, key.c_str(), inValue->GetObject()); } + Ref<Metadata> BinaryView::QueryMetadata(const std::string& key) { BNMetadata* value = BNBinaryViewQueryMetadata(m_object, key.c_str()); @@ -2360,11 +2361,13 @@ Ref<Metadata> BinaryView::QueryMetadata(const std::string& key) return new Metadata(value); } + void BinaryView::RemoveMetadata(const std::string& key) { BNBinaryViewRemoveMetadata(m_object, key.c_str()); } + string BinaryView::GetStringMetadata(const string& key) { auto data = QueryMetadata(key); @@ -2373,6 +2376,7 @@ string BinaryView::GetStringMetadata(const string& key) return data->GetString(); } + vector<uint8_t> BinaryView::GetRawMetadata(const string& key) { auto data = QueryMetadata(key); @@ -2381,6 +2385,7 @@ vector<uint8_t> BinaryView::GetRawMetadata(const string& key) return data->GetRaw(); } + uint64_t BinaryView::GetUIntMetadata(const string& key) { auto data = QueryMetadata(key); @@ -2390,6 +2395,21 @@ uint64_t BinaryView::GetUIntMetadata(const string& key) } +string BinaryView::GetLoadSettings(string typeName) +{ + char* name = BNBinaryViewGetLoadSettings(m_object, typeName.c_str()); + string result = name; + BNFreeString(name); + return result; +} + + +void BinaryView::SetLoadSettings(string typeName, string loadSettings) +{ + BNBinaryViewSetLoadSettings(m_object, typeName.c_str(), loadSettings.c_str()); +} + + BNAnalysisParameters BinaryView::GetParametersForAnalysis() { return BNGetParametersForAnalysis(m_object); diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp index b0addabe..815b508e 100644 --- a/binaryviewtype.cpp +++ b/binaryviewtype.cpp @@ -43,6 +43,14 @@ bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data) } +char* BinaryViewType::GetSettingsCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new BinaryView(BNNewViewReference(data)); + return BNAllocString(type->GetLoadSettingsForData(view).c_str()); +} + + BinaryViewType::BinaryViewType(BNBinaryViewType* type) { m_object = type; @@ -62,6 +70,7 @@ void BinaryViewType::Register(BinaryViewType* type) callbacks.context = type; callbacks.create = CreateCallback; callbacks.isValidForData = IsValidCallback; + callbacks.getLoadSettingsForData = GetSettingsCallback; type->AddRefForRegistration(); type->m_object = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(), @@ -209,3 +218,12 @@ bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data) { return BNIsBinaryViewTypeValidForData(m_object, data->GetObject()); } + + +string CoreBinaryViewType::GetLoadSettingsForData(BinaryView* data) +{ + char* settings = BNGetBinaryViewLoadSettingsForData(m_object, data->GetObject()); + string result = settings; + BNFreeString(settings); + return result; +} diff --git a/examples/triage/files.cpp b/examples/triage/files.cpp index 8ae97f33..7c0f7b9c 100644 --- a/examples/triage/files.cpp +++ b/examples/triage/files.cpp @@ -79,7 +79,6 @@ void TriageFilePicker::openSelectedFiles() continue; } - f->createBinaryViews(); for (auto data: f->getAllDataViews()) { BinaryNinja::Settings().Set("analysis.mode", BinaryNinja::Settings().Get<std::string>("triage.analysisMode"), data); diff --git a/python/binaryview.py b/python/binaryview.py index 460c028d..d68b8b24 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -663,6 +663,12 @@ class BinaryViewType(with_metaclass(_BinaryViewTypeMetaclass, object)): def is_valid_for_data(self, data): return core.BNIsBinaryViewTypeValidForData(self.handle, data.handle) + def get_default_load_settings_for_data(self, data): + return core.BNGetBinaryViewDefaultLoadSettingsForData(self.handle, data.handle) + + def get_load_settings_for_data(self, data): + return core.BNGetBinaryViewLoadSettingsForData(self.handle, data.handle) + def register_arch(self, ident, endian, arch): core.BNRegisterArchitectureForViewType(self.handle, ident, endian, arch.handle) @@ -1007,6 +1013,7 @@ class BinaryView(object): cls._registered_cb.context = 0 cls._registered_cb.create = cls._registered_cb.create.__class__(cls._create) cls._registered_cb.isValidForData = cls._registered_cb.isValidForData.__class__(cls._is_valid_for_data) + cls._registered_cb.getLoadSettingsForData = cls._registered_cb.getLoadSettingsForData.__class__(cls._get_load_settings_for_data) cls.registered_view_type = BinaryViewType(core.BNRegisterBinaryViewType(cls.name, cls.long_name, cls._registered_cb)) cls._registered = True @@ -1031,6 +1038,14 @@ class BinaryView(object): return False @classmethod + def _get_load_settings_for_data(cls, ctxt, data): + try: + return cls.get_load_settings_for_data(BinaryView(handle=core.BNNewViewReference(data))) + except: + log.log_error(traceback.format_exc()) + return None + + @classmethod def open(cls, src, file_metadata=None): binaryninja._init_plugins() if isinstance(src, fileaccessor.FileAccessor): @@ -2060,8 +2075,7 @@ class BinaryView(object): def perform_is_relocatable(self): """ - ``perform_is_relocatable`` implements a check which returns true if the BinaryView is relocatable. Defaults to - True. + ``perform_is_relocatable`` implements a check which returns true if the BinaryView is relocatable. Defaults to False .. note:: This method **may** be implemented for custom BinaryViews that are relocatable. @@ -2070,7 +2084,7 @@ class BinaryView(object): :return: True if the BinaryView is relocatable, False otherwise :rtype: boolean """ - return True + return False def create_database(self, filename, progress_func=None): """ @@ -4411,6 +4425,15 @@ class BinaryView(object): """ core.BNBinaryViewRemoveMetadata(self.handle, key) + def get_load_settings(self, type_name): + settings_id = core.BNBinaryViewGetLoadSettings(self.handle, type_name) + if settings_id == "": + return None + return settings_id + + def set_load_settings(self, type_name, load_settings): + core.BNBinaryViewSetLoadSettings(self.handle, type_name, load_settings) + def __setattr__(self, name, value): try: object.__setattr__(self, name, value) diff --git a/python/examples/triage/files.py b/python/examples/triage/files.py index 84273657..05281057 100644 --- a/python/examples/triage/files.py +++ b/python/examples/triage/files.py @@ -70,7 +70,6 @@ class TriageFilePicker(QWidget): failedToOpen.append(filename) continue - f.createBinaryViews() for data in f.getAllDataViews(): Settings().set_string("analysis.mode", Settings().get_string("triage.analysisMode"), data) Settings().set_bool("triage.preferSummaryView", True, data) diff --git a/python/settings.py b/python/settings.py index b16e9763..8bfe7255 100644 --- a/python/settings.py +++ b/python/settings.py @@ -81,10 +81,13 @@ class Settings(object): return out_list def update_property(self, id, setting_property): - return core.BNSettingsUpdateProperty(self._registry_id, tr(), id, setting_property) + return core.BNSettingsUpdateProperty(self.registry_id, id, setting_property) - def get_schema(self): - return core.BNSettingsGetSchema(self._registry_id) + def deserialize_schema(self, schema): + return core.BNSettingsDeserializeSchema(self.registry_id, schema) + + def serialize_schema(self): + return core.BNSettingsSerializeSchema(self.registry_id) def copy_value(self, dest_registry_id, id): return core.BNSettingsCopyValue(self._registry_id, dest_registry_id, id) diff --git a/settings.cpp b/settings.cpp index 1c7bc819..a4c1c29a 100644 --- a/settings.cpp +++ b/settings.cpp @@ -96,9 +96,15 @@ bool Settings::UpdateProperty(const std::string& id, const std::string& property } -string Settings::GetSchema() +bool Settings::DeserializeSchema(const string& schema) { - char* schemaStr = BNSettingsGetSchema(m_registry.c_str()); + return BNSettingsDeserializeSchema(m_registry.c_str(), schema.c_str()); +} + + +string Settings::SerializeSchema() +{ + char* schemaStr = BNSettingsSerializeSchema(m_registry.c_str()); string schema(schemaStr); BNFreeString(schemaStr); return schema; diff --git a/ui/filecontext.h b/ui/filecontext.h index bd11a4ff..007dcfc4 100644 --- a/ui/filecontext.h +++ b/ui/filecontext.h @@ -29,19 +29,18 @@ class BINARYNINJAUIAPI FileContext: public FileContextBase, public BinaryNinja:: std::map<QString, BinaryViewRef> m_dataViews; ViewFrame* m_currentViewFrame; - std::set<ViewFrame*> m_viewFrames; + std::set<QObject*> m_refs; static std::set<FileContext*> m_openFiles; - friend class ViewFrame; - void registerViewFrame(ViewFrame* frame); - void unregisterViewFrame(ViewFrame* frame); + void createBinaryViews(); public: - FileContext(FileMetadataRef file, BinaryViewRef rawData, - const QString& filename = QString(), bool isValidSaveName = false); + FileContext(FileMetadataRef file, BinaryViewRef rawData, const QString& filename = QString(), bool isValidSaveName = false, bool createViews = true); virtual ~FileContext(); + void registerReference(QWidget* widget); + void close(); static void closeAllOpenFiles(); @@ -54,6 +53,7 @@ public: bool isModified(); + BinaryViewRef createDataView(const QString& type); BinaryViewRef getDataView(const QString& type, bool createView = false); std::vector<BinaryViewRef> getAllDataViews(); @@ -63,7 +63,6 @@ public: virtual uint64_t GetCurrentOffset() override; virtual bool Navigate(const std::string& view, uint64_t offset) override; - void createBinaryViews(); QString getBestType(); std::vector<QString> getAvailableTypes(); bool isTypeAvailable(const QString& type); |
