summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2022-01-12 17:34:10 -0700
committerRusty Wagner <rusty.wagner@gmail.com>2022-01-17 17:58:50 -0500
commit32ee51a0ac631a7ce004e1d2d9b2f7ea291fd252 (patch)
tree117d10f1de01f22e884ab217c3a766a599281eb9
parent9c7ed0cc4ebe08871a7b83e0f56a542c0f31f835 (diff)
Single function mode in linear view
-rw-r--r--binaryninjaapi.h13
-rw-r--r--binaryninjacore.h24
-rw-r--r--linearviewobject.cpp84
-rw-r--r--python/lineardisassembly.py84
-rw-r--r--ui/linearview.h16
5 files changed, 220 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 2203c803..62d5d839 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -6081,6 +6081,19 @@ __attribute__ ((format (printf, 1, 2)))
static Ref<LinearViewObject> CreateHighLevelIL(BinaryView* view, DisassemblySettings* settings);
static Ref<LinearViewObject> CreateHighLevelILSSAForm(BinaryView* view, DisassemblySettings* settings);
static Ref<LinearViewObject> CreateLanguageRepresentation(BinaryView* view, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateDataOnly(BinaryView* view, DisassemblySettings* settings);
+
+ static Ref<LinearViewObject> CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings);
+ static Ref<LinearViewObject> CreateSingleFunctionLanguageRepresentation(Function* func, DisassemblySettings* settings);
};
class LinearViewCursor: public CoreRefCountObject<BNLinearViewCursor,
diff --git a/binaryninjacore.h b/binaryninjacore.h
index fca627c3..c45729a0 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -3837,6 +3837,30 @@ __attribute__ ((format (printf, 1, 2)))
BNDisassemblySettings* settings);
BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewLanguageRepresentation(BNBinaryView* view,
BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewDataOnly(BNBinaryView* view,
+ BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionDisassembly(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLiftedIL(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLowLevelIL(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLowLevelILSSAForm(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMediumLevelIL(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMappedMediumLevelIL(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionHighLevelIL(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionHighLevelILSSAForm(
+ BNFunction* func, BNDisassemblySettings* settings);
+ BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLanguageRepresentation(
+ BNFunction* func, BNDisassemblySettings* settings);
BINARYNINJACOREAPI BNLinearViewObject* BNNewLinearViewObjectReference(BNLinearViewObject* obj);
BINARYNINJACOREAPI void BNFreeLinearViewObject(BNLinearViewObject* obj);
BINARYNINJACOREAPI BNLinearViewObject* BNGetFirstLinearViewObjectChild(BNLinearViewObject* obj);
diff --git a/linearviewobject.cpp b/linearviewobject.cpp
index 17229836..17df452b 100644
--- a/linearviewobject.cpp
+++ b/linearviewobject.cpp
@@ -283,3 +283,87 @@ Ref<LinearViewObject> LinearViewObject::CreateLanguageRepresentation(BinaryView*
return new LinearViewObject(BNCreateLinearViewLanguageRepresentation(view->GetObject(),
settings ? settings->GetObject() : nullptr));
}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateDataOnly(BinaryView* view, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewDataOnly(view->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionDisassembly(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionLiftedIL(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelIL(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelILSSAForm(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelIL(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelIL(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelIL(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelILSSAForm(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
+
+
+Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLanguageRepresentation(Function* func, DisassemblySettings* settings)
+{
+ return new LinearViewObject(BNCreateLinearViewSingleFunctionLanguageRepresentation(func->GetObject(),
+ settings ? settings->GetObject() : nullptr));
+}
diff --git a/python/lineardisassembly.py b/python/lineardisassembly.py
index c295841e..9c3040c9 100644
--- a/python/lineardisassembly.py
+++ b/python/lineardisassembly.py
@@ -348,6 +348,90 @@ class LinearViewObject:
_settings = _settings.handle
return LinearViewObject(core.BNCreateLinearViewLanguageRepresentation(view.handle, _settings))
+ @staticmethod
+ def data_only(view:'binaryview.BinaryView', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewDataOnly(view.handle, _settings))
+
+ @staticmethod
+ def single_function_disassembly(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionDisassembly(func.handle, _settings))
+
+ @staticmethod
+ def single_function_lifted_il(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionLiftedIL(func.handle, _settings))
+
+ @staticmethod
+ def single_function_llil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionLowLevelIL(func.handle, _settings))
+
+ @staticmethod
+ def single_function_llil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionLowLevelILSSAForm(func.handle, _settings))
+
+ @staticmethod
+ def single_function_mlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionMediumLevelIL(func.handle, _settings))
+
+ @staticmethod
+ def single_function_mlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(func.handle, _settings))
+
+ @staticmethod
+ def single_function_mmlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionMappedMediumLevelIL(func.handle, _settings))
+
+ @staticmethod
+ def single_function_mmlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(func.handle, _settings))
+
+ @staticmethod
+ def single_function_hlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionHighLevelIL(func.handle, _settings))
+
+ @staticmethod
+ def single_function_hlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionHighLevelILSSAForm(func.handle, _settings))
+
+ @staticmethod
+ def single_function_language_representation(view:'binaryview.BinaryView', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject':
+ _settings = settings
+ if _settings is not None:
+ _settings = _settings.handle
+ return LinearViewObject(core.BNCreateLinearViewSingleFunctionLanguageRepresentation(view.handle, _settings))
+
class LinearViewCursor:
def __init__(self, root_object, handle = None):
if handle is not None:
diff --git a/ui/linearview.h b/ui/linearview.h
index 6a319443..f8feb3d7 100644
--- a/ui/linearview.h
+++ b/ui/linearview.h
@@ -161,6 +161,7 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ
DisassemblySettingsRef m_options;
BNFunctionGraphType m_ilViewType;
HexEditorHighlightState m_highlightState;
+ bool m_singleFunctionView = false;
InstructionEdit* m_instrEdit;
@@ -169,6 +170,7 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ
BinaryNinja::Ref<BinaryNinja::LinearViewCursor> m_topPosition, m_bottomPosition;
std::vector<LinearViewLine> m_lines;
size_t m_topLine;
+ std::optional<double> m_topOrderingIndexOffset;
QTimer* m_updateTimer;
QTimer* m_hoverTimer;
@@ -181,16 +183,23 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ
std::string m_navigationMode = "";
+ ClickableIcon* m_dataButton = nullptr;
+ QWidget* m_dataButtonContainer = nullptr;
+ QHBoxLayout* m_dataButtonLayout = nullptr;
+
void setTopToAddress(uint64_t addr);
void setTopToOrderingIndex(uint64_t idx);
void refreshLines(size_t lineOffset = 0, bool refreshUIContext = true);
bool cachePreviousLines();
bool cacheNextLines();
void updateCache();
+ void updateBounds();
void refreshAtCurrentLocation(bool cursorFixup = false);
bool navigateToAddress(uint64_t addr, bool center, bool updateHighlight, bool navByRef = false);
- bool navigateToLine(uint64_t offset, size_t instrIndex, bool center, bool updateHighlight, bool navByRef = false);
+ bool navigateToLine(FunctionRef func, uint64_t offset, size_t instrIndex, bool center,
+ bool updateHighlight, bool navByRef = false);
bool navigateToGotoLabel(uint64_t label);
+ void viewData();
void scrollLines(int count);
@@ -243,6 +252,8 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ
BNDeadStoreElimination getCurrentVariableDeadStoreElimination();
+ void setDataButtonVisible(bool visible);
+
private Q_SLOTS:
void adjustSize(int width, int height);
void viewInHexEditor();
@@ -405,6 +416,9 @@ public:
virtual void setRelatedIndexHighlights(FunctionRef func, const std::set<size_t>& related) override;
virtual void setRelatedInstructionHighlights(FunctionRef func, const std::set<uint64_t>& related) override;
+ bool singleFunctionView() const { return m_singleFunctionView; }
+ void setSingleFunctionView(bool singleFunctionView);
+
static void registerActions();
protected: