summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2019-06-13 03:55:00 -0400
committerBrian Potchik <brian@vector35.com>2019-06-13 03:55:00 -0400
commit977a0caa78e9a8ddb958baf535df881bbaaf05b4 (patch)
treee2d34525ef120ef9868d5e136b8423527c0c5bbd
parent2dab57d29589fcc9e3896102ba222c7d1d4671cb (diff)
Initial rebase on file load support.
-rw-r--r--binaryninjaapi.h9
-rw-r--r--binaryninjacore.h11
-rw-r--r--binaryview.cpp20
-rw-r--r--binaryviewtype.cpp18
-rw-r--r--examples/triage/files.cpp1
-rw-r--r--python/binaryview.py29
-rw-r--r--python/examples/triage/files.py1
-rw-r--r--python/settings.py9
-rw-r--r--settings.cpp10
-rw-r--r--ui/filecontext.h13
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);